사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 16. 22:28

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[로그인 상태 확인 로직 Controller로 이전]

  • 회원의 로그인 상태를 확인하는 isLogined() 메서드와, 로그인된 회원의 정보를 담고있는 loginedGuest 변수는 RoomController.java 클래스 외에도 모든 컨트롤러에서 사용이 가능할 수 있기 때문에 부모인 Controller.java 클래스로 이전하는 것이 좋다.
package org.example.controller;

import org.example.dto.Guest;

public abstract class Controller {
    public static Guest loginedGuest;

    public abstract void doAction(String cmd, String actionMethodName);

    public static boolean isLogined() {
        return loginedGuest != null;
    }
}
  • 이 때 loginedGuest와 isLogined() 모두 반드시 static으로 변수와 메서드를 선언해야한다.
  • 만약 static이아닌 loginedGuest라면 무한한 로그인과 로그인을 하게 될 것이기 때문에 공공재로서 오직 하나의 값만 가지게 해야한다.

 

[로그인/로그아웃 필요한 서비스 필터링]

  • 이제는 회원에 관한 기능들을 마무리 지었기 때문에 나머지 서비스들에 대해서 isLogined를 통해 로그인이 되었을 때 실행이 가능하거나 로그아웃일 때 실행이 가능하도록 필터링을 해줄 수 있다.
  • 해당 코드는 App.java 클래스에서 서비스 명령어를 입력한 후, 각 서비스에 맞는 컨트롤러와 연결된 후에 판단한다.
while(true) {
    System.out.print("서비스를 입력해주세요) ");
    String cmd = sc.nextLine();
    cmd = cmd.trim();

    if(cmd.length() == 0) {
        continue;
    }

    if(cmd.equals("exit")) {
        break;
    }

    String[] cmdBits = cmd.split(" ");

    if(cmdBits.length == 1) {
        System.out.println("존재하지 않는 서비스입니다.");
        continue;
    }

    String controllerName = cmdBits[0];
    String actionMethodName = cmdBits[1];

    Controller controller = null;

    if(controllerName.equals("hotel")) {
        controller = hotelController;
    }
    else if(controllerName.equals("room")) {
        controller = roomController;
    }
    else if(controllerName.equals("booking")) {
        controller = bookingController;
    }
    else if(controllerName.equals("guest")) {
        controller = guestController;
    }
    else {
        System.out.println("존재하지 않는 서비스입니다.");
        continue;
    }

    String actionName = controllerName + "/" + actionMethodName;

    // 로그인을 요구하는 서비스
    switch(actionName) {
        case "booking/room" :
        case "booking/check" :
        case "booking/modify" :
        case "booking/delete" :
        case "guest/logout" :
        case "booking/review" :
            if(Controller.isLogined() == false) {
                System.out.println("로그인 후 이용가능합니다.");
                continue;
            }
            break;
    }

    // 로그아웃을 요구하는 서비스
    switch(actionName) {
        case "guest join" :
        case "guest login" :
            if(Controller.isLogined()) {
                System.out.println("로그아웃 후 이용가능합니다.");
                continue;
            }
            break;
    }

    controller.doAction(cmd, actionMethodName);

}
  • 서비스 입력은 무한루프 while(true)를 통해 프로그램 종료인 'exit'가 입력되기 전까지 계속해서 실행된다.
  • 모든 서비스들은 room list 와 같이 2개의 단어를 작성하게 되는데 이 때 split()를 사용하여 띄어쓰기 된 부분을 기준으로 문자열을 나눈다.
  • 큰 기능 역할을 부분을 앞 단어에서 가져와 controllerName에 저장하고, 세부 기능 역할 부분을 뒷 단어에서 가져와 actionMethodName에 저장한다.
  • 그 다음 switch 문을 통해 로그인이 필요한 서비스와 로그아웃이 필요한 서비스를 나눠 isLogined() 메서드를 통한 조건문을 추가하여 필터링을 한다. 
  • switch 문에 포함되지 않는 서비스들은 로그인/로그아웃과 관계없이 이용이 가능한 서비스들이다.

 

[서비스 다시보기 추가]

  • 서비스들이 많아짐에 따라 프로그램 시작 시 나타나는 모음집을 다시 보고 싶을 때가 있을 것이라 생각이 든다.
  • 현재 상태에서는 프로그램을 재시작해야만 서비스 모음집을 다시 볼 수 있기 때문에 이런 번거로움을 조금이라도 덜어내기 위해 서비스 다시보기 명령어도 추가하려한다.
  • 해당 코드는 App.java 클래스에 추가해주면 된다. 아래 코드는 추가한 코드만 보여주기 위해 구현되었던 다른 코드들은 잠시 보이지 않도록 한 점 참고 부탁드립니다.
package org.example;


public class App {
    public void start() {
        callAllServices();

        while(true) {
            System.out.print("서비스를 입력해주세요) ");
            String cmd = sc.nextLine();
            cmd = cmd.trim();

            if(cmd.equals("service")) {
                callAllServices();
                continue;
            }
        }
    }

    private void callAllServices() {
        System.out.println("호텔 예약 관리 시스템에 오신 것을 환영합니다.");
        System.out.printf("오늘 날짜 : %s", Util.getTodayDate());
        System.out.printf("\n");
        System.out.println("=============== 서비스 모음 ===============");
        System.out.println("1. 호텔 소개 : hotel introduce");
        System.out.println("2. 객실 예약현황 : room list");
        System.out.println("3. 객실 예약하기 : booking room");        // id, roomId, floor, guestName, guestPhone, type, regDate
        System.out.println("4. 예약 확인하기 : booking check");
        System.out.println("5. 예약정보 수정 : booking modify");
        System.out.println("6. 예약 취소 : booking delete");
        System.out.println("7. 로그인/로그아웃 : guest login/logout");
        System.out.println("8. 회원 가입 : guest join");
        System.out.println("9. 리뷰 남기기 : booking review");
        System.out.println("10. 서비스 다시보기 : service");
        System.out.println("===========================================");
        System.out.printf("\n");
    }
}
  • App.java 클래스의 start()와 동시에 callAllServices() 라는 메서드를 호출하여 프로그램 시작과 동시에 서비스 모음집을 제공한다.
  • callAllServices() 메서드는 App.java 클래스의 하단에 배치하였다.
  • 무한루프를 통해 서비스 명령어를 입력하는 부분에서 조건문을 통해 만약 명령어가 'service' 라면 다시 한번 callAllServices() 를 호출하여 서비스 모음집을 다시 보여준다.
반응형