TIL 2023-10-27 호텔 예약 시스템 팀과제01

장규빈·2023년 10월 30일
0

TIL

목록 보기
12/59

호텔 예약 시스템

이번주에 새로 팀과제를 하게되어서 정리를 해보려고 한다.

필수 요구 사항은 다음과 같다.

호텔 예약 프로그램
- 필수 요구 사항
1. 호텔은 여러 객실, 보유 자산을 가지고 있다.
2. 객실은 객실 당 하루에 한 사람만 예약이 가능하다.
3. 객실은 크기, 숙박비를 가진다.
4. 예약은 객실, 고객의 이름, 고객의 전화번호, 예약 날짜를 가지고 있다.

  • 전화 번호 제한(XXX-XXXX-XXXX) 정규 표현식 (선택)
  • 예약 날짜 날짜는 ISO 8601 형식으로 조합된 UTC 날짜 및 시간 예) 2016-10-27T17:13:40+00:00
  1. 고객은 이름, 전화번호, 소지금을 가진다.
  • 고객 소지금보다 비싼 방은 예약 불가
  1. 호텔은 모든 예약 목록을 조회 할 수 있다.
  2. 고객은 자신의 예약 목록을 조회 할 수 있다.
  • 예약 번호로 예약 내역을 조회한다
  1. 고객은 자신의 예약을 취소 할 수 있다.
  2. 고객이 호텔 예약 시에 예약 번호(id)를 반환 (uuid 활용)
  • 고객이 호텔 예약에 성공하면 예약 번호(id)를 받는다.
  • 고객이 예약 목록을 조회 시 예약 번호도 같이 조회 된다.
  • 고객이 예약 취소 시 예약 번호를 통해 자신의 특정 예약을 취소한다.

먼저 클래스 다이어그램을 통해 만들어야할 클래스들을 정리해보았다

그 후 클래스를 코드로 구현해보았다.

package model;

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

import static constant.HotelConstant.HOTEL_ASSET;
import static constant.HotelConstant.PASSWORD;

public class Hotel {
   private final List<ProductRoom> productRooms = new ArrayList<>();
   private final List<Reservation> reservations = new ArrayList<>();
   private final List<User> users = new ArrayList<>();
   private int asset = HOTEL_ASSET;

   public List<ProductRoom> getProductRooms() {
      return productRooms;
   }

   public List<Reservation> getReservations() {
      return reservations;
   }

   public List<User> getUsers() {
      return users;
   }

   public Integer getAsset() {
      return asset;
   }

   public String getPassword() {
      return PASSWORD;
   }

   public void setAsset(int asset) {
      this.asset = asset;
   }
}
package constant;

public class HotelConstant {
   public static final int HOTEL_ASSET = 0;
   public static final String PASSWORD = "*********************************************";
}

호텔의 관리자모드에 접속시 패스워드가 필요할것 같아서 생성해주었도 그것을 따로 상수로 빼서 관리하도록 하였다.

package model;

import static constant.UserConstant.USER_DEFAULT_POINT;

public class User {
   private final String name;
   private final String phoneNumber;
   private int point = USER_DEFAULT_POINT;

   public User(String name, String phoneNumber) {
      this.name = name;
      this.phoneNumber = phoneNumber;
   }

   public String getName() {
      return name;
   }

   public String getPhoneNumber() {
      return phoneNumber;
   }

   public int getPoint() {
      return point;
   }

   public void setPoint(int point) {
      this.point = point;
   }
}
package constant;

public class UserConstant {
   public static final int USER_DEFAULT_POINT = 0;
}

유저도 마찬가지로 소지금을 상수로 빼서 관리하도록 하였다.

package model;

import constant.RoomType;

public class Room {
   private final RoomType roomType;
   private final int cost;

   public Room(RoomType roomType, int cost) {
      this.roomType = roomType;
      this.cost = cost;
   }

   public RoomType getRoomType() {
      return roomType;
   }

   public int getCost() {
      return cost;
   }
}
package constant;

public enum RoomType {
   STANDARD("standard room"),
   SUPERIOR("superior room"),
   DELUXE("deluxe room"),
   SUITE("suite room");

   final String name;

   RoomType(String name) {
      this.name = name;
   }
}

룸의 타입을 enum으로 따로 빼서 관리할수 있도록 했다.

package model;

import constant.RoomType;

import java.time.LocalDate;


public class ProductRoom extends Room {
   private final Integer roomNumber;
   private final LocalDate reservedDate;
   private boolean isReserved = false;

   public ProductRoom(RoomType roomType, int cost, Integer roomNumber, LocalDate reservedDate) {
      super(roomType, cost);
      this.roomNumber = roomNumber;
      this.reservedDate = reservedDate;
   }

   public Integer getRoomNumber() {
      return roomNumber;
   }

   public LocalDate getReservedDate() {
      return reservedDate;
   }

   public boolean isReserved() {
      return isReserved;
   }

   public void setReserved(boolean reserved) {
      isReserved = reserved;
   }
}
package model;

import java.time.LocalDateTime;

public record Reservation(ProductRoom productRoom, String userName, String userPhoneNumber, LocalDateTime createdAt) {
}

하다보니 알게 되었는데 필드의 값을 모두 생성자에서 받으니까 인텔리제이가 예약 클래스를 자동으로 record 클래스로 변경시켜 주었다. 그러고나니 코드가 엄청 깔끔해 졌으며 getter, equals, hashcode, toString과 같은 기본 메소드를 제공 받을수 있었다.

profile
나다운사람

0개의 댓글