사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 18. 11:48

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[객실 예약 DB 연결]

  • 이번에는 객실 예약에 필요한 모든 기능을 DB와 연결하여 구현해봅시다.
  • 아래 코드는 BookingController에서 객실 예약을 하기 위해 bookingService와 roomService에 연결되는 코드를 추가하였다.
  • 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다.
public void doBooking() {
    String[] cmdBits = cmd.split(" ");
    if(cmdBits.length > 2) {
        System.out.println("존재하지 않는 서비스입니다.");
        return;
    }

    // 로그인 된 게스트 가져오기
    Guest loginedGuest = session.getLoginedGuest();

    System.out.print("예약할 객실 호수 입력(숫자만) : ");
    String roomNum = sc.nextLine();

    String[] roomNumBits = roomNum.split("");
    int floor = Integer.parseInt(roomNumBits[0]);
    int number = Integer.parseInt(roomNumBits[2]);

    // 날짜 입력 및 7일간 날짜 판단
    System.out.print("예약 날짜 입력) ");
    String bookingDate = sc.nextLine();
    bookingDate = bookingDate.trim();

    if(Util.checkWeekDate(bookingDate) == false) {
        System.out.println("오늘 날짜부터 7일간 조회 가능합니다.");
        return;
    }

    // getBoookingAbleRoom에서 가져오기
    // 호수가 같고, 날짜가 같은 조건 넣어서 select하기
    Room bookingAbleRoom = Container.roomService.getBookingAbleRoom(floor, number, bookingDate);

    if(bookingAbleRoom == null) {
        System.out.println("선택하신 객실은 존재하지 않습니다.");
    }

    else if(bookingAbleRoom.booked.equals("예약불가")) {
        System.out.println("예약이 이미 완료된 객실입니다.");
    }

    else {
        // 요금 안내
        int payment = 150000;
        int count = 0;
        int plusPay = 20000;

        // 객실 타입 안내
        if(bookingAbleRoom.roomNum % 2 == 1) {
            System.out.print("인원은 몇 명 이신가요?) ");
            int peopleNum = sc.nextInt();
            sc.nextLine();

            if(peopleNum > 2) {
                count = peopleNum - 2;
                System.out.println("[싱글] 정원 2명을 초과하셨습니다!!");
                System.out.println("추가 인원 당 20,000원의 추가 요금이 발생합니다!!");
            }
        }
        else if(bookingAbleRoom.roomNum % 2 == 0) {
            payment += 100000;
            System.out.print("인원은 몇 명 이신가요?) ");
            int peopleNum = sc.nextInt();
            sc.nextLine();

            if(peopleNum > 4) {
                count = peopleNum - 4;
                System.out.println("[더블] 정원 4명을 초과하셨습니다!!");
                System.out.println("추가 인원 당 20,000원의 추가 요금이 발생합니다!!");
            }
        }

        System.out.printf("총 금액은 [%,d원] 입니다.\n", (payment+(count*plusPay)));

        while(true) {
            System.out.print("예약을 진행할까요?) ");
            String answer = sc.nextLine();
            answer = answer.trim();

            if(answer.equals("yes")) {
                bookingService.add(Integer.parseInt(roomNum), bookingDate, loginedGuest.name, loginedGuest.phoneNum, bookingAbleRoom.type, (payment+(count*plusPay)));

                // bookingAbleRoom 상태를 예약불가로 변경
                Container.roomService.setBookingComplete(floor, number, bookingDate);

                // 로그인된 회원의 이름으로 예약 성공
                System.out.printf("[%s]님 예약 성공하셨습니다!! 결제는 당일 카운터에서 진행 부탁드립니다!\n", loginedGuest.name);
                break;
            }

            else if(answer.equals("no")) {
                System.out.println("예약을 중단합니다.");
                break;
            }

            else {
                System.out.println("\'yes\' 또는 \'no\'를 입력해주세요");
                continue;
            }
        }
    }

}
  • 프로그램 시작과 동시에 이미 DB는 연결되었기 때문에 따로 connection을 하는 코드는 필요없다.
  • doBooking() 메서드 안에서 예약이 가능한 객실을 가져오기 위해서 [Room bookingAbleRoom = Container.roomService.getBookingAbleRoom(floor, number, bookingDate);] 라는 코드를 추가 작성하여 객실을 조회하는 기능을 roomService 라는 직원을 통해 수행한다.
  • 그 다음은 예약을 진행하기로 결정하고 [bookingService.add(~~);] 라는 코드를 통해 예약 목록을 추가하는 기능을 bookingService 라는 직원을 통해 수행한다.
  • 마지막으로 예약이 성공적으로 끝났다면 해당 객실의 예약여부를 '예약불가'로 변경하기 위해 [Container.roomService.setBookingComplete(floor, number, bookingDate);] 라는 코드를 추가하여 객실의 정보를 수정하는 기능을 roomService 라는 직원을 통해 수행한다.

 

  • 다음은 BookingService.java와 RoomService.java에 추가 작성된 코드이다.
