- 자바 프로젝트 리팩토링 : Library Service(5)
이번에는 Book과 LibBook 데이터를 관리하는 코드를 정리하고, 도서 관련 기능들을 리팩토링하였다.
도서 기능에서는 리스트를 조회하는 코드들이 반복되어, 리스트 폼을 짜주는 코드를 따로 메서드화하였다.
- BookDao.java
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import domain.Book;
import domain.LibBook;
import util.DataUtil;
public class BookDao {
// Singleton 패턴 적용
private static BookDao bookDao = new BookDao();
private BookDao() {}
public static BookDao getInstance() {
return bookDao;
}
private List<Book> books = DataUtil.initBooks();
private List<LibBook> libBooks = DataUtil.initLibBooks();
// 도서정보 목록조회
public List<Book> listBook() {
return books;
}
// 도서정보 조회
public Book getBook(int bookID) {
for (Book book : books) {
if (book.getId() == bookID) {
return book;
}
}
return null;
}
// 도서정보 조회(ISBN)
public Book getBook(String isbn) {
for (Book book : books) {
if (book.getIsbn().equals(isbn)) {
return book;
}
}
return null;
}
// 도서정보 생성
public void regBook(Book book) {
books.add(book);
saveBook();
}
// 도서정보 수정
public void modifyBook(Book b) {
Book book = getBook(b.getId());
book.setTitle(b.getTitle());
book.setAuthor(b.getAuthor());
book.setPublisher(b.getPublisher());
book.setIsbn(b.getIsbn());
book.setAmount(b.getAmount());
saveBook();
}
// 도서정보 삭제
public void removeBook(Book book) {
books.remove(book);
saveBook();
}
// 소장도서 목록조회
public List<LibBook> listLibBook() {
return libBooks;
}
// 소장도서 목록조회(도서정보 ID)
public List<LibBook> listLibBook(int bookID) {
List<LibBook> libBooks = new ArrayList<LibBook>();
for (LibBook libBook : this.libBooks) {
if (libBook.getBookID() == bookID) {
libBooks.add(libBook);
}
}
return libBooks;
}
// 소장도서 조회
public LibBook getLibBook(int libBookID) {
for (LibBook libBook : libBooks) {
if (libBook.getId() == libBookID) {
return libBook;
}
}
return null;
}
// 소장도서 삭제
public void removeLibBook(LibBook lb) {
libBooks.remove(lb);
saveLibBook();
}
// Book 데이터 저장
private void saveBook() {
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(new FileOutputStream("books.ser"));
oos.writeObject(books);
} catch (Exception e) {
e.printStackTrace();
}
}
// LibBook 데이터 저장
private void saveLibBook() {
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(new FileOutputStream("libBooks.ser"));
oos.writeObject(libBooks);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- BookServiceImpl.java
import static util.LibUtil.convert;
import static util.LibUtil.convertLeft;
import static util.LibUtil.nextInt;
import static util.LibUtil.nextLine;
import java.util.ArrayList;
import java.util.List;
import dao.BookDao;
import dao.RentDao;
import domain.Book;
import domain.LibBook;
import util.LibUtil;
import util.StringUtil;
public class BookServiceImpl implements BookService {
private BookDao bookDao = BookDao.getInstance();
private RentDao rentDao = RentDao.getInstance();
@Override
public void regBook() { // 관리자 기능
int index = nextInt("1.새로운 책 추가 2.기존의 책 추가 > ", 1, 2);
Book book = null;
List<LibBook> libBooks = bookDao.listLibBook();
int libBookNum = libBooks.get(libBooks.size() - 1).getId() + 1;
switch (index) {
case 1: // 새로운 책 추가
int id = nextInt("추가할 책의 도서번호 > ");
book = bookDao.getBook(id);
if( book == null ) {
// 도서정보 생성
book = new Book();
book.setId(id);
book.setTitle(nextLine("제목 > ", true, false));
book.setAuthor(nextLine("저자 > ", true, false));
book.setPublisher(nextLine("출판사 > ", true, false));
book.setIsbn(nextLine("ISBN > ", false, true));
// 소장도서 생성
LibBook libBook = new LibBook();
libBook.setId(libBookNum);
libBook.setBookID(id);
bookDao.regBook(book);
bookDao.regLibBook(libBook);
} else {
System.out.println("존재하는 도서번호입니다.");
}
break;
case 2: // 기존의 책 추가
System.out.println("기존의 책을 추가합니다.");
book = bookDao.getBook(nextInt("추가할 도서의 도서번호 > "));
if ( book != null ) {
// 재고 증가
book.setAmount(book.getAmount() + 1);
// 소장도서 생성
LibBook libBook = new LibBook();
libBook.setId(libBookNum);
libBook.setBookID(book.getId());
bookDao.modifyBook(book);
bookDao.regLibBook(libBook);
} else {
System.out.println("존재하지 않는 도서번호입니다.");
}
}
}
@Override
public List<Book> searchBook() {
int index = nextInt("1. 제목 검색 2. 저자 검색 3. 출판사 검색 > ", 1, 3);
String word = "";
switch (index) {
// 제목 검색
case 1: word = nextLine("제목을 입력해주세요. > "); break;
// 저자 검색
case 2: word = nextLine("저자를 입력해주세요. > "); break;
// 출판사 검색
case 3: word = nextLine("출판사를 입력해주세요. > ");
}
List<Book> bookShelf = searchBookIf(word, index);
if (bookShelf.size() > 0) {
listBookFormat(bookShelf);
} else {
System.out.println("소장되지 않은 도서입니다.");
}
return bookShelf;
}
private List<Book> searchBookIf(String keyword, int index) {
List<Book> books = bookDao.listBook();
keyword = transWord(keyword);
List<Book> searchBooks = new ArrayList<Book>();
for (Book book : books) {
// 제목으로 검색
if( index == 1 && transWord(book.getTitle()).contains(keyword) ) {
searchBooks.add(book);
}
// 저자로 검색
else if ( index == 2 && transWord(book.getAuthor()).contains(keyword) ) {
searchBooks.add(book);
}
// 출판사로 검색
else if ( index == 3 && transWord(book.getPublisher()).contains(keyword) ) {
searchBooks.add(book);
}
}
return searchBooks;
}
private String transWord(String str) {
str = str.toLowerCase().replaceAll(" ", "");
return str;
}
@Override
public void findBook() { // 관리자 기능
int index = nextInt("1.전체재고조회 2.도서번호검색 > ", 1, 2);
switch (index) {
case 1:
listBookFormat(bookDao.listBook());
case 2:
int libBookNum = nextInt("조회할 도서의 도서번호를 입력해주세요. > ");
List<LibBook> libBooks = bookDao.listLibBook(libBookNum);
if ( libBooks.size() > 0 ) {
listLibBookFormat(libBooks);
} else {
System.out.println("존재하지 않는 도서번호입니다.");
}
}
}
@Override
public void modifyBook() { // 관리자 기능
String isbn = nextLine("변경할 책의 ISBN > ");
Book book = bookDao.getBook(isbn);
if ( book != null ) {
// 도서정보 수정
book.setTitle(nextLine("이름 > ", true, false));
book.setAuthor(nextLine("저자 > ", true, false));
book.setPublisher(nextLine("출판사 > ", true, false));
book.setIsbn(nextLine("ISBN > ", false, true));
bookDao.modifyBook(book);
System.out.println("책이 수정되었습니다.");
} else {
System.out.println("존재하지 않는 ISBN입니다.");
}
}
@Override
public void removeBook() { // 관리자 기능
int id = nextInt("삭제할 책의 도서번호 > ");
List<LibBook> libBooks = bookDao.listLibBook(id);
if (libBooks.size() > 0) {
// 소장도서 목록 출력
listLibBookFormat(libBooks);
int libBookNum = nextInt("삭제할 책의 소장번호 > ");
LibBook libBook = bookDao.getLibBook(libBookNum);
if ( libBook == null ) {
System.out.println("소장번호를 확인해주세요.");
}
else if ( libBook.isRent() ) {
System.out.println("대여 중인 도서입니다.");
}
else {
// 재고 감소
Book book = bookDao.getBook(libBook.getBookID());
book.setAmount(book.getAmount() - 1);
bookDao.removeLibBook(libBook);
// 대여기록 삭제
// rentDao.removeRents(libBookNum);
System.out.println("책이 삭제되었습니다.");
}
} else {
System.out.println("존재하지 않는 도서번호입니다.");
}
}
private void listBookFormat(List<Book> books) {
LibUtil.bookIndex();
for (Book book : books) {
System.out.print("│ " + convert(book.getId() + "", 3) + " │ ");
System.out.print(convertLeft(StringUtil.bookTitleLength(book), 24) + " │ ");
System.out.print(convertLeft(StringUtil.bookAuthorLength(book), 20) + " │ ");
System.out.print(convertLeft(StringUtil.bookPublisherLength(book), 20) + " │ ");
System.out.print(convertLeft(book.getIsbn(), 10) + " │ ");
System.out.print(convert(book.getAmount() + "", 2) + "권 │");
System.out.printf("%n────────────────────────────────────────────────────────────────────────────────────────────────────────────────%n");
}
}
private void listLibBookFormat(List<LibBook> libBooks) {
LibUtil.libBookIndex();
for (LibBook libBook : libBooks) {
System.out.print("│ " + convert(libBook.getBookID() + "", 3) + " │ ");
System.out.print(" " + convert(libBook.getId() + "", 3) + " │ ");
System.out.print(convertLeft(StringUtil.bookTitleLength(bookDao.getBook(libBook.getBookID())), 24) + " │ ");
System.out.print(convertLeft(StringUtil.bookAuthorLength(bookDao.getBook(libBook.getBookID())), 20) + " │ ");
System.out.print(convertLeft(StringUtil.bookPublisherLength(bookDao.getBook(libBook.getBookID())), 20) + " │ ");
System.out.print(convert(libBook.isRent() ? "대여" : "보유", 4) + " │");
System.out.printf("%n───────────────────────────────────────────────────────────────────────────────────────────────────────────────%n");
}
}
}