사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 18. 15:47

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

 

hotel_booking_proj/src/main/java/org/example/dao/RoomDao.java at d31a7fc221919e58491fb7b6c892907997892d56 · psm817/hotel_bookin

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

github.com

 

[일주일 단위의 객실 자동 삭제 및 생성]

  • 현재 호텔 예약 프로그램은 1일 기준 15개의 객실, 일주일 치의 양을 가지고 있기 때문에 총 120개의 객실 정보가 room 테이블에 항상 저장되어 있어야한다.
  • 하지만 날짜가 하루, 이틀 계속 지나가면서 매번 객실을 일주일 치의 양을 유지하기 위해서 DB에 직접 접속해서 room 테이블에서 INSERT와 DELETE를 할 수는 없기 때문에 해당 문제를 코드에 적용하여 프로그램에서 자동으로 현재 날짜에 맞춰 객실의 개수를 유지하도록 하려한다.
  • 해당 기능은 RoomController.java 에서 코드를 추가하였다.
  • 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다.
public void showList() {
    List<Room> forListRooms = roomService.getRooms();

    String[] cmdBits = cmd.split(" ");
    if(cmdBits.length > 2) {
        System.out.println("존재하지 않는 서비스입니다.");
        return;
    }

    while(true) {
        System.out.print("확인하시고 싶은 날짜 입력) ");
        String checkDate = sc.nextLine();

        if(!Util.checkWeekDate(checkDate)) {
            System.out.println("오늘 날짜부터 7일간 조회 가능합니다.");
            continue;
        }

        // 현재 날짜를 기준으로 일주일 범위에 속하는 날짜의 방을 추가 생성 (15개)
        if(Util.getDaysBetween(Util.getTodayDate(), checkDate) <= 7) {
            if(checkDate.equals(Util.getSevenDateLater())) {
                for(int i = 3; i <= 5; i++) {
                    for(int j = 1; j <= 5; j++) {
                        Container.roomService.roomDatePlus(i, j);
                    }
                }
            }
        }

        while(true) {
            System.out.print("층 입력(숫자만) : ");
            int floor = sc.nextInt();
            sc.nextLine();

            if(floor > 5 || floor < 3) {
                System.out.println("층 수를 잘못 입력하셨습니다.");
                System.out.println("3, 4, 5층 중 하나를 입력해주세요.");
                continue;
            }

            else {
                System.out.printf("======== [%s] %d층 객실 현황 =======\n", checkDate, floor);
                System.out.println("호수 | 객실타입 | 상태");

                for(int i = 0; i < forListRooms.size(); i++) {
                    Room room = forListRooms.get(i);

                    // 현재 날짜를 기준으로 지나간 날짜의 방은 삭제
                    if (!Util.checkWeekDate(room.dayOfSelect)) {
                        roomService.roomDateDelete(room.dayOfSelect);
                    }

                    if(room.dayOfSelect.equals(checkDate)) {
                        if(room.floor == floor) {
                            if(room.type == 1) {
                                System.out.printf("%d  |     싱글 | %s\n", (room.floor * 100 +room.roomNum), room.booked);
                            }
                            else {
                                System.out.printf("%d  |     더블 | %s\n", (room.floor * 100 +room.roomNum), room.booked);
                            }
                        }
                    }
                }

                System.out.println("====================================");
                break;
            }
        }

        break;
    }
}
  • 프로그램을 시작하고 객실 조회인 room list 서비스를 실행하면 해당 기능을 수행하도록 하였다.
  • showList() 메서드 안에 확인하고 싶은 날짜를 입력했을 때 만약 현재(오늘) 날짜를 기준으로 일주일 범위에 속하는 날짜의 객실이 없다면 하루 치의 객실 15개를 만들도록 하였다.
  • 여기서 getDaysBetween() 메서드는 Util.java에 작성된 메서드로, 인자 값으로 오늘 날짜와 객실 조회를 원하는 날짜를 넘겨주어 두 날짜 사이의 차이를 구하는 역할을 하고, getSevenDateLater() 메서드는 현재(오늘) 날짜를 기준으로 7일 뒤의 날짜 구하는 역할을 한다.
  • 또한, 현재(오늘) 날짜를 기준으로 이미 지나가버린 날짜의 객실은 회원이 확인하고 싶은 층 수까지 입력을 한 다음에 자동으로 삭제가 되도록 하였다.
  • 두 기능은 모두 roomService와 연결되어 해당 기능을 수행하도록 하였고, roomDatePlus() 와 roomDateDelete() 라는 메서드를 추가하였다.

 

  • 다음은 RoomService.java에 추가 작성된 코드이다.
  • 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다.
public int roomDateDelete(String dayOfSelect) {
    return roomDao.roomDateDelete(dayOfSelect);
}

public int roomDatePlus(int i, int j) {
    return roomDao.roomDatePlus(i, j);
}
  • RoomService.java 에서는 이미 roomDateDelete(), roomDatePlus() 라는 메서드가 생성되어 있고, 해당 메서드들은 다시 RoomDao에게 실질적인 기능을 수행하도록 한다.

 

  • 다음은 RoomDao.java에 추가 작성된 코드이다.
  • 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다.
public int roomDateDelete(String dayOfSelect) {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("DELETE FROM `room` "));
    sb.append(String.format("WHERE dayOfSelect = '%s' ", dayOfSelect));

    return dbConnection.delete(sb.toString());
}