package org.example.service;

import org.example.container.Container;
import org.example.dao.BookingDao;
import org.example.dto.Booking;
import org.example.dto.Guest;
import org.example.dto.Room;

import java.util.List;

public class BookingService {
    private BookingDao bookingDao;

    public BookingService() {
        bookingDao = Container.bookingDao;
    }

    public Room getRoomsByNum(int roomNum) {
        return bookingDao.getRoomsByNum(roomNum);
    }

    public int getRoomsIndexByNum(int roomNum) {
        return bookingDao.getRoomsIndexByNum(roomNum);
    }

    public int getBookingsByName(String name) {
        return bookingDao.getBookingsByName(name);
    }

    public List<Booking> getForPrintBookings() {
        return bookingDao.getForPrintBookings();
    }

    public int add(int roomNum, String regDate, String guestName, String guestPhone, int roomType, int bookingPay) {
        Booking booking = new Booking(roomNum, regDate, guestName, guestPhone, roomType, bookingPay);
        return bookingDao.add(booking);
    }
}
package org.example.service;

import org.example.container.Container;
import org.example.dao.RoomDao;
import org.example.dto.Room;

import java.util.List;

public class RoomService {
    private RoomDao roomDao;

    public RoomService() {
        roomDao = Container.roomDao;
    }

    public List<Room> getRooms() {
        return roomDao.getRooms();
    }

    public Room getBookingAbleRoom(int floor, int number, String bookingDate) {
        return roomDao.getBookingAbleRoom(floor, number, bookingDate);
    }

    public int setBookingComplete(int floor, int number, String bookingDate) {
        return roomDao.setBookingComplete(floor, number, bookingDate);
    }
}
  • BookingService.java 에서는 이미 add() 라는 메서드가 생성되어 있고, 해당 메서드는 다시 BookingDao에게 실질적인 기능을 수행하도록 한다.
  • RoomService.java 에서도 이미 getBookingAbleRoom(), setBookingComplete() 라는 메서드가 생성되어 있고, 해당 메서드들은 다시 roomDao에게 실질적인 기능을 수행하도록 한다.

 

  • 다음은 BookingDao.java와 RoomDao.java에 추가 작성된 코드이다.
  • 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다. 
package org.example.dao;

import org.example.container.Container;
import org.example.controller.Session;
import org.example.db.DBConnection;
import org.example.dto.Booking;
import org.example.dto.Guest;
import org.example.dto.Room;

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

public class BookingDao extends Dao {
    public List<Booking> bookings;
    private Session session;
    private DBConnection dbConnection;

    public BookingDao() {
        bookings = new ArrayList<>();
        session = Container.getSession();
        dbConnection = Container.getDBConnection();
    }

    public int add(Booking booking) {
        StringBuilder sb = new StringBuilder();

        sb.append(String.format("INSERT INTO `booking` "));
        sb.append(String.format("SET roomId = %d,", booking.roomId));
        sb.append(String.format("regDate = '%s', ", booking.regDate));
        sb.append(String.format("guestName = '%s', ", booking.guestName));
        sb.append(String.format("guestPhone = '%s', ", booking.guestPhone));
        sb.append(String.format("roomType = %d, ", booking.roomType));
        sb.append(String.format("bookingPay = %d ", booking.bookingPay));

        return dbConnection.insert(sb.toString());
    }
}
package org.example.dao;

