사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 16. 22:06

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[회원가입 구현]

  • 객실을 예약하는 기능이나 다른 서비스들은 웬만하면 로그인이 되어있는 상태에서 가능하기 때문에 회원과 관련된 기능들을 먼저 구현하려 한다.
  • 먼저 guest의 데이터들은 아래와 같다.
package org.example.dto;

public class Guest extends Dto {
    public String regDate;    
    public String loginId;      
    public String loginPw; 
    public String name; 
    public String email; 
    public String phoneNum;

    public Guest(int id, String regDate, String loginId, String loginPw, String name, String email, String phoneNum) {
        this.id = id;
        this.regDate = regDate;
        this.loginId = loginId;
        this.loginPw = loginPw;
        this.name = name;
        this.email = email;
        this.phoneNum = phoneNum;
    }
}
  • dto 패키지에 속하는 모든 클래스들은 각 속성의 데이터 값을 나타낸다.
  • 모든 데이터들은 id라는 고유 값이 존재하기 때문에 Dto.java 클래스에 public int id를 선언하고, 나머지 클래스들을 Dto에 상속받게 한다.
  • 회원에 필요한 데이터들은 등록날짜, ID, PW, 이름, 이메일, 휴대전화번호이고 생성자를 통해 각 정보를 저장한다.

 

package org.example.controller;

import org.example.Util;
import org.example.dto.Guest;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class GuestController extends Controller {
    private Scanner sc;
    private String cmd;
    private List<Guest> guests;

    public GuestController() {
        sc = new Scanner(System.in);
        guests = new ArrayList<>();
    }
    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() {
        int id = guests.size() + 1;
        String regDate = String.valueOf(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();

        Guest guest = new Guest(id, regDate, loginId, loginPw, name, email, phoneNum);
        guests.add(guest);

        System.out.println("회원가입이 완료되었습니다. 환영합니다!!");

    }

    private boolean isJoinableLoginId(String loginId) {
        int index = getGuestIndexByLoginId(loginId);

        if(index == -1) {
            return true;
        }

        return false;
    }

    private int getGuestIndexByLoginId(String loginId) {
        int i = 0;

        for(Guest guest : guests) {
            if(guest.loginId.equals(loginId)) {
                return i;
            }
            i++;
        }

        return -1;
    }
}
  • 회원에 관한 모든 구현은 GuestController.java 클래스에서 진행하고, doAction() 메서드를 통해 명령어를 구분하여 서비스에 맞게 해당하는 메서드를 호출한다.
  • 회원가입에서 ID를 입력할 때는 사용자가 입력한 ID와 isJoinableLoginId() 메서드를 통해 전체 회원을 살펴보면서 이미 등록된 ID와 일치하는지 판단하고 만약 일치하지 않는다면 다음 단계로 넘어간다.
  • 다음 단계는 PW를 입력하는데, PW를 입력 후 PW 확인을 다시 하게되고 이 때 두 PW가 일치하지 않으면 다시 입력하고 일치하면 다음 단계로 넘어간다.
  • 마지막 단계는 회원의 개인 정보인 이름, 이메일 주소, 휴대전화 번호를 입력하고 회원가입을 마친다. 

 

[로그인/로그아웃 구현]

  • 로그인도 마찬가지로 회원과 관련된 서비스이기 때문에 RoomController.java 클래스에 코드를 추가 작성한다.
public void doLogin() {
    if(isLogined()) {
        System.out.println("이미 로그인 되어있습니다.");
        return;
    }

    System.out.print("ID : ");
    String loginId = sc.nextLine();
    System.out.print("PW : ");
    String loginPw = sc.nextLine();

    Guest guest = getGuestByLoginId(loginId);

    if(guest == null) {
        System.out.println("입력하신 ID는 등록되지 않은 ID입니다.");
        return;
    }

    if(guest.loginPw.equals(loginPw) == false) {
        System.out.println("비밀번호를 잘못 입력하셨습니다.");
        return;
    }

    loginedGuest = guest;
    System.out.printf("로그인 완료!! %s님 환영합니다.\n", loginedGuest.name);

}

public void doLogout() {
    if(isLogined() == false) {
        System.out.println("로그인 상태가 아닙니다.");
        return;
    }

    loginedGuest = null;
    System.out.println("로그아웃 완료!!");
}

private boolean isLogined() {
    return loginedGuest != null;
}
  • isLogined() 메서드를 통해 static으로 선언된 loginedGuest 변수가 null인지 아닌지 판단하면서 회원의 로그인을 구현한다.
  • loginedGuest를 static으로 선언한 이유는 로그인한 회원은 위 프로그램에서는 오직 한 명이기 때문에 공공재로 사용하기 위해서다.
  • 만약 isLogined()를 통해 loginedGuest에 null이 아닌 회원의 정보를 가지고 있다면, 현재 로그인이 되어있는 상태라고 판단하고 로그인 기능을 수행하지 못한다.
  • 그렇지 않다면, ID와 PW를 입력하고 여기서도 ID가 전체 회원을 살펴보면서 일치하는 ID가 없을 경우에는 등록되지 않았다는 안내와 함께 기능을 수행하지 못한다.
  • 이 과정을 모두 피해갔다면 PW를 입력하고, 만약 해당 회원의 PW를 잘못 입력했다면 비밀번호를 잘못 입력했다는 안내를 해준다.
  • 로그인이 완료된다면 현재 비어있는 loginedGuest에 해당 guest를 저장한다. 이 때부터 loginedGuest는 로그아웃 전까지는 모두 같은 회원을 가르킨다.
  • 로그아웃은 로그인보다는 심플하게 해당 명령어 입력과 동시에 isLogined() 를 통해 현재 로그인되어 있는지 확인하고 만약 로그인이 되어있다면 loginedGuest를 다시 null로 채워주고 로그아웃이 완료되었다는 안내를 해준다.  

 

 

반응형