[Project] 자바 프로젝트 리팩토링 : Library Service(5) [Book 기능 리팩토링]

2023. 4. 29. 01:14·◈ Refactoring/Mini : Library Service📚
728x90


 

[Project] 자바 프로젝트 리팩토링 : Library Service(4) [오버로딩을 활용한 도서정보 조회 기능 수정]

[Project] 자바 프로젝트 리팩토링 : Library Service(3) [Singleton 오류 해결 및 User 기능 리팩토링] [Project] 자바 프로젝트 리팩토링 : Library Service(2) [Singleton 패턴 적용 및 Dao 분리] [Project] 자바 프로젝트

yermi.tistory.com


- 자바 프로젝트 리팩토링 : Library Service(5)

이번에는 Book과 LibBook 데이터를 관리하는 코드를 정리하고, 도서 관련 기능들을 리팩토링하였다.

변수명을 통일하고 코드의 가독성을 높였다.
하나의 기능이 3개의 메서드로 이어져 있었다. / 도서 검색 기능(기존 코드)
불필요한 메서드 사용 최소화 / 도서 검색 기능(리팩토링 코드)

 

도서 기능에서는 리스트를 조회하는 코드들이 반복되어, 리스트 폼을 짜주는 코드를 따로 메서드화하였다.

도서목록을 출력하는 기능이 여러 곳에서 사용되어 메서드화하였다.


- 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");
		}
	}
	
}

Library Service : Book 기능 리팩토링

- 기존의 코드

 

GitHub - kycasdzxc/human_project: 휴먼교육센터에서 진행한 프로젝트 🏫

휴먼교육센터에서 진행한 프로젝트 🏫. Contribute to kycasdzxc/human_project development by creating an account on GitHub.

github.com

- 리팩토링 코드

 

GitHub - kycasdzxc/LibraryService: Java Project 리팩토링 : Library Service 📚

Java Project 리팩토링 : Library Service 📚. Contribute to kycasdzxc/LibraryService development by creating an account on GitHub.

github.com


- Next) 자바 프로젝트 리팩토링 : Library Service(6)

 

[Project] 자바 프로젝트 리팩토링 : Library Service(6) [login 기능 및 실행부 리팩토링]

[Project] 자바 프로젝트 리팩토링 : Library Service(5) [Book 기능 리팩토링] [Project] 자바 프로젝트 리팩토링 : Library Service(4) [오버로딩을 활용한 도서정보 조회 기능 수정] [Project] 자바 프로젝트 리팩토

yermi.tistory.com


728x90
'◈ Refactoring/Mini : Library Service📚' 카테고리의 다른 글
  • [Project] 자바 프로젝트 리팩토링 : Library Service(7) [Rent 기능 리팩토링]
  • [Project] 자바 프로젝트 리팩토링 : Library Service(6) [login 기능 및 실행부 리팩토링]
  • [Project] 자바 프로젝트 리팩토링 : Library Service(4) [오버로딩을 활용한 도서정보 조회 기능 수정]
  • [Project] 자바 프로젝트 리팩토링 : Library Service(3) [Singleton 오류 해결 및 User 기능 리팩토링]
