도서 정보 관리 시스템을 MVC (Model-View-Controller) 모델을 사용하여 구현해보도록 하겠습니다!
DataModel
부분은 데이터의 모델링과 관리를 담당합니다. 여기에서는 도서 정보를 다루는 데 필요한 데이터 구조 및 기능을 정의합니다.BookVO
와 BookDAO
로 구성됩니다.BookVO
클래스는 개별 도서 정보를 저장하기 위한 데이터 객체입니다. 이 객체는 도서번호 (ISBN), 책 이름, 저자명, 출판사, 가격, 카테고리 등 6개의 필드를 가지고 있습니다.BookDAO
클래스는 도서 데이터를 실제로 관리하고 데이터베이스와의 상호 작용을 처리합니다. 이 클래스는 도서 정보를 저장, 검색, 수정 및 삭제하는 기능을 제공합니다.View
부분은 사용자 인터페이스를 담당합니다. 여기에서는 도서 정보를 사용자에게 보여주는 역할을 합니다.BookView
클래스는 도서 정보를 콘솔 창에 출력하고 사용자로부터 도서 정보를 입력받는 인터페이스를 제공합니다.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로 만들어주기 위해 아래와 같은 컴포넌트를 이용할 것 입니다.
JFrame
(프레임):
JPanel
(패널):
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);
}
}