사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 16. 18:45

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[호텔 소개 만들기]

  • 먼저 'hotel introduce' 라는 명령어와 함께 호텔의 기본 정보와 정책을 보여주는 기능을 hotelController에 작성한다.
package org.example.controller;

import java.util.Scanner;

public class HotelController extends Controller {
    private Scanner sc;
    private String cmd;

    public HotelController() {
        sc = new Scanner(System.in);
    }
    public void doAction(String cmd, String actionMethodName) {
        this.cmd = cmd;

        switch(actionMethodName) {
            case "introduce" :
                doIntroduce();
                break;
            default :
                System.out.println("존재하지 않는 서비스입니다.");
        }
    }

    private void doIntroduce() {
        System.out.printf("\n");
        System.out.println("======== 호텔 소개 ========");
        System.out.println("호텔명 : 대전 그랜드 호텔");
        System.out.println("호텔 위치 : 대전광역시 서구 청사로 111 (3 ~ 5층)");
        System.out.println("호텔 전화번호 : 042-123-1234");
        System.out.println("카운터 영업시간 : 오전 8시 ~ 오후 12시");
        System.out.println("객실 구성 : 각 층별로 10개씩 구성");
        System.out.println("객실 종류 : 싱글 / 더블");
        System.out.println("객실 최대 수용 인원 : 싱글(2인) / 더블(4인)");
        System.out.println("객실 요금 : 싱글(80,000원) / 더블(120,000원) ");
        System.out.println("*인원 추가 시 20,000원 추가*");
        System.out.println("===========================");
        System.out.printf("\n");
    }

}
  • hotelController의 역할은 복잡한 기능없이 오로지 출력문으로만 기본 호텔의 정보를 제공한다.
  • 초기 단계에 짜여진 코드이기 때문에 모든 정보가 포함되어있지 않다는 점은 참고 부탁드립니다.

 

[객실 조회]

  • 다음은 'room list' 라는 명령어와 함께 전 객실의 정보를 보여주는 기능을 RoomController에 작성한다.
package org.example.controller;

import org.example.dto.Room;

import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;

public class RoomController extends Controller {
    private Scanner sc;
    private String cmd;
    List<Room> rooms;

    public RoomController() {
        sc = new Scanner(System.in);
        rooms = new ArrayList<>();
    }

    public void doAction(String cmd, String actionMethodName) {
        this.cmd = cmd;

        switch(actionMethodName) {
            case "list" :
                showList();
                break;
            case "booking" :
                doBooking();
                break;
            default :
                System.out.println("존재하지 않는 서비스입니다.");
                break;
        }
    }

    private void showList() {
        System.out.print("층 수를 입력해주세요) ");
        int floor = sc.nextInt();
        sc.nextLine();

        if(floor == 3) {
            List<Room> forPrintRooms = rooms;

            System.out.println("============= 3층 객실 현황 =============");
            System.out.println("객실 호수 | 객실 타입 | 예약 날짜 | 예약 상태");

            for(int i = 0; i < forPrintRooms.size(); i++) {
                Room room = forPrintRooms.get(i);
                System.out.printf("30%d | %s | %s | %s", room.id, room.type, room.bookingDate, room.booked);
            }
        }

        else if(floor == 4) {
            List<Room> forPrintRooms = rooms;

            System.out.println("============= 4층 객실 현황 =============");
            System.out.println("객실 호수 | 객실 타입 | 예약 날짜 | 예약 상태");

            for(int i = 0; i < forPrintRooms.size(); i++) {
                Room room = forPrintRooms.get(i);
                System.out.printf("40%d | %s | %s | %s", room.id, room.type, room.bookingDate, room.booked);
            }
        }

        else if(floor == 5) {
            List<Room> forPrintRooms = rooms;

            System.out.println("============= 5층 객실 현황 =============");
            System.out.println("객실 호수 | 객실 타입 | 예약 날짜 | 예약 상태");

            for(int i = 0; i < forPrintRooms.size(); i++) {
                Room room = forPrintRooms.get(i);
                System.out.printf("50%d | %s | %s | %s", room.id, room.type, room.bookingDate, room.booked);
            }
        }

        else {
            System.out.println("층 수를 잘못 입력하셨습니다.");
        }
    }