예르미(yermi)
예르미(yermi)
끊임없이 제 자신을 계발하는 개발자입니다👨🏻‍💻
  • 예르미(yermi)
    예르미의 코딩노트
    예르미(yermi)
  • 전체
    오늘
    어제
    • 분류 전체보기 (937)
      • ◎ Java (133)
        • Java☕ (93)
        • JSP📋 (26)
        • Applet🧳 (6)
        • Interview👨🏻‍🏫 (8)
      • ◎ JavaScript (48)
        • JavaScript🦎 (25)
        • jQuery🌊 (8)
        • React🌐 (2)
        • Vue.js🔰 (6)
        • Node.js🫒 (3)
        • Google App Script🐑 (4)
      • ◎ HTML5+CSS3 (17)
        • HTML5📝 (8)
        • CSS3🎨 (9)
      • ──────────── (0)
      • ▣ Framework (67)
        • Spring🍃 (36)
        • Spring Boot🍀 (12)
        • Bootstrap💜 (3)
        • Selenium🌕 (6)
        • MyBatis🐣 (10)
      • ▣ Tools (47)
        • API🎯 (18)
        • Library🎲 (15)
        • JitPack🚀 (3)
        • Jenkins👨🏻 (7)
        • Thymeleaf🌿 (4)
      • ▣ Server (32)
        • Apache Tomcat🐱 (14)
        • Apache HTTP Server🛡️ (1)
        • Nginx🧶 (7)
        • OracleXE💿 (4)
        • VisualSVN📡 (4)
      • ▣ OS : 운영체제 (18)
        • cmd : 명령프롬프트💻 (10)
        • Linux🐧 (8)
      • ▣ SQL : Database (56)
        • Oracle SQL🏮 (26)
        • PL SQL💾 (9)
        • MySQL🐬 (6)
        • MariaDB🦦 (6)
        • H2 Database🔠 (3)
        • SQL 실전문제🐌 (6)
      • ────────── (0)
      • ◈ Human Project (86)
        • Mini : Library Service📚 (15)
        • 화면 설계 [HTML]🐯 (10)
        • 서버 프로그램 구현🦁 (15)
        • Team : 여수어때🛫 (19)
        • Custom : Student🏫 (9)
        • Custom : Board📖 (18)
      • ◈ Yermi Project (40)
        • 조사모아(Josa-moa)📬 (5)
        • Riddle-Game🧩 (6)
        • 맛있을 지도🍚 (2)
        • 어디 가! 박대리!🙋🏻‍♂️ (5)
        • 조크베어🐻‍❄️ (4)
        • Looks Like Thirty🦉 (2)
        • Toy Project💎 (12)
        • 오픈소스 파헤치기🪐 (4)
      • ◈ Refactoring (15)
        • Mini : Library Service📚 (8)
        • 서버 프로그램 구현🦁 (1)
        • Team : 여수어때🛫 (0)
        • 쿼리 튜닝일지🔧 (6)
      • ◈ Coding Test (89)
        • 백준(BOJ)👨🏻‍💻 (70)
        • 프로그래머스😎 (2)
        • 코드트리🌳 (7)
        • 알고리즘(Algorithm)🎡 (10)
      • ◈ Study (102)
        • 기초튼튼 개발지식🥔 (25)
        • HTTP 웹 지식💡 (4)
        • 클린코드(Clean Code)🩺 (1)
        • 디자인패턴(GoF)🥞 (12)
        • 다이어그램(Diagram)📈 (4)
        • 파이썬(Python)🐍 (16)
        • 에러노트(Error Note)🧱 (34)
        • 웹 보안(Web Security)🔐 (6)
      • ◈ 공부모임 (39)
        • 혼공학습단⏰ (18)
        • 코드트리 챌린지👊🏻 (2)
        • 개발도서 100독👟 (8)
        • 나는 리뷰어다🌾 (11)
      • ◈ 자격증 공부 (37)
        • 정보처리기사🔱 (16)
        • 정보처리산업기사🔅 (9)
        • 컴퓨터활용능력 1급📼 (12)
      • ─────────── (0)
      • ◐ 기타 (113)
        • 알아두면 좋은 팁(tip)✨ (46)
        • 개발자의 일상🎈 (44)
        • 개발도서 서평🔍 (10)
        • 개발관련 세미나🎤 (2)
        • 블로그 꾸미기🎀 (9)
        • 사도신경 프로젝트🎚️ (2)
  • 인기 글

  • 최근 댓글

  • 태그

    백준 티어
    Project
    꿀팁
    SQL
    html
    Oracle
    백준
    CSS
    jsp
    코딩
    코딩 테스트
    BOJ
    프로그래밍
    일상
    Error Note
    Java
    자바스크립트
    javascript
    Database
    spring
  • 250x250
  • hELLO· Designed By정상우.v4.10.3
예르미(yermi)
[Project] 자바 프로젝트 리팩토링 : Library Service(5) [Book 기능 리팩토링]
상단으로

티스토리툴바