사이먼's 코딩노트

[Java] 호텔 예약 관리 프로그램 제작(16) 본문

프로젝트/[Java] 호텔 예약 관리 프로그램 제작

[Java] 호텔 예약 관리 프로그램 제작(16)

simonpark817 2024. 4. 18. 16:42

[호텔 예약 관리 프로그램 제작]

 

hotel_booking_proj/src/main/java/org/example/controller/BookingController.java at fc9392411d4c9bb61a5dd060b932fe2a842f1f9d · ps

Contribute to psm817/hotel_booking_proj development by creating an account on GitHub.

github.com

 

[문제점 개선]

  • 저번 과정에서 체크인/체크아웃 날짜를 도입하면서 문제점들이 몇 가지 발생했다.
  • 먼저, 객실 예약을 했을 때 체크아웃 날짜까지 객실의 예약 여부를 '예약불가' 로 지정하였는데, 사실 체크아웃 날짜에는 객실의 예약이 가능하도록 하는 것이 올바른 시나리오라 생각이 들어 해당 부분 수정이 필요하다.
  • 그 다음으로 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() 의 경우도 마찬가지로 해당 조건문 안에 모든 회원의 취소 가능한 예약 목록을 조회하도록 한다.
  • 일반 회원의 예약확인과 예약취소와 로직이 거의 동일하고 출력문의 형태만 다르기 때문에 코드는 따로 포스팅하지 않은 점은 참고 부탁드립니다.
반응형