사이먼's 코딩노트
[Java] 호텔 예약 관리 프로그램 제작(6) 본문
[호텔 예약 관리 프로그램 제작]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 깃허브 리포지터리 주소 : https://github.com/psm817/hotel_booking_proj
[예약 확인 구현]
- 이번에는 객실 예약을 한 사용자가 본인의 예약 내역을 확인하기 위한 'booking check' 을 구현해보고자 한다.
- 예약과 관련된 기능들은 모두 BookingController.java 클래스에 코드를 추가하였다.
package org.example.controller;
import org.example.Util;
import org.example.dto.Booking;
import org.example.dto.Guest;
import org.example.dto.Room;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
public class BookingController extends Controller {
private Scanner sc;
private String cmd;
public static List<Booking> bookings;
public Room bookingAbleRoom;
public BookingController() {
sc = new Scanner(System.in);
bookings = new ArrayList<>();
}
public void doAction(String cmd, String actionMethodName) {
this.cmd = cmd;
switch(actionMethodName) {
case "room" :
doBooking();
break;
case "check" :
doCheckBooking();
break;
default :
System.out.println("존재하지 않는 서비스입니다.");
break;
}
}
public void doCheckBooking() {
int foundBookingCount = getBookingsByName(loginedGuest.name);
System.out.printf("%s 님, [%d]건의 예약이 있습니다.\n", loginedGuest.name, foundBookingCount);
if (foundBookingCount >= 1) {
System.out.print("예약 상세보기를 진행 하시겠습니까?) ");
String answer = sc.nextLine();
while (true) {
if (answer.equals("yes")) {
System.out.println("호수 | 객실타입 | 예약날짜");
for (int i = 0; i < bookings.size(); i++) {
Booking bookedRoom = bookings.get(i);
for(int j = 0; j < rooms.size(); j++) {
Room room = rooms.get(j);
int roomId = room.floor * 100 + room.id;
if(bookedRoom.regDate.equals(room.bookingDate) && bookedRoom.roomId == roomId) {
System.out.printf("%d | %4s | %s\n", bookedRoom.roomId, bookedRoom.roomType, bookedRoom.regDate);
}
}
}
break;
}
else if (answer.equals("no")) {
System.out.println("상세보기를 건너뜁니다.");
break;
}
else {
System.out.println("\'yes\' 또는 \'no\'를 입력해주세요");
continue;
}
}
}
}
private int getBookingsByName(String name) {
int sum = 0;
for(Booking booking : bookings) {
if(booking.guestName.equals(name)) {
sum++;
}
}
return sum;
}
}
- 먼저 서비스 명령어를 구분하기 위해 doAction() 메서드에서 'check' 라는 문자열을 통해 doCheckBooking() 메서드를 호출하도록 한다.
- 예약 확인은 로그인이 된 회원에 한해서만 조회가 가능하고, 회원은 본인이 예약한 내역만 확인이 가능하다.
- doCheckBooking() 메서드가 호출됨과 동시에 총 몇 건의 예약이 있는지 확인이 가능하다.
- 만약 예약의 상세내용을 보기를 원한다면 객실번호, 객실타입, 예약날짜를 보여준다.
- 조건문을 통해 회원이 객실을 예약한 날짜(bookedRoom.regDate)와 객실의 예약 날짜(room.bookingDate)가 일치한지 확인하고 예약 내역의 객실번호(bookedRoom.roomId)와 객실 자체의 객실번호(roomId)를 확인하여 모두 일치하면 해당 내역을 보여준다.
- Room.java 클래스에 정의된 데이터 변수를 보면 객실의 호수(id)와 층(floor)이 따로 나눠져 있기 때문에 객실번호를 구하기 위해서 각 층에 100을 곱한 후 호수를 더하도록 하였다.
- 무한루프를 사용하여 만약 사용자가 상세보기를 원하지 않는다면 해당 메서드를 종료하고, yes나 no가 아닌 다른 대답을 했다면 대답이 잘못되었다는 안내와 함께 다시 상세보기를 원하는 지 질문한다.
- 실제로 현재까지 구현된 프로그램을 실행시켜보면 'booking check' 서비스를 실행하였을 때, 예약 건 수가 0건이여도 상세보기를 권하는 질문이 나오고, 만약 상세보기를 진행하게 된다면 객실의 타입이 싱글이면 1, 더블이면 2와 같이 숫자를 표시하게 된다.
- 해당 문제를 개선하고 추가로 결제 요금을 안내하기 위해서 약간의 코드를 수정하였다.
public void doCheckBooking() {
int foundBookingCount = getBookingsByName(loginedGuest.name);
System.out.printf("%s 님, [%d]건의 예약이 있습니다.\n", loginedGuest.name, foundBookingCount);
if (foundBookingCount >= 1) {
System.out.print("예약 상세보기를 진행 하시겠습니까?) ");
String answer = sc.nextLine();
while (true) {
if (answer.equals("yes")) {
System.out.println("호수 | 객실타입 | 결제요금 | 예약날짜");
for (int i = 0; i < bookings.size(); i++) {
Booking bookedRoom = bookings.get(i);
for(int j = 0; j < rooms.size(); j++) {
Room room = rooms.get(j);
int roomId = room.floor * 100 + room.id;
if(bookedRoom.regDate.equals(room.bookingDate) && bookedRoom.roomId == roomId && loginedGuest.name.equals(bookedRoom.guestName)) {
if(roomId % 2 == 1) {
System.out.printf("%d | 싱글 | %,d | %s\n", bookedRoom.roomId, bookedRoom.bookingPay, bookedRoom.regDate);
}
else {
System.out.printf("%d | 더블 | %,d | %s\n", bookedRoom.roomId, bookedRoom.bookingPay, bookedRoom.regDate);
}
}
}
}
break;
}
else if (answer.equals("no")) {
System.out.println("상세보기를 건너뜁니다.");
break;
}
else {
System.out.println("\'yes\' 또는 \'no\'를 입력해주세요");
continue;
}
}
}
}
- 상단에서 조건문을 통해 만약 foundBookingCount가 0이라면 나머지 기능들은 수행하지 않도록 수정하였다.
- 무한루프 안에서는 결제 요금란을 추가하였고, 만약 roomId 즉 객실번호가 홀수이면 객실 타입을 싱글, 짝수이면 객실 타입을 더블로 보여줄 수 있도록 수정하였다.
[샘플 회원 데이터 생성]
- 실제로 회원이 존재해야 객실을 예약할 수 있고, 로그인된 회원이 자기자신의 예약 내역을 확인할 수 있다.
- 그렇기 때문에 이번에는 샘플 회원 데이터를 만들어보려 한다.
- 회원 관련 기능이기 때문에 회원을 생성하는 메서드는 GuestController.java 클래스에 코드를 작성한다.
public void makeTestGuest() {
guests.add(new Guest(1, Util.getTodayDate(), "admin", "admin", "관리자", "admin@gmail.com", "010-1234-5678"));
guests.add(new Guest(2, Util.getTodayDate(), "user1", "user1", "홍길동", "user1@gmail.com", "010-1234-5678"));
guests.add(new Guest(3, Util.getTodayDate(), "user2", "user2", "임꺽정", "user2@gmail.com", "010-1234-5678"));
}
- Guest.java 클래스에서 선언된 생성자의 매개변수에 맞춰 회원의 정보를 입력해주고 add를 통해 guests라는 리스트에 회원의 정보를 저장한다.
Controller.makeTestData();
guestController.makeTestGuest();
- 현재까지 구현된 샘플 데이터은 객실과 회원이다.
- makeTestData()는 객실 데이터를 생성하는 메서드이고, makeTestGuest()는 회원 데이터를 생성하는 메서드이다.
- 두 샘플 데이터들은 프로그램 실행과 동시에 만들어져야 하기 때문에 App.java 클래스에 시작 부분 상단에 코드를 추가해야한다.
- 이 때, makeTestData()는 roomController가 아닌 Controller에서 직접 호출을 하고 있다.
- 그 이유는 객실의 정보는 객실을 조회할 때 필요하지만, 객실을 예약할 때도 객실의 정보가 필요하기 때문에 roomController와 bookingController 두 군데에서 호출을 해야한다.
- 최대한 중복을 방지하기 위해서 객실 데이터를 생성하는 makeTestData() 메서드를 Controller.java 클래스로 이전시키고 한 번만 호출하도록 하였다.
반응형
'프로젝트 > [Java] 호텔 예약 관리 프로그램 제작' 카테고리의 다른 글
[Java] 호텔 예약 관리 프로그램 제작(8) (0) | 2024.04.17 |
---|---|
[Java] 호텔 예약 관리 프로그램 제작(7) (0) | 2024.04.17 |
[Java] 호텔 예약 관리 프로그램 제작(5) (0) | 2024.04.16 |
[Java] 호텔 예약 관리 프로그램 제작(4) (0) | 2024.04.16 |
[Java] 호텔 예약 관리 프로그램 제작(3) (0) | 2024.04.16 |