    private void doBooking() {
    }
}
  • doAction() 메서드는 controller.java 클래스에서 상속받은 메서드이며, 모든 Controller가 해당 메서드를 가지고 있다.
  • 객실 조회를 할 때, 모든 객실을 한 번에 보여주기에는 출력문이 너무 길고 가독성이 떨어지기 때문에 층별로 나눠 객실의 정보를 보여주고자 한다.
  • 이번 프로젝트에서는 방의 개수를 3개의 층에 5개씩 하여 하루에 예약 가능한 객실을 15개로 한정하였다.
  • 객실 타입은 객실 번호의 끝자리를 비교했을 때, 홀수면 싱글, 짝수면 더블로 가정하였다.

 

[샘플 Room 데이터 만들기]

  • 'room list' 라는 명령어가 실행됐을 때 실제로 올바르게 조회가 되는 지 확인하기 위해서는 객실의 샘플 데이터가 필요하다.
  • makeTestData() 메서드를 RoomController에 만들고 App에서 시작과 동시에 해당 메서드를 실행하도록 한다.
public void makeTestData() {
    rooms.add(new Room(1, 3, 1, "비어있음", "예약가능"));
    rooms.add(new Room(2, 3, 2, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(3, 3, 1, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(4, 3, 2, "비어있음", "예약가능"));
    rooms.add(new Room(5, 3, 1, "비어있음", "예약가능"));
    rooms.add(new Room(6, 3, 2, "비어있음", "예약가능"));
    rooms.add(new Room(7, 3, 1, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(8, 3, 2, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(9, 3, 1, "비어있음", "예약가능"));
    rooms.add(new Room(10, 3, 2, "비어있음", "예약가능"));

    rooms.add(new Room(1, 4, 1, "비어있음", "예약가능"));
    rooms.add(new Room(2, 4, 2, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(3, 4, 1, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(4, 4, 2, "비어있음", "예약가능"));
    rooms.add(new Room(5, 4, 1, "비어있음", "예약가능"));
    rooms.add(new Room(6, 4, 2, "비어있음", "예약가능"));
    rooms.add(new Room(7, 4, 1, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(8, 4, 2, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(9, 4, 1, "비어있음", "예약가능"));
    rooms.add(new Room(10, 4, 2, "비어있음", "예약가능"));

    rooms.add(new Room(1, 5, 1, "비어있음", "예약가능"));
    rooms.add(new Room(2, 5, 2, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(3, 5, 1, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(4, 5, 2, "비어있음", "예약가능"));
    rooms.add(new Room(5, 5, 1, "비어있음", "예약가능"));
    rooms.add(new Room(6, 5, 2, "비어있음", "예약가능"));
    rooms.add(new Room(7, 5, 1, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(8, 5, 2, "2020-01-01 11:11:11", "예약불가"));
    rooms.add(new Room(9, 5, 1, "비어있음", "예약가능"));
    rooms.add(new Room(10, 5, 2, "비어있음", "예약가능"));
}
  • rooms 라는 객실의 정보를 담는 리스트에 add를 사용하여 총 15개의 샘플데이터를 만들고, Room 생성자에 필요한 매개변수들을 넣어준다.

 

package org.example.dto;

public class Room {
    public int id;
    public int floor;
    public int type;
    public String bookingDate;
    public String booked;

    public Room(int id, int floor, int type, String bookingDate, String booked) {
        this.id = id;
        this.floor = floor;
        this.type = type;
        this.bookingDate = bookingDate;
        this.booked = booked;
    }
}
  • room에 대한 데이터 정의는 Room.java 클래스에 모두 선언되어있는 상태이다.
  • id, floor, type, bookingDate, booked가 기본 변수로 세팅되어 있고, 생성자를 통해 각 정보를 저장한다.

 

[날짜, 층별로 객실 조회]

  • 이번에는 객실을 조회할 때 객실의 층만을 가지고 조회하기 보다 예약 날짜를 함께 이용해서 조회하기 위해 날짜를 구하는 Util을 구현하고, RoomController에서 조건을 추가하려 한다.
  • 먼저, Util에 구현된 코드들은 날짜를 구하거나, 외부에서 쉽게 가져올 수 있는 상용화된 메서드를 작성하였다.
package org.example;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class Util {
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    public static LocalDate getTodayDate() {
        LocalDate now = LocalDate.now();

        return now;
    }

    public static boolean checkWeekDate(String inputDate) {
        LocalDate currentDate = getTodayDate();
        LocalDate inputLocalDate;

        try {
            inputLocalDate = LocalDate.parse(inputDate);
        } catch (DateTimeParseException e) {
            System.out.println("날짜 형식이 잘못 입력되었습니다. \\'yyyy-dd-mm\\' 형태로 입력해주세요.");
            return false;
        }

        // 현재 날짜와 입력한 날짜 사이의 차이 계산
        int difference = Math.abs((int) (currentDate.toEpochDay() - inputLocalDate.toEpochDay()));

        // 입력한 날짜가 현재 날짜 기준으로 일주일 내에 있는지 확인
        return difference <= 7;
    }
}
  • 먼저 getTodayDate() 메서드는 현재(오늘) 날짜를 구하는 역할을 한다.
  • checkWeekDate() 메서드는 객실 조회를 할 때 날짜 값을 입력하여 'yyyy-mm-dd'의 형식이 아니라면 잘못 입력했다는 출력문을 출력해주고, 현재 날짜와 입력받은 날짜의 사이의 차를 계산하여 7일 이내에 속하는 지 판단하는 역할을 한다.

 

private void showList() {
    System.out.print("확인하시고 싶은 날짜를 입력해주세요) ");
    String checkDate = sc.nextLine();

    if(Util.checkWeekDate(checkDate) == false) {
        System.out.println("현재 날짜 기준으로 일주일만 조회 가능합니다.");
        return;
    }

    System.out.print("층 수를 입력해주세요) ");
    String floor = sc.nextLine();

    List<Room> forPrintRooms = rooms;

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

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

            if(room.nowDate.equals(checkDate)) {
                if(room.floor == 3) {
                    if(room.id != 10) {
                        System.out.printf("30%d  | %8s | %s\n", room.id, room.type, room.booked);
                    }
                    else {
                        System.out.printf("3%d  | %8s | %s\n", room.id, room.type, room.booked);
                    }
                }
            }
            else {
                System.out.println("조회된 객실이 없습니다.");
                return;
            }
        }
    }

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

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

            if(room.nowDate.equals(checkDate)) {
                if(room.floor == 4) {
                    if(room.id != 10) {
                        System.out.printf("40%d  | %8s | %s\n", room.id, room.type, room.booked);
                    }
                    else {
                        System.out.printf("4%d  | %8s | %s\n", room.id, room.type, room.booked);
                    }
                }
            }
            else {
                System.out.println("조회된 객실이 없습니다.");
                return;
            }
        }
    }

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

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

            if(room.nowDate.equals(checkDate)) {
                if(room.floor == 5) {
                    if(room.id != 10) {
                        System.out.printf("50%d  | %8s | %s\n", room.id, room.type, room.booked);
                    }
                    else {
                        System.out.printf("5%d  | %8s | %s\n", room.id, room.type, room.booked);
                    }
                }
            }
            else {
                System.out.println("조회된 객실이 없습니다.");
                return;
            }
        }
    }

    else {
        System.out.println("층 수를 잘못 입력하셨습니다.");
    }
}
  • Util에서 일주일을 계산하는 메서드를 통해 사용자가 객실 조회를 원하는 날짜와 비교할 수 있기 때문에 해당 조건문을 RoomController.java 클래스에 추가한다.
반응형