import org.example.container.Container;
import org.example.db.DBConnection;
import org.example.dto.Room;

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

public class RoomDao extends Dao {
    public List<Room> rooms;
    private DBConnection dbConnection;

    public RoomDao() {
        rooms = new ArrayList<>();
        dbConnection = Container.getDBConnection();
    }

    public Room getBookingAbleRoom(int floor, int number, String bookingDate) {
        StringBuilder sb = new StringBuilder();

        sb.append(String.format("SELECT * "));
        sb.append(String.format("FROM `room` "));
        sb.append(String.format("WHERE floor = %d AND roomNum = %d AND dayOfSelect = '%s' ", floor, number, bookingDate));

        Map<String, Object> row = dbConnection.selectRow(sb.toString());

        if(row.isEmpty()) {
            return null;
        }

        return new Room(row);
    }

    public int setBookingComplete(int floor, int number, String bookingDate) {
        StringBuilder sb = new StringBuilder();

        sb.append(String.format("UPDATE `room` "));
        sb.append(String.format("SET booked = '예약불가', "));
        sb.append(String.format("bookingDate = '%s' ", bookingDate));
        sb.append(String.format("WHERE floor = %d AND roomNum = %d AND dayOfSelect = '%s' ", floor, number, bookingDate));

        return dbConnection.update(sb.toString());
    }
}
  • 최종적으로 BookingDao.java와 RoomDao.java 에 도달하게 되면 각 메서드들의 기능을 확인할 수 있다.
  • add() 메서드는 DB 쿼리문을 통해 예약 목록 정보를 삽입하는 기능을 수행한다.
  • StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "INSERT INTO booking SET ~~" 이라는 쿼리문을 통해 예약 목록을 새로 추가한다.
  • INSERT 문을 통해 삽입이 완료된다면 dbConnection과 연결하여 insert() 메서드를 실행한다.
  • 실제로 DB를 통해 예약이 새로 추가된다면 booking 테이블을 SELECT 문으로 조회했을 때 해당 예약 건이 추가되어 있다.

 

  • getBookingAbleRoom() 메서드는 DB 쿼리문을 통해 원하는 객실을 조회하는 기능을 수행한다.
  • StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "SELECT * FROM room WHERE ~~" 이라는 쿼리문을 통해 객실을 조회한다.
  • 이 때 조회해야 하는 객실은 회원이 예약을 원하는 객실의 객실번호와 예약을 원하는 날짜가 일치한 객실을 조회해야하기 때문에 WHERE 조건문을 사용해야한다.
  • SELECT 문을 통해 조회가 완료된다면 dbConnection과 연결하여 selectRow() 메서드를 실행하고 입력한 객실번호와 예약 날짜가 일치한 객실이 있다면 해당 Room의 정보를 return 하고, 없다면 null을 return 해준다.
  • 실제로 DB를 통해 원하는 객실이 조회가 완료되면, BookingController.java에 작성된 조건문에 따라 나머지 예약 절차에 맞춰 진행이 가능하다.

 

  • setBookingComplete() 메서드는 DB 쿼리문을 통해 회원이 예약을 마치면 해당 객실의 정보를 수정하는 기능을 수행한다.
  • StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "UPDATE room SET ~~ WHERE ~~" 라는 쿼리문을 통해 객실의 정보를 수정한다.
  • 이 때 수정해야 하는 객실은 회원이 예약을 원하는 객실의 객실번호와 예약을 원하는 날짜가 일치한 객실을 수정해야되기 때문에 WHERE 조건문을 사용해야한다.
  • UPDATE 문을 통해 수정이 완료된다면 dbConnection과 연결하여 update() 메서드를 실행한다.
  • 실제로 DB를 통해 예약이 완료되었다면 해당 객실의 예약여부는 '예약불가'로, 예약된 날짜는 null이 아닌 회원이 선택한 날짜로 수정된다.
반응형