사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 18. 15:07

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[예약 확인 & 예약 취소 DB 연결]

  • 이번에는 예약 확인과 예약 취소에 필요한 모든 기능을 DB와 연결하여 구현해봅시다.
  • 아래 코드는 BookingController에서 예약 확인과 예약 취소를 하기 위해 bookigService에 연결하기 위해 작성된 코드이다.
  • 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다.
public void doCheckBooking() {
    // 로그인 된 게스트 가져오기
    Guest loginedGuest = session.getLoginedGuest();

    // 로그인된 회원이 예약한 목록 가져오기
    List<Booking> forPrintBookings = bookingService.getForPrintBookings(loginedGuest.name);

    int foundBookingCount = forPrintBookings.size();
    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.printf("==== [%s 님] 예약 현황 =======\n", loginedGuest.name);
                System.out.println("호수 | 객실타입 | 결제요금 | 체크인날짜");

                // 예약한 목록 출력
                for(int i = 0; i < forPrintBookings.size(); i++) {
                    Booking bookingByGuest = forPrintBookings.get(i);

                    if(bookingByGuest.roomId % 2 == 1) {
                        System.out.printf("%d  |     싱글 |  %,d | %s\n", bookingByGuest.roomId, bookingByGuest.bookingPay, bookingByGuest.regDate);
                    }
                    else {
                        System.out.printf("%d  |     더블 |  %,d | %s\n", bookingByGuest.roomId, bookingByGuest.bookingPay, bookingByGuest.regDate);
                    }
                }

                System.out.println("====================================");
                break;
            }
            else if (answer.equals("no")) {
                System.out.println("상세보기를 건너뜁니다.");
                break;
            }
            else {
                System.out.println("\'yes\' 또는 \'no\'를 입력해주세요");
                return;
            }
        }
    }
}

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

    // 로그인된 회원이 예약한 목록 가져오기
    List<Booking> forPrintBookings = bookingService.getForPrintBookings(loginedGuest.name);

    int foundBookingCount = forPrintBookings.size();
    System.out.printf("%s 님, 총 [%d]건의 예약이 있습니다.\n", loginedGuest.name, foundBookingCount);

    if(foundBookingCount == 0) {
        System.out.println("취소하실 예약 건이 없습니다.");
    }
    else {
        System.out.printf("==== [%s 님] 예약 현황 =======\n", loginedGuest.name);
        System.out.println("예약번호 | 호수 | 체크인날짜");

        // 예약한 목록 출력
        for(int i = 0; i < forPrintBookings.size(); i++) {
            Booking bookingByGuest = forPrintBookings.get(i);

            System.out.printf("    %4d |  %d | %s\n", bookingByGuest.id, bookingByGuest.roomId, bookingByGuest.regDate);
        }

        System.out.println("====================================");
        System.out.print("예약을 취소하시겠습니까?) ");
        String answer = sc.nextLine();

        if(answer.equals("yes")) {
            System.out.print("취소하시고 싶은 예약번호를 입력(숫자만) : ");
            int answerId = sc.nextInt();
            sc.nextLine();

            // 예약번호에 따른 booking 가져오기
            Booking forPrintBooking = bookingService.getForPrintBooking(answerId);

            // 객실번호(303과 같은)를 100으로 나눴을 때 몫을 층 수
            int floor = forPrintBooking.roomId / 100;
            // 객실번호(303과 같은)를 100으로 나눴을 때 나머지를 호수
            int number = forPrintBooking.roomId % 10;

            // 삭제할 forPrintBooking을 인자로 넘겨 room 정보 수정하기
            Container.roomService.setBooingDelete(floor, number);
            // 예약목록에서 삭제
            bookingService.deleteBooking(answerId);

            System.out.println("예약이 취소되었습니다!!");
        }
        
        else if(answer.equals("no")) {
            System.out.println("예약취소를 중단합니다.");
        }
        else {
            System.out.println("\'yes\' 또는 \'no\'를 입력해주세요");
        }
    }
}
  • 프로그램 시작과 동시에 이미 DB는 연결되어 있기 때문에 따로 connection을 하는 코드는 필요없다.
  • doCheckBooking() 메서드 안에서 로그인 된 회원 자신의 예약을 확인하기 위해서 [List<Booking> forPrintBookings = bookingService.getForPrintBookings(loginedGuest.name);] 라는 코드를 추가 작성하여 예약 목록을 조회하는 기능을 bookingService 라는 직원을 통해 수행한다.
  • doDeleteBooking() 메서드 안에서도 로그인 된 회원 자신의 예약을 가져오기 위해서 같은 getForPrintBookings() 메서드를 호출하고, 예약 번호에 따른 예약 목록을 가져오기 위해서 [Booking forPrintBooking = bookingService.getForPrintBooking(answerId);] 라는 코드를 추가 작성하였다.
  • 예약 취소가 완료되면 해당 객실의 예약여부를 '예약가능' 으로 변경하고, 예약 목록에서 해당 건을 삭제하기 위해  [Container.roomService.setBookingDelete(floor, number);]와 [bookingService.deleteBooking(answerId);]라는 코드를 추가하여 bookingService와 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 List<Booking> getForPrintBookings(String name) {
        return bookingDao.getForPrintBookings(name);
    }

    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);
    }

    public Booking getForPrintBooking(int answerId) {
        return bookingDao.getForPrintBooking(answerId);
    }

    public int deleteBooking(int answerId) {
        return bookingDao.deleteBooking(answerId);
    }
}
package org.example.service;

