[프로젝트] 도서 정보 관리 시스템 만들기

밤새·2023년 9월 27일
0

Project

목록 보기
2/3
post-thumbnail

<도서 정보 관리 시스템>

도서 정보 관리 시스템을 MVC (Model-View-Controller) 모델을 사용하여 구현해보도록 하겠습니다!

M (Model) - DataModel

  • DataModel 부분은 데이터의 모델링과 관리를 담당합니다. 여기에서는 도서 정보를 다루는 데 필요한 데이터 구조 및 기능을 정의합니다.
  • 데이터 모델은 BookVOBookDAO로 구성됩니다.
  • BookVO 클래스는 개별 도서 정보를 저장하기 위한 데이터 객체입니다. 이 객체는 도서번호 (ISBN), 책 이름, 저자명, 출판사, 가격, 카테고리 등 6개의 필드를 가지고 있습니다.
  • BookDAO 클래스는 도서 데이터를 실제로 관리하고 데이터베이스와의 상호 작용을 처리합니다. 이 클래스는 도서 정보를 저장, 검색, 수정 및 삭제하는 기능을 제공합니다.

V (View) - View

  • View 부분은 사용자 인터페이스를 담당합니다. 여기에서는 도서 정보를 사용자에게 보여주는 역할을 합니다.
  • BookView 클래스는 도서 정보를 콘솔 창에 출력하고 사용자로부터 도서 정보를 입력받는 인터페이스를 제공합니다.

C (Controller) - Controller

  • Controller 부분은 데이터 모델과 뷰 간의 상호 작용을 조정하고 제어합니다. 사용자 입력을 처리하고 해당 입력에 따라 데이터 모델을 조작하여 적절한 결과를 뷰에 표시합니다.
  • BookController 클래스는 사용자로부터의 입력을 처리하고, 이를 기반으로 BookVO 객체를 생성하거나 BookDAO를 통해 데이터를 관리합니다.

종합하면, 사용자는 콘솔을 통해 도서 정보를 입력하고 이 정보는 BookVO 객체로 저장되며, BookDAO를 통해 관리됩니다. 이 정보는 BookView를 통해 사용자에게 보여지고, BookController는 사용자의 입력을 처리하여 데이터 모델을 조작하고 뷰를 갱신합니다. 이러한 방식으로 MVC 모델을 통해 도서 정보 관리 시스템이 구현됩니다.

✨ 로직소스 구현하기

BookVO

package info.vo;

public class BookVO {
	private int isbn;        //도서번호
	private String bookName; //책이름
	private String author;   //저자명
	private String publish;  //출판사
	private double price;    //가격
	private String category; //카테로기
	
	//생성자 : 필드값 초기화
	public BookVO() {
		
	}
	public BookVO(int isbn, String bookName, String author, String publish, double price, String category) {
		super();
		this.isbn = isbn;
		this.bookName = bookName;
		this.author = author;
		this.publish = publish;
		this.price = price;
		this.category = category;
	}
	
	public int getIsbn() {
		return isbn;
	}
	public void setIsbn(int isbn) {
		this.isbn = isbn;
	}
	public String getbookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getPublish() {
		return publish;
	}
	public void setPublish(String publish) {
		this.publish = publish;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getCategory() {
		return category;
	}
	public void setCategory(String category) {
		this.category = category;
	}
	
	@Override
	public String toString() {
		return "BookVO [isbn=" + isbn + ", bookName=" + bookName + ", author=" + author + ", publish=" + publish
				+ ", price=" + price + ", category=" + category + "]";
	}
	
	
}

BookDAO


package info.vo;

import java.util.ArrayList;

public class BookDAO {
	//ArrayList 만들기
	ArrayList<BookVO> bookList = new ArrayList();
	
	//insert : ArrayList에 학생정보객체를 추가하는 메소드
	public void insert(BookVO book) {
		bookList.add(book);
	}
	
	//select : 전체 책 정보를 반환해주기
	public  ArrayList<BookVO> select() {
		return bookList;
		
	}
}

BookController

package info.controller;

import java.util.ArrayList;
import java.util.Scanner;

import info.view.BookView;
import info.vo.BookDAO;
import info.vo.BookVO;

public class BookController {
	public static final int CONTINUE = 1;
	public static final int BREAK = 0;

	// ArrayList 에 추가하기
	ArrayList<Integer> isbns = new ArrayList<Integer>();
	ArrayList<String> bookNames = new ArrayList<String>();
	ArrayList<String> authors = new ArrayList<String>();
	ArrayList<String> publishes = new ArrayList<String>();
	ArrayList<Double> prices = new ArrayList<Double>();
	ArrayList<String> categories = new ArrayList<String>();

