사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 17. 18:46

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[객실 조회 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에 해당 회원을 정보를 담아둔다.
반응형