- 자바 프로젝트 리팩토링 : Library Service(7)
마지막으로 대여 기능을 리팩토링하였다.
대여 기능은 도서 기능과 계정 기능을 다 참조하고 있어서 데이터 조작이 정말 번거로웠는데..
SQL이 그립던 하루였다..☁
대여 기능에서는 구조적으로는 크게 바꿀 게 없었고, 데이터 조작부를 중심으로 리팩토링 하였다.
- RentDao.java
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import domain.Rent;
import domain.User;
import util.DataUtil;
public class RentDao {
// Singleton 패턴 적용
private static RentDao rentDao = new RentDao();
private RentDao() {}
public static RentDao getInstance() {
return rentDao;
}
private List<Rent> rents = DataUtil.initRents();
// 대여정보 목록조회
public List<Rent> listRent() {
return rents;
}
// 대여정보 목록조회(계정정보)
public List<Rent> listRent(User user) {
List<Rent> rents = new ArrayList<Rent>();
for (Rent rent : this.rents) {
if (rent.getUserID() == user.getId()) {
rents.add(rent);
}
}
return rents;
}
// 대여정보 목록조회(소장도서 ID)
public List<Rent> listRent(int libBookID) {
List<Rent> rents = new ArrayList<Rent>();
for (Rent rent : this.rents) {
if (rent.getLibBookID() == libBookID) {
rents.add(rent);
}
}
return rents;
}
// 대여정보 조회
public Rent getRent(int rentNum) {
for (Rent rent : rents) {
if (rent.getRentNum() == rentNum) {
return rent;
}
}
return null;
}
// 대여정보 생성
public void regRent(Rent rent) {
rents.add(rent);
saveRent();
}
// 대여정보 수정(도서반납)
public void modifyRent(Rent r) {
Rent rent = getRent(r.getRentNum());
rent.setDateReturn(System.currentTimeMillis());
saveRent();
}
// 대여정보 삭제
public void removeRent(Rent rent) {
rents.remove(rent);
saveRent();
}
// Rent 데이터 저장
private void saveRent() {
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(new FileOutputStream("rents.ser"));
oos.writeObject(rents);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- RentServiceImpl.java
import static util.LibUtil.convert;
import static util.LibUtil.convertLeft;
import static util.LibUtil.nextInt;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import dao.BookDao;
import dao.RentDao;
import dao.UserDao;
import domain.Book;
import domain.LibBook;
import domain.Rent;
import domain.User;
import service.book.BookService;
import service.book.BookServiceImpl;
import util.LibUtil;
import util.StringUtil;
public class RentServiceImpl implements RentService {
private BookService bookService = new BookServiceImpl();
private UserDao userDao = UserDao.getInstance();
private BookDao bookDao = BookDao.getInstance();
private RentDao rentDao = RentDao.getInstance();
@Override
public void listRent(User user) {
System.out.println("도서대여이력입니다.");
List<Rent> listRent = user.isAdmin() ? rentDao.listRent() : rentDao.listRent(user);
listRentHistFormat(listRent);
}
@Override
public void rentBook(User user) { // 대여 기능
int userID = user.getId();
// 관리자 계정일 경우
if( user.isAdmin() ) {
userID = nextInt("ID를 입력해주세요. > ");
}
if (userDao.getUser(userID) != null) {
System.out.println("대여할 도서를 검색해주세요.");
List<Book> listBook = bookService.searchBook(false);
if ( listBook.size() > 0 ) {
// 대여정보가 담긴 도서목록 출력
listRentFormat(listBook);
try {
int rentNum = nextInt("대여할 도서의 번호를 입력해주세요. > ") - 1;
Book book = listBook.get(rentNum);
bookFormat(book); // 도서정보 출력
int index = nextInt("대여하시겠습니까?[1.네 2.아니오] > ");
if ( index == 1 ) {
// 대여할 도서가 있는 경우
if ( book.getAmount() > 0 ) {
rent(book, userID);
}
// 모든 도서가 대여 중일 경우
else {
System.out.println("현재 모든 책이 대여 중입니다.");
}
}
} catch (Exception e) {
System.out.println("잘못 입력하셨습니다.");
}
}
} else {
System.out.println("ID를 확인해주세요.");
}
}
private void rent(Book book, int userID) {
List<Rent> listRent = rentDao.listRent();
int rentNum = listRent.get(listRent.size() - 1).getRentNum() + 1;
// 대여정보 생성
Rent rent = new Rent();
rent.setRentNum(rentNum);
rent.setUserID(userID);
rent.setLibBookID(findLibBookIdRentAble(book));
rentDao.regRent(rent);
// 재고 변경
book.setAmount(book.getAmount() - 1);
bookDao.modifyBook(book);
System.out.println("대여완료");
}
private int findLibBookIdRentAble(Book book) {
List<LibBook> libBooks = bookDao.listLibBook(book.getId());
for (LibBook libBook : libBooks) {
if ( !libBook.isRent() ) {
libBook.setRent(true);
bookDao.updateLibBook(libBook);
return libBook.getId();
}
}
return 0;
}
@Override
public void returnBook(User user) throws ParseException { // 반납 기능
int userID = user.getId();
// 관리자 계정일 경우
if( user.isAdmin() ) {
userID = nextInt("ID를 입력해주세요. > ");
}
System.out.println("도서반납입니다.");
List<Rent> listRent = rentDao.listRent();
int cnt = 1;
List<Rent> listReturnAble = new ArrayList<Rent>();
LibUtil.returnIndex();
for (Rent rent : listRent) {
LibBook libBook = bookDao.getLibBook(rent.getLibBookID());
if ( rent.getUserID() == userID && libBook.isRent() ) {
returnBookFormat(rent, cnt);
listReturnAble.add(rent);
cnt++;
}
}
if (listReturnAble.size() > 0) {
int returnNum = nextInt("반납할 도서의 번호를 입력해주세요. > ") - 1;
try {
// 반납일자 저장
Rent rent = listReturnAble.get(returnNum);
rentDao.modifyRent(rent);
// 대여상태 변경
LibBook libBook = bookDao.getLibBook(rent.getLibBookID());
libBook.setRent(false);
bookDao.updateLibBook(libBook);
// 도서재고 변경
Book book = bookDao.getBook(libBook.getBookID());
book.setAmount(book.getAmount() + 1);
bookDao.modifyBook(book);
System.out.println("반납완료");
} catch (Exception e) {
System.out.println("잘못 입력하셨습니다.");
}
} else {
System.out.printf("\n반납할 도서가 없습니다.\n");
}
}
/* format 코드 생략 */
private String checkDateReturn(Rent rent) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return rent.getDateReturn() > 0 ? dateFormat.format(rent.getDateReturn()) : "";
}
private String calcOverdue(Rent rent) throws ParseException {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
long returnTime = dateFormat.parse(dateFormat.format(rent.getDateRent())).getTime() + 1000 * 60 * 60 * 24 * 7;
if (System.currentTimeMillis() > returnTime) {
return "연체";
} else {
return "";
}
}
}