사이먼's 코딩노트
[Java] 호텔 예약 관리 프로그램 제작(12) 본문
[호텔 예약 관리 프로그램 제작]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 깃허브 리포지터리 주소 :https://github.com/psm817/hotel_booking_proj
[객실 조회 DB 연결]
- 객실 조회에 필요한 모든 기능을 이제는 로컬 데이터 List가 아닌 DB를 연결해서 조회해봅시다.
- 먼저 DB에 연결하기 전, 기존에 RoomController에서 makeTestData() 메서드를 통해 생성해 놓은 샘플 객실 데이터들은 모두 삭제한다.
- 아래 코드는 RoomController에서 객실 조회를 하기 위해 상단의 roomService와 연결되는 코드를 추가하였다.
public void showList() {
List<Room> forListRooms = roomService.getRooms();
String[] cmdBits = cmd.split(" ");
if(cmdBits.length > 2) {
System.out.println("존재하지 않는 서비스입니다.");
return;
}
System.out.print("확인하시고 싶은 날짜를 입력해주세요) ");
String checkDate = sc.nextLine();
if(Util.checkWeekDate(checkDate) == false) {
System.out.println("오늘 날짜부터 7일간 조회 가능합니다.");
return;
}
System.out.print("층 수를 입력(숫자만) : ");
int floor = sc.nextInt();
sc.nextLine();
if(floor > 5 || floor < 3) {
System.out.println("층 수를 잘못 입력하셨습니다.");
System.out.println("3, 4, 5층 중 하나를 입력해주세요.");
}
else {
System.out.printf("==== [%s] %d층 객실 현황 ====\n", checkDate, floor);
System.out.println("호수 | 객실타입 | 상태");
for(int i = 0; i < forListRooms.size(); i++) {
Room room = forListRooms.get(i);
if(room.dayOfSelect.equals(checkDate)) {
if(room.floor == floor) {
if(room.type == 1) {
System.out.printf("%d | 싱글 | %s\n", (room.floor * 100 +room.roomNum), room.booked);
}
else {
System.out.printf("%d | 더블 | %s\n", (room.floor * 100 +room.roomNum), room.booked);
}
}
}
}
System.out.println("====================================");
}
}
- 프로그램 시작과 동시에 이미 DB는 연결되었기 때문에 따로 connection을 하는 코드는 필요없다.
- [List<Room> forListRooms = roomService.getRooms();] 라는 코드를 통해 객실 조회를 기능을 roomService 라는 직원을 통해 수행한다.
- 다음은 RoomService.java에 추가 작성된 코드이다.
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 void add(Room room) {
roomDao.add(room);
}
public List<Room> getRooms() {
return roomDao.getRooms();
}
}
- RoomService.java 에서는 이미 getRooms() 라는 메서드가 생성되어 있고, 해당 메서드는 다시 roomDao에게 실질적인 기능을 수행하도록 한다.
- 다음은 RoomDao.java에 추가 작성된 코드이다.
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 void add(Room room) {
rooms.add(room);
lastId++;
}
public List<Room> getRooms() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("SELECT * FROM room"));
List<Room> rooms = new ArrayList<>();
List<Map<String, Object>> rows = dbConnection.selectRows(sb.toString());
for(Map<String, Object> row : rows) {
rooms.add(new Room(row));
}
return rooms;
}
}
- 최종적으로 RoomDao.java 에 도달하게 되면 getRooms() 메서드의 기능을 확인할 수 있다.
- getRooms() 메서드는 DB 쿼리문을 통해 모든 객실을 조회하는 기능을 수행한다.
- StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "SELECT * FROM room" 이라는 쿼리문을 통해 모든 객실을 조회한다.
- SELECT 문을 통해 조회가 완료된다면 dbConnection과 연결하여 selectRows() 메서드를 실행하고 반복문을 통해 rooms List에 로컬 데이터가 아닌 DB 데이터를 add 한다.
- 실제로 DB를 통해 모든 객실이 조회가 완료되면, RoomController.java에 작성된 조건문과 반복문에 맞춰 필터링하여 객실 정보를 안내할 수 있게된다.
[회원 관련 기능 DB 연결]
- 다음 회원 관련 기능에 필요한 모든 기능을 DB를 연결해서 수행해봅시다.
- 회원 관련 기능은 회원가입, 로그인, 로그아웃을 모두 포함하고, DB 연결을 통해 모든 회원을 조회하고, 회원이 추가되면 데이터를 삽입할 수 있다.
- 먼저 DB에 연결하기 전, 기존에 GuestController에서 makeTestGuest() 메서드를 통해 생성해 놓은 샘플 회원 데이터들은 모두 삭제한다.
- 아래 코드는 GuestController에서 회원 조회 및 회원 추가를 하기 위해 guestService와 연결되는 코드를 추가하였다.
package org.example.controller;
import org.example.service.GuestService;
import org.example.util.Util;
import org.example.dto.Guest;
import org.example.container.Container;
import java.util.Scanner;
public class GuestController extends Controller {
private Scanner sc;
private String cmd;
private GuestService guestService;
private Session session;
public GuestController() {
sc = new Scanner(System.in);
guestService = Container.guestService;
session = Container.getSession();
}
public void doAction(String cmd, String actionMethodName) {
this.cmd = cmd;
switch(actionMethodName) {
case "join" :
doJoin();
break;
case "login" :
doLogin();
break;
case "logout" :
doLogout();
break;
default :
System.out.println("존재하지 않는 서비스입니다.");
break;
}
}
public void doJoin() {
String regDate = Util.getTodayDate();
String loginId = null;
String loginPw = null;
String loginPwConfirm = null;
// ID 검사
while(true) {
System.out.print("ID : ");
loginId = sc.nextLine();
if(isJoinableLoginId(loginId) == false) {
System.out.printf("%s는 이미 사용 중인 ID 입니다. 다시 입력해 주세요.\n", loginId);
continue;
}
break;
}
// PW 검사
while(true) {
System.out.print("PW : ");
loginPw = sc.nextLine();
System.out.print("PW 확인 : ");
loginPwConfirm = sc.nextLine();
if(loginPw.equals(loginPwConfirm) == false) {
System.out.println("비밀번호가 일치하지 않습니다.");
continue;
}
break;
}
// 나머지 항목 입력 후 배열에 추가
System.out.print("이름 : ");
String name = sc.nextLine();
System.out.print("이메일 : ");
String email = sc.nextLine();
System.out.print("전화번호 : ");
String phoneNum = sc.nextLine();
guestService.add(regDate, loginId, loginPw, name, email, phoneNum);
System.out.println("회원가입이 완료되었습니다. 환영합니다!!");
}
public void doLogin() {
System.out.print("ID : ");
String loginId = sc.nextLine();
System.out.print("PW : ");
String loginPw = sc.nextLine();
Guest guest = guestService.getGuestByLoginId(loginId);
if(guest == null) {
System.out.println("입력하신 ID는 등록되지 않은 ID입니다.");
return;
}
if(guest.loginPw.equals(loginPw) == false) {
System.out.println("비밀번호를 잘못 입력하셨습니다.");
return;
}
session.setLoginedGuest(guest);
Guest loginedGuest = session.getLoginedGuest();
System.out.printf("로그인 완료!! %s님 환영합니다.\n", loginedGuest.name);
}
public void doLogout() {
session.setLoginedGuest(null);
System.out.println("로그아웃 완료!!");
}
public boolean isJoinableLoginId(String loginId) {
Guest guest = guestService.getGuestByLoginId(loginId);
if(guest == null) {
return true;
}
return false;
}
}
- 프로그램 시작과 동시에 이미 DB는 연결되었기 때문에 따로 connection을 하는 코드는 필요없다.
- doJoin() 메서드 안에서 모든 회원의 정보를 입력하고 마지막으로 [guestService.add(regDate, loginId, loginPw, name, email, phoneNum);] 라는 코드를 통해 회원을 추가하는 기능을 guestService 라는 직원을 통해 수행한다.
- 여기서 add() 메서드에 인자 값이 들어간 이유는 해당 메서드가 매개변수를 가지고 있기 때문이다.
- 두 번째로 doLogin() 메서드 안에서 회원이 로그인을 위한 ID와 PW를 입력하고 [Guest guest = guestService.getGuestByLoginId(loginId);] 코드를 통해 입력한 ID를 통해 등록된 회원의 정보를 가져오는 기능을 guestService 라는 직원을 통해 수행한다.
- 마지막으로 isJoinableLoginId() 메서드 안에서도 마찬가지로 로그인을 시도한 ID를 통해 회원의 정보를 가져오는 기능을 guestService 라는 직원을 통해 수행한다.
- 다음은 GuestService.java에 추가 작성된 코드이다.
package org.example.service;
import org.example.container.Container;
import org.example.dao.GuestDao;
import org.example.dto.Guest;
public class GuestService {
private GuestDao guestDao;
public GuestService() {
guestDao = Container.guestDao;
}
public int add(String regDate, String loginId, String loginPw, String name, String email, String phoneNum) {
Guest guest = new Guest(regDate, loginId, loginPw, name, email, phoneNum);
return guestDao.add(guest);
}
public int getNewId() {
return guestDao.getNewId();
}
public Guest getGuestByLoginId(String loginId) {
return guestDao.getGuestByLoginId(loginId);
}
}
- GuestService.java 에서는 이미 add(), getGuestByLoginId() 라는 메서드가 생성되어 있고, 해당 메서드는 다시 guestDao에게 실질적인 기능을 수행하도록 한다.
- 다음은 GuestDao.java에 추가 작성된 코드이다.
package org.example.dao;
import org.example.container.Container;
import org.example.db.DBConnection;
import org.example.dto.Guest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class GuestDao extends Dao {
public List<Guest> guests;
private DBConnection dbConnection;
public GuestDao() {
guests = new ArrayList<>();
dbConnection = Container.getDBConnection();
}
public int add(Guest guest) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("INSERT INTO `guest` "));
sb.append(String.format("SET regDate = NOW(), "));
sb.append(String.format("loginId = '%s', ", guest.loginId));
sb.append(String.format("loginPw = '%s', ", guest.loginPw));
sb.append(String.format("name = '%s', ", guest.name));
sb.append(String.format("email = '%s', ", guest.email));
sb.append(String.format("phoneNum = '%s' ", guest.phoneNum));
return dbConnection.insert(sb.toString());
}
public Guest getGuestByLoginId(String loginId) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("SELECT * "));
sb.append(String.format("FROM `guest` "));
sb.append(String.format("WHERE loginId = '%s' ", loginId));
Map<String, Object> guestRow = dbConnection.selectRow((sb.toString()));
if(guestRow.isEmpty()) {
return null;
}
return new Guest(guestRow);
}
}
- 최종적으로 GuestDao.java 에 도달하게 되면 각 메서드들의 기능을 확인할 수 있다.
- add() 메서드는 DB 쿼리문을 통해 새로 가입한 회원의 정보를 삽입하는 기능을 수행한다.
- StringBulider를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "INSERT INTO guest SET ~~" 이라는 쿼리문을 통해 회원의 정보를 새로 추가한다.
- 이렇게 쿼리문을 여러줄을 나눠서 작성할 때 유의할 점은 ,를 적재적소에 잘 사용해야한다.
- INSERT 문을 통해 삽입이 완료된다면 dbConnection과 연결하여 insert() 메서드를 실행한다.
- 실제로 DB를 통해 회원이 새로 가입되었다면 room 테이블을 SELECT 문으로 조회했을 때 해당 회원이 포함되어 있다.
- getGuestByLoginId() 메서드는 DB 쿼리문을 통해 로그인 시 입력된 ID와 일치하는 회원 정보가 있는지 조회하는 기능을 수행한다.
- StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "SELECT * FROM guest WHERE ~~" 이라는 쿼리문을 통해 회원을 조회한다.
- loginId라는 매개변수를 활용하여 하나의 회원만 조회하기 때문에 WHERE 조건문을 사용해야한다.
- 이 때 조건이 2개 이상이라면 WHERE 안에서는 ,가 아닌 AND를 사용해야한다.
- SELECT 문을 통해 조회가 완료된다면 dbConnection과 연결하여 selectRow() 메서드를 실행하고 입력한 ID와 일치한 회원의 정보가 있다면 해당 guest의 정보를 return 하고, 없다면 null을 return 해준다.
- 실제로 DB를 통해 로그인을 시도하는 회원을 조회하여 로그인이 완료되면, loginedGuest에 해당 회원을 정보를 담아둔다.
반응형
'프로젝트 > [Java] 호텔 예약 관리 프로그램 제작' 카테고리의 다른 글
[Java] 호텔 예약 관리 프로그램 제작(14) (2) | 2024.04.18 |
---|---|
[Java] 호텔 예약 관리 프로그램 제작(13) (0) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(11) (0) | 2024.04.17 |
[Java] 호텔 예약 관리 프로그램 제작(10) (0) | 2024.04.17 |
[Java] 호텔 예약 관리 프로그램 제작(9) (0) | 2024.04.17 |