사이먼's 코딩노트
[Java] 호텔 예약 관리 프로그램 제작(3) 본문
[호텔 예약 관리 프로그램 제작]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 깃허브 리포지터리 주소 : https://github.com/psm817/hotel_booking_proj
[회원가입 구현]
- 객실을 예약하는 기능이나 다른 서비스들은 웬만하면 로그인이 되어있는 상태에서 가능하기 때문에 회원과 관련된 기능들을 먼저 구현하려 한다.
- 먼저 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로 채워주고 로그아웃이 완료되었다는 안내를 해준다.
반응형
'프로젝트 > [Java] 호텔 예약 관리 프로그램 제작' 카테고리의 다른 글
[Java] 호텔 예약 관리 프로그램 제작(5) (0) | 2024.04.16 |
---|---|
[Java] 호텔 예약 관리 프로그램 제작(4) (0) | 2024.04.16 |
[Java] 호텔 예약 관리 프로그램 제작(2) (0) | 2024.04.16 |
[Java] 호텔 예약 관리 프로그램 제작(1) (0) | 2024.04.16 |
[Java] 호텔 예약 관리 프로그램 개요 (0) | 2024.04.16 |