	public void consoleToList() {
		Scanner s1 = new Scanner(System.in); // 문자용 입력
		Scanner s2 = new Scanner(System.in); // 숫자용 입력

		int flag = CONTINUE;
		System.out.println("********** 도서 정보 입력 **********");
		while (true) {
			if (flag == CONTINUE) {
				System.out.print("==도서 번호 입력 : ");
				isbns.add(s2.nextInt());
				System.out.print("==책 이름 입력 : ");
				bookNames.add(s1.nextLine());
				System.out.print("==저자 입력 : ");
				authors.add(s1.nextLine());
				System.out.print("==출판사 입력 : ");
				publishes.add(s1.nextLine());
				System.out.print("==가격 입력 : ");
				prices.add(s2.nextDouble());
				System.out.print("==카테고리 입력 : ");
				categories.add(s1.nextLine());
				System.out.println(" ");
			} else if (flag == BREAK) {
				break;
			} else {
				System.out.println("다시 입력해주세요 : ");
				flag = s2.nextInt();
			}
			System.out.println("도서 정보를 더 입력하실건가요? (계속 : 1, 중지 : 0) : ");
			flag = s2.nextInt();
		}
		s1.close();
		s2.close();
	}

	public void voToDAO(BookDAO dao) {
		for (int i = 0; i < isbns.size(); i++) {
			BookVO book = new BookVO(isbns.get(i), bookNames.get(i), authors.get(i), publishes.get(i), prices.get(i),
					categories.get(i));
			dao.insert(book);
		}
	}

	public static void main(String args[]) {
		BookController controller = new BookController();
		// controller에 consoleToList에 입력받은 값들을 넣기
		controller.consoleToList();
		BookDAO dao = new BookDAO();
		controller.voToDAO(dao);
		// 화면에 출력
		BookView bView = new BookView();
		bView.view(dao.select());
	}
}

BookView

package info.view;

import java.util.ArrayList;

import info.vo.BookVO;

public class BookView {

	public void view(ArrayList<BookVO> bookList) {
		for(BookVO book : bookList) {
			System.out.println("======================================================================================");
			System.out.print("도서 번호 : " + book.getIsbn() + "\t");
			System.out.print("책 이름 : " + book.getbookName() + "\t");
			System.out.print("저자명 : " + book.getAuthor() + "\t");
			System.out.print("출판사 : " + book.getPublish() + "\t");
			System.out.print("가격 : " + book.getPrice() +"원" + "\t");
			System.out.print("카테고리 : " + book.getCategory() + "\n");
			System.out.println("--------------------------------------------------------------------------------------");
		}
	}

}

이렇게 까지 입력하면

💻 결과

도서 정보 입력

입력한 도서 출력

✨ GUI로 도서 정보 관리 시스템 만들기

gui로 만들어주기 위해 아래와 같은 컴포넌트를 이용할 것 입니다.

  • JFrame (프레임):

    • 레이아웃: BorderLayout
    • 다섯 개의 구역: North, South, East, West, Center
    • 창 역할
  • JPanel (패널):

    • 레이아웃: FlowLayout (자연스럽게 흐르는 배치)
    • 추가 역할을 하는 패널
  • javax.swing.JTable (표):

    • 행과 열로 데이터 출력
    • 도서 정보를 표시할 목록
  • javax.swing.JTextField (텍스트 입력 필드):

    • 값을 입력하는 데 사용
    • 도서번호, 도서명, 출판사, 저자명, 도서 가격 입력 필드
  • javax.swing.JComboBox (콤보 박스):

    • 선택할 수 있는 도서 카테고리 목록
  • Empty String (빈 문자열):

    • 빈 문자열을 나타냅니다. 필드 초기화나 값 없음을 나타내는 데 사용될 수 있습니다.
  • 도서추가 버튼:

    • 도서 정보를 입력한 후 도서를 추가하는 버튼

이렇게 구성된 GUI는 사용자가 도서 정보를 입력하고 표로 표시할 수 있으며, 도서 추가 버튼을 통해 도서를 목록에 추가할 수 있는 기능을 제공합니다.FlowLayout 레이아웃은 컴포넌트를 왼쪽에서 오른쪽으로 배치하여 자연스러운 흐름을 가지게 합니다.

BookController2

package info.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;

import info.view.BookView2;
import info.vo.BookDAO;
import info.vo.BookVO;

public class BookController2 extends JFrame {
	
	BookDAO dao;
	ArrayList<BookVO> bookVOLIst;
	BookView2 view2;

	public BookController2() {
		dao = new BookDAO();
		view2 = new BookView2();
		bookVOLIst = dao.select();
		view2.setBookVOList(bookVOLIst);
		view2.initView(); //initView호출
		JButton btnAdd = view2.getBtnAdd(); //view만들어져 있는 버튼 반환해서 사용하기
		btnAdd.addActionListener(btnAddL); //버튼을 클릭했을때
		add(view2, "Center"); //view2의 가운데에 추가
		setTitle("도서 관리 시스템");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocation(200, 100);
		setSize(600, 500);
		setVisible(true);
	}

	public static void main(String[] args) {
		new BookController2();
	}

	ActionListener btnAddL = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			//neededInsertData() : panS에 있는 JTextField에 입력된 값들과 JCombobox의 값
			//BookVO에 필드값들을 초기화하여 BookVO 객체에 참조값을 변환하는 메소드
			BookVO vo = view2.neededInsertData();
			dao.insert(vo);
			bookVOLIst = dao.select();
			view2.setBookVOList(bookVOLIst);//bookVOLIst를 다시 view에 넣어주기
			view2.putResult();
			view2.initInsertData(); //(사용자의 편리를 위한것) 기존의 입력됐던 값들을 처음으로 초기화시켜줌
		}
	};
}

