사이먼's 코딩노트
[Java] 호텔 예약 관리 프로그램 제작(13) 본문
[호텔 예약 관리 프로그램 제작]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 깃허브 리포지터리 주소 : https://github.com/psm817/hotel_booking_proj
[객실 예약 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이 아닌 회원이 선택한 날짜로 수정된다.
반응형
'프로젝트 > [Java] 호텔 예약 관리 프로그램 제작' 카테고리의 다른 글
[Java] 호텔 예약 관리 프로그램 제작(15) (1) | 2024.04.18 |
---|---|
[Java] 호텔 예약 관리 프로그램 제작(14) (2) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(12) (0) | 2024.04.17 |
[Java] 호텔 예약 관리 프로그램 제작(11) (0) | 2024.04.17 |
[Java] 호텔 예약 관리 프로그램 제작(10) (0) | 2024.04.17 |