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