사이먼's 코딩노트
[Java] 호텔 예약 관리 프로그램 제작(15) 본문
[호텔 예약 관리 프로그램 제작]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 깃허브 리포지터리 주소 : https://github.com/psm817/hotel_booking_proj
[일주일 단위의 객실 자동 삭제 및 생성]
- 현재 호텔 예약 프로그램은 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호의 예약여부는 모두 '예약불가'로 변경되는 것이다.
반응형
'프로젝트 > [Java] 호텔 예약 관리 프로그램 제작' 카테고리의 다른 글
[Java] 호텔 예약 관리 프로그램 제작(17) (1) | 2024.04.18 |
---|---|
[Java] 호텔 예약 관리 프로그램 제작(16) (1) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(14) (2) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(13) (0) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(12) (0) | 2024.04.17 |