import org.example.container.Container;
import org.example.dao.RoomDao;
import org.example.dto.Booking;
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);
    }

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

 

  • 다음은 BookingDao.java와 RoomDao.java에 추가 작성된 코드이다.
  • 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다.
public List<Booking> getForPrintBookings(String name) {
    // 로그인 된 게스트 가져오기
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("SELECT * "));
    sb.append(String.format("FROM booking "));
    sb.append(String.format("WHERE guestName = '%s' ", name));

    List<Booking> bookings = new ArrayList<>();
    List<Map<String, Object>> rows = dbConnection.selectRows(sb.toString());

    for(Map<String, Object> row : rows) {
        bookings.add(new Booking(row));
    }

    return bookings;
}

public Booking getForPrintBooking(int answerId) {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("SELECT * "));
    sb.append(String.format("FROM `booking` "));
    sb.append(String.format("WHERE id = %d ", answerId));

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

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

    return new Booking(row);
}

public int deleteBooking(int answerId) {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("DELETE FROM `booking` "));
    sb.append(String.format("WHERE id = %d ", answerId));

    return dbConnection.delete(sb.toString());
}
public int setBookingDelete(int floor, int number) {
    StringBuilder sb = new StringBuilder();

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

    return dbConnection.update(sb.toString());
}
  • 최종적으로 BookingDao.java와 RoomDao.java 에 도달하게 되면 각 메서드들의 기능을 확인할 수 있습니다.
  • getForPrintBookings() 메서드는 DB 쿼리문을 통해 로그인된 회원의 모든 예약 목록을 조회하는 기능을 수행한다.
  • StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "SELECT * FROM booking WHERE guestName = name" 이라는 쿼리문을 통해 예약 목록을 조회한다.
  • SELECT 문을 통해 조회가 완료된다면 dbConnection과 연결하여 selectRows() 메서드를 실행하고 반복문을 통해 회원이 예약했던 목록이 2개 이상이라면 bookings List에 로컬 데이터가 아닌 DB 데이터를 add 한다. 
  • 실제로 DB를 통해 회원 이름과 일치한 예약 목록이 조회가 완료되면 BookingController.java에 작성된 조건문과 반복문에 맞춰 예약 확인과 취소를 진행할 수 있다.

 

  • getForPrintBooking() 메서드는 DB 쿼리문을 통해 예약번호에 맞는 예약 목록 하나만을 조회하는 기능을 수행한다.
  • StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "SELECT * FROM booking WHERE id = answerId" 이라는 쿼리문을 통해 예약 목록을 조회한다.
  • SELECT 문을 통해 조회가 완료된다면 dbConnection과 연결하여 selectRow() 메서드를 실행하고 회원이 입력한 예약번호에 맞는 예약 목록이 있다면 해당 Booking의 정보를 return 하고, 없다면 null을 return 해준다.
  • 실제로 DB를 통해 취소를 원하는 예약 목록이 조회가 완료되면, BookingController.java에 작성된 조건에 맞춰 예약 취소를 진행할 수 있다.

 

  • deleteBooking() 메서드는 DB 쿼리문을 통해 회원이 자신의 예약 목록 중 취소하고 싶은 예약번호에 선택하여 해당 번호에 맞는 예약 목록을 삭제하는 기능을 수행한다.
  • StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "DELETE FROM booking WHERE id = answerId" 이라는 쿼리문을 통해 예약 목록을 삭제한다.
  • DELETE 문을 통해 삭제가 완료된다면 dbConnection과 연결하여 delete() 메서드를 실행한다.
  • 실제로 DB를 통해 원하는 예약 건을 취소한다면 해당 예약 목록은 bookings List에서 제거된다.

 

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