public int roomDatePlus(int i, int j) {
    StringBuilder sb = new StringBuilder();

    // 호 수가 짝수면 2, 홀수면 1
    int type = (j % 2 == 0) ? 2 : 1;

    sb.append(String.format("INSERT INTO `room` "));
    sb.append(String.format("SET roomNum = %d,", j));
    sb.append(String.format("floor = %d, ", i));
    sb.append(String.format("type = %d, ", type));
    sb.append(String.format("checkInDate = NULL, "));
    sb.append(String.format("checkOutDate = NULL, "));
    sb.append(String.format("booked = '예약가능', "));
    sb.append(String.format("dayOfSelect = CURDATE() + INTERVAL 7 DAY "));

    return dbConnection.insert(sb.toString());
}
  • 최종적으로 RoomDao.java 에 도달하게 되면 각 메서드들의 기능을 확인할 수 있습니다.
  • roomDateDelete() 메서드는 DB 쿼리문을 통해 현재(오늘) 날짜를 기준으로 이미 지나간 날짜의 객실 데이터는 모두 삭제하는 기능을 수행한다.
  • room 테이블의 dayOfSelect 컬럼은 선택 날짜로서 WHERE 조건문을 사용하여 해당 날짜가 이미 지난 room 데이터를 모두 가져와 삭제할 수 있도록 한다.
  • roomDatePlus() 메서드는 DB 쿼리문을 통해 새로운 객실을 추가하는 기능을 수행한다.
  • 매개변수 i, j는 객실의 층과 호수를 나타내고 해당 변수들을 이용해서 객실의 타입까지 한 번에 추가할 수 있도록 하였다.
  • 마지막의 dayOfSelect = CURDATE() + INTERVAL 7 DAY 는 dayOfSelect 컬럼에 현재 날짜를 기준으로 7일 뒤에 있는 날짜를 저장하라는 의미이다.

 

[체크인/체크아웃 날짜 도입]

  • 현재 호텔 예약 프로그램은 회원이 예약했을 때 예약된 날짜를 room과 booking에 저장하고 있다.
  • 모든 회원이 무조건 하루만 숙박을 하고 퇴실하는 것은 아니기 때문에 조금 더 구체적인 체계를 갖추기 위해서 기존에 사용했던 bookingDate 컬럼을 삭제하고, checkInDate와 checkOutDate를 추가하여 더 정교한 프로그램으로 만들어보려 한다.
  • 해당 작업은 Booking과 Room과 관련된 모든 클래스에서 코드 작업 수정이 필요하여 모든 코드를 포스팅을 하기엔 양이 많아 핵심적인 부분만 보여드리는 점 참고 부탁드립니다.
  • 먼저 각 데이터를 관리하는 Booking.java와 Room.java에 추가 작성된 코드이다.
package org.example.dto;

import lombok.Getter;
import lombok.Setter;

import java.util.Map;

@Getter
@Setter
public class Booking extends Dto {
    public int roomId;
    public String checkInDate;
    public String checkOutDate;
    public String guestName;
    public String guestPhone;
    public int roomType;
    public int bookingPay;
}
package org.example.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.util.Map;

@Getter
@Setter
@AllArgsConstructor
public class Room extends Dto {
    public int roomNum;     // 호수
    public int floor;       // 층
    public int type;        // 싱글, 더블
    //    public String bookingDate;      // 예약한 날짜
    public String checkInDate;
    public String checkOutDate;
    public String booked;           // 예약 여부
    public String dayOfSelect;      // 선택 날짜a
}
  • 두 클래스에 모두 String 타입으로 CheckInDate와 CheckOutDate를 추가하였다.
  • 물론 해당 변수를 추가했다는 것은 DB에서도 컬럼의 변화가 있는 것이기 때문에 DB에 접속해서 기존에 있던 테이블을 반드시 수정해야한다.

 

  • 다음은 BookingController.java에 추가 작성된 코드이다.
System.out.print("체크인 날짜 입력) ");
String checkInDate = sc.nextLine();
checkInDate = checkInDate.trim();

if(!Util.checkWeekDate(checkInDate)) {
    System.out.println("오늘 날짜부터 7일간 조회 가능합니다.");
    continue;
}

System.out.print("체크아웃 날짜 입력) ");
String checkOutDate = sc.nextLine();
checkOutDate = checkOutDate.trim();

if(!Util.checkWeekDate(checkOutDate)) {
    System.out.println("오늘 날짜부터 7일간 조회 가능합니다.");
    continue;
}
  • 위 코드는 doBooking()에 작성된 코드이며, 기존에는 예약을 원하는 날짜 하나만 입력하도록 되어있던 구조를 체크인과 체크아웃 날짜를 추가하였다.
  • 체크인/체크아웃 날짜가 추가됨에 따라 booking check와 booking delete를 실행하여 로그인된 회원의 예약 목록을 보여주게 될 때도 두 날짜가 모두 보여주도록 수정하였다.
  • 추가로 객실 예약을 완료하게 되면 해당 객실은 체크인/체크아웃 날짜 사이에 예약여부를 모두 '예약불가' 로 변경하도록 수정하였다.
  • 예를 들어 회원이 2024-04-17(체크인)부터 2024-04-19(체크아웃)까지 501호에서 숙박을 원한다면 두 날짜 사이의 501호의 예약여부는 모두 '예약불가'로 변경되는 것이다.
반응형