BookView2

package info.view;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import info.vo.BookVO;

public class BookView2 extends JPanel {
	JTable table;
	DefaultTableModel model; // DfaultTableModel이 같이 필요함
	ArrayList<BookVO> bookVOList;
	String header[] = { "도서 번호", "도서명", "출판사", "저자명", "도서가격", "카테고리" };
	String categoryNames[] = { "IT도서", "소설", "비도서", "경제", "사회" };
	// 패널 선언
	JPanel panS;
	JComboBox<String> categoryCombo;
	JLabel lbls[] = new JLabel[header.length]; // 참조형 변수 선언
	JTextField tf[] = new JTextField[header.length - 1]; // JTextfield 5개 필요 카테고리 하나 빼서
	// 버튼 추가
	JButton btnAdd = new JButton("도서추가");

	// 생성자
	public BookView2() {
		setLayout(new BorderLayout()); // JPanel의 기본적인 대치관리자는 FlowLayout인데 BorderLayout을 사용하기 위해 바꿈

		categoryCombo = new JComboBox<String>(categoryNames); //

		panS = new JPanel();
		panS.setLayout(new GridLayout(4, 4)); // 행, 열

		for (int i = 0; i < header.length; i++) {
			lbls[i] = new JLabel(header[i]);
			panS.add(lbls[i]); // 구역이 나눠진 panS에 라벨 넣기
			if (i < header.length - 1) { // i가 4일때까지 0 1 2 3 4
				tf[i] = new JTextField();
				panS.add(tf[i]);
			} else {// i가 5가 됐을때 카테고리 콤보 넣어주기
				panS.add(categoryCombo);
			}
		}
		// 도서추가 앞에 빈칸 3개 추가
		for (int i = 0; i < 3; i++) {
			panS.add(new JLabel(" "));
		}
		// 버튼 추가
		panS.add(btnAdd);
	}

	// initView(): JTable 관련 메소드
	public void initView() {
		model = new DefaultTableModel(header, bookVOList.size()) { // 편집이 됨
			// isCell 단축키
			@Override
			public boolean isCellEditable(int row, int column) { // 패널에 저장되어 있는
				return false; // 편집안됨
			}
		};
		// 컬럼들의 너비 설정
		table = new JTable(model);
		table.getColumnModel().getColumn(0).setPreferredWidth(50);
		table.getColumnModel().getColumn(1).setPreferredWidth(200);
		table.getColumnModel().getColumn(2).setPreferredWidth(100);
		table.getColumnModel().getColumn(4).setPreferredWidth(50);
		table.getColumnModel().getColumn(5).setPreferredWidth(50);

		// 스크로바 만들기
		JScrollPane scroll = new JScrollPane(table);

		putResult();

		add("Center", scroll); // 위치 순서 상관없음
		add("South", panS);

	}

	// DefaultTableModel에 도서 정보들을 설정한다.
	public void putResult() { //결과의 값들 잘 설정되도록
		// ** modelml 행 개수 설정
		model.setRowCount(bookVOList.size()); // 화면에 나오게 하는것 중요
		// 지역변수 선언
		BookVO vo = null;
		for (int i = 0; i < bookVOList.size(); i++) {
			vo = bookVOList.get(i);
			// i : 행 번호 0 : 열번호
			// 값을 설정한다 sell값을 설정하는 메소드
			model.setValueAt(vo.getIsbn(), i, 0);
			model.setValueAt(vo.getbookName(), i, 1);
			model.setValueAt(vo.getPublish(), i, 2);
			model.setValueAt(vo.getAuthor(), i, 3);
			model.setValueAt(vo.getPrice(), i, 4);
			model.setValueAt(vo.getCategory(), i, 5);
		}
	}

	public void setBookVOList(ArrayList<BookVO> bookVOList) { // 단축키 사용가능
		this.bookVOList = bookVOList;
	}

	public JButton getBtnAdd() {
		return btnAdd;
	}

	public BookVO neededInsertData() {
		BookVO vo = new BookVO();
		vo.setIsbn(Integer.parseInt(tf[0].getText()));
		vo.setBookName(tf[1].getText());
		vo.setPublish(tf[2].getText());
		vo.setAuthor(tf[3].getText());
		vo.setPrice(Integer.parseInt(tf[4].getText()));
		vo.setCategory((String) categoryCombo.getSelectedItem());
		return vo; //vo를 return
	}

	public void initInsertData() {
		for (int i = 0; i < tf.length; i++) {
			tf[i].setText("");
		}
		categoryCombo.setSelectedIndex(0);
	}
}

💻 결과



디렉토리 구조

profile
프로젝트를 통해 배운 개념이나 겪은 문제점들을 정리하고, 회고록을 작성하며 성장해나가는 곳입니다 😊

0개의 댓글