사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 17. 11:12

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[예약 확인 구현]

  • 이번에는 객실 예약을 한 사용자가 본인의 예약 내역을 확인하기 위한 '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 클래스로 이전시키고 한 번만 호출하도록 하였다.
반응형