사이먼's 코딩노트
[Java] 호텔 예약 관리 프로그램 제작(16) 본문
[호텔 예약 관리 프로그램 제작]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 깃허브 리포지터리 주소 : https://github.com/psm817/hotel_booking_proj
[문제점 개선]
- 저번 과정에서 체크인/체크아웃 날짜를 도입하면서 문제점들이 몇 가지 발생했다.
- 먼저, 객실 예약을 했을 때 체크아웃 날짜까지 객실의 예약 여부를 '예약불가' 로 지정하였는데, 사실 체크아웃 날짜에는 객실의 예약이 가능하도록 하는 것이 올바른 시나리오라 생각이 들어 해당 부분 수정이 필요하다.
- 그 다음으로 booking check를 통해 회원의 역대 예약 목록을 모두 조회할 수 있기 때문에, 예약 취소(booking delete)를 할 때는 모든 예약 목록이 아닌 취소가 가능한 예약 목록만 보여주는 것이 올바른 시나리오라 생각이 들어 해당 부분도 수정이 필요하다.
- 다시 말해 현재(오늘) 날짜를 기준으로 체크인 날짜가 지나간 예약 목록은 예약 취소의 대상이 아니라는 뜻이다. (이미 숙박중이거나, 숙박이 모든 끝난 상태이기 때문)
- 해당 기능들은 BookingController.java 에서 코드를 수정하였다.
- 아래 코드는 doBooking() 과 doDeleteBooking() 에서 수정된 코드의 일부분이다.
while(true) {
System.out.print("예약을 진행할까요?) ");
String answer = sc.nextLine();
answer = answer.trim();
if(answer.equals("yes")) {
// booking 리스트에 예약내역 추가
bookingService.add(Integer.parseInt(roomNum), checkInDate, checkOutDate, loginedGuest.name, loginedGuest.phoneNum, bookingAbleRoom.type, payment);
// 예약된 room의 상태를 예약불가로, 체크인/체크아웃 날짜 업데이트
roomService.setBookingComplete(floor, number, checkInDate, checkOutDate);
// 로그인된 회원의 이름으로 예약 성공
System.out.printf("[%s]님 예약 성공하셨습니다!! 결제는 당일 카운터에서 진행 부탁드립니다!\n", loginedGuest.name);
break;
}
else if(answer.equals("no")) {
System.out.println("예약을 중단합니다.");
break;
}
else {
System.out.println("\'yes\' 또는 \'no\'를 입력해주세요");
continue;
}
}
// 오늘 날짜로 체크인이 지난 booking은 제외하고 로그인된 회원이 예약한 목록 가져오기
List<Booking> forBookingAbleDelete = bookingService.getForPrintBookings(loginedGuest.name, Util.getTodayDate());
// 삭제할 수 있는 모든 booking 가져오기
List<Booking> forAllBookingAbleDelete = bookingService.getForPrintBookings("admin", Util.getTodayDate());
- 먼저 doBooking() 메서드 안에서 bookingService.add() 와 roomService.setBookingComplete() 메서드를 호출할 때 인자 값으로 체크인/체크아웃 날짜를 추가해준다.
- doDeleteBooking() 메서드에서는 bookingService.getForPrintBookings() 메서드를 호출할 때 인자 값으로 오늘 날짜를 추가하여 현재 날짜랑 체크인 날짜를 비교할 수 있도록 한다.
- 다음은 BookingController에서 수정된 메서드에 맞춰 BookingDao.java와 RoomDao.java에서 수정된 코드이다.
- 각 Service에서는 매개변수와 인자 값만 수정해주고 아래 코드는 다음 과정인 각 Dao를 수정한다.
public List<Booking> getForPrintBookings(String name, String todayDate) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("SELECT * "));
sb.append(String.format("FROM booking "));
sb.append(String.format("WHERE checkInDate >= '%s' ",todayDate));
sb.append(String.format("AND guestName = '%s' ", name));
List<Booking> bookings = new ArrayList<>();
List<Map<String, Object>> rows = dbConnection.selectRows(sb.toString());
for(Map<String, Object> row : rows) {
bookings.add(new Booking(row));
}
return bookings;
}
public int setBookingComplete(int floor, int number, String checkInDate, String checkOutDate) {
StringBuilder sb = new StringBuilder();
// 체크아웃 날짜에서 하루 빼기
String checkOutDateBefore = Util.getBeforeOneDay(checkOutDate);
sb.append(String.format("UPDATE `room` "));
sb.append(String.format("SET booked = '예약불가', "));
sb.append(String.format("checkInDate = '%s', ", checkInDate));
sb.append(String.format("checkOutDate = '%s' ", checkOutDate));
sb.append(String.format("WHERE floor = %d AND roomNum = %d AND ", floor, number));
sb.append(String.format("dayOfSelect BETWEEN '%s' AND '%s' ", checkInDate, checkOutDateBefore));
return dbConnection.update(sb.toString());
}
- BookingDao.java에서 예약 취소를 진행하기 전 취소가 가능한 예약 목록을 불러오는 역할인 getForPrintBookings() 메서드는 매개변수로 todayDate를 추가하였고, SELECT 문에서 WHERE 조건에 체크인 날짜가 현재(오늘) 날짜보다 크면 예약 취소가 가능한 목록으로 허용한다.
- RoomDao.java에서 예약된 객실의 정보를 수정하는 역할인 setBookingComplete() 메서드는 매개변수로 체크인/체크아웃 날짜를 추가하였고, UPDATE 문에서 WHERE 조건에 선택된 날짜가 회원이 입력한 체크인 날짜부터 체크아웃 날짜 전 날까지만 객실의 정보를 수정하도록 하였다.
- 이 때 체크아웃 전 날까지만 해당 정보를 수정해야되기 때문에 메서드 상단에 getBeforeOneDay() 를 통해 체크아웃 날짜를 기준으로 하루 전 날짜를 추출하는 변수 checkOutDateBefore를 선언한다.
[관리자 모든 예약 확인 가능 구현]
- 호텔 예약 프로그램에는 ID가 admin인 프로그램 관리자가 존재한다.
- 관리자는 사실 모든 서비스에 있어서 접근이 가능하다. 다시 말해 모든 회원의 예약을 확인할 수 있고, 임시로 객실을 예약할 수도 있고, 모든 회원의 예약을 취소할 수 있는 권한을 가져야 한다는 뜻이다.
- 해당 기능을 적용하기 위해서 BookingController에서 몇 가지 코드 수정이 필요하다.
if(loginedGuest.loginId.equals("admin"))
- 사실 이미 모든 사람이 예약이 가능하다는 조건 아래에 코드를 구현하였기 때문에 doBooking() 에서는 코드를 수정할 필요는 없다.
- 위 코드는 doCheckBooking() 과 doDeleteBooking() 에만 적용하면 된다.
- 로그인 된 회원을 나타내는 loginedGuest가 "admin" 인 조건을 이용해여 관리자에게 권한을 부여한다.
- doCheckBooking() 의 경우, 해당 조건문 안에 모든 회원의 예약 목록을 조회하도록 한다.
- doDeleteBooking() 의 경우도 마찬가지로 해당 조건문 안에 모든 회원의 취소 가능한 예약 목록을 조회하도록 한다.
- 일반 회원의 예약확인과 예약취소와 로직이 거의 동일하고 출력문의 형태만 다르기 때문에 코드는 따로 포스팅하지 않은 점은 참고 부탁드립니다.
반응형
'프로젝트 > [Java] 호텔 예약 관리 프로그램 제작' 카테고리의 다른 글
[Java] 호텔 예약 관리 프로그램 제작(18) (1) | 2024.04.18 |
---|---|
[Java] 호텔 예약 관리 프로그램 제작(17) (1) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(15) (1) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(14) (2) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(13) (0) | 2024.04.18 |