본문 바로가기

프로젝트 & TIL/자바 토이 프로젝트

자바 토이 프로젝트 4 - 회원가입 & 로그인 프로그램

전체 코드

main()
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Map<String, String> members = new HashMap<>();
        init(members);

        System.out.println("========= 프로그램 시작 =========");
        String answer;

        while(true){
            System.out.println("원하는 작업을 선택해주세요. (1) 로그인 / (2) 회원가입 / (0) 프로그램 종료");
            answer = br.readLine();

            if(answer.equals("0")) break;
            else if(answer.equals("1")){
                login(br, members);
            } else if(answer.equals("2")) {
                join(br, members);
            } else System.out.println("올바른 숫자를 입력해주세요.");
        }

        System.out.println("========= 프로그램 종료 =========");

        br.close();
    }
    
    ...
    
}

  

init()
    private static void init(Map<String, String> members){
        members.put("admin", "admin1234");
    }

  

login()
    private static String login(BufferedReader br, Map<String, String> members) throws IOException {
        System.out.println("========== 로그인 ==========");
        String id; String pw;
        while(true){
            System.out.print("아이디 : ");
            id = br.readLine();
            if(members.get(id) == null) System.out.println("아이디를 다시 입력해주세요.");
            else break;
        }
        while(true){
            System.out.print("비밀번호 : ");
            pw = br.readLine();
            if(!members.get(id).equals(pw)) System.out.println("비밀번호를 다시 입력해주세요.");
            else break;
        }
        System.out.println("%s 님이 로그인하셨습니다.".formatted(id));
        System.out.println("=".repeat(20));
        return id;
    }

  

join()
    private static String join(BufferedReader br, Map<String, String> members) throws IOException {
        System.out.println("========== 회원가입 ==========");
        String id; String pw1; String pw2;
        while(true){
            System.out.println("아이디는 4자 이상 20자 이하, 영문 및 숫자로 구성되어야 합니다.");
            System.out.print("아이디 : ");
            id = br.readLine();
            if(id.matches("[a-zA-Z0-9]+") && id.length() >= 4 && id.length() <= 20){
                if(members.get(id) != null) {
                    System.out.println("이미 존재하는 아이디입니다.");
                } else break;
            }
        }
        while(true){
            System.out.println("비밀번호는 6자 이상 20자 이하, 영문 및 숫자로 구성되어야 합니다.");
            System.out.print("비밀번호 : ");
            pw1 = br.readLine();
            if(pw1.matches("[a-zA-Z0-9]+") && pw1.length() >= 6 && pw1.length() <= 20){
                break;
            }
        }
        System.out.println("비밀번호를 한 번 더 입력해주세요.");
        while(true){
            System.out.print("비밀번호 확인 : ");
            pw2 = br.readLine();
            if(!pw1.equals(pw2)) System.out.println("비밀번호가 일치하지 않습니다.");
            else break;
        }
        members.put(id, pw1);
        System.out.println("%s 님의 회원가입이 완료되었습니다.".formatted(id));
        System.out.println("=".repeat(20));
        return id;
    }

  


진행 흐름

0. 회원 정보는 Map에 저장되며, admin 회원이 자동으로 저장(== 회원가입)된다.

  

        Map<String, String> members = new HashMap<>();
        init(members);
        
        ...
        
    }
        
    private static void init(Map<String, String> members){
        members.put("admin", "admin1234");
    }

  

1. 프로그램 시작과 동시에 사용자가 원하는 작업을 입력 받는다.

  

        System.out.println("========= 프로그램 시작 =========");
        String answer;

        while(true){
            System.out.println("원하는 작업을 선택해주세요. (1) 로그인 / (2) 회원가입 / (0) 프로그램 종료");
            answer = br.readLine();

  

2-1. 1을 입력하면 login 메서드가 실행된다.

  

        while(true){
            System.out.println("원하는 작업을 선택해주세요. (1) 로그인 / (2) 회원가입 / (0) 프로그램 종료");
            answer = br.readLine();

            ...
            
            else if(answer.equals("1")){
                login(br, members);
                
                ...
                
        }
        
    private static String login(BufferedReader br, Map<String, String> members) throws IOException {
        System.out.println("========== 로그인 ==========");
        
        ...
        
    }

  

2-2. 아이디와 비밀번호를 입력 받는다.

- 저장된 회원 목록에 해당하는 아이디가 없다면 다시 입력 받는다.

- 비밀번호가 올바르지 않으면 다시 입력 받는다.

- 올바른 아이디와 비밀번호를 입력하면 로그인이 완료된다.

  

    private static String login(BufferedReader br, Map<String, String> members) throws IOException {
        System.out.println("========== 로그인 ==========");
        String id; String pw;
        while(true){
            System.out.print("아이디 : ");
            id = br.readLine();
            if(members.get(id) == null) System.out.println("아이디를 다시 입력해주세요.");
            else break;
        }
        while(true){
            System.out.print("비밀번호 : ");
            pw = br.readLine();
            if(!members.get(id).equals(pw)) System.out.println("비밀번호를 다시 입력해주세요.");
            else break;
        }
        System.out.println("%s 님이 로그인하셨습니다.".formatted(id));
        System.out.println("=".repeat(20));
        return id;
    }

  

3-1. 2를 입력하면 join 메서드가 실행된다.

  

        while(true){
            System.out.println("원하는 작업을 선택해주세요. (1) 로그인 / (2) 회원가입 / (0) 프로그램 종료");
            answer = br.readLine();

            ...
            
            else if(answer.equals("2")){
                join(br, members);
                
                ...
                
        }
        
    private static String join(BufferedReader br, Map<String, String> members) throws IOException {
        System.out.println("========== 회원가입 ==========");
        
        ...
        
    }

  

3-2. 회원가입할 아이디와 비밀번호를 입력 받는다.

- 정규표현식을 통해 아이디, 비밀번호가 영문 및 숫자로 구성되어 있는지 판별한다.

- 이미 존재하는 아이디인 경우 안내와 함께 다시 입력 받는다.

- 비밀번호와 확인 비밀번호가 일치하지 않을 경우 안내와 함께 다시 입력 받는다.

- 아이디, 비밀번호, 확인 비밀번호 검증이 완료되면 회원 목록에 저장하고(members.put(id, pw1)) 회원가입이 완료된다.

  

    private static String join(BufferedReader br, Map<String, String> members) throws IOException {
        System.out.println("========== 회원가입 ==========");
        String id; String pw1; String pw2;
        while(true){
            System.out.println("아이디는 4자 이상 20자 이하, 영문 및 숫자로 구성되어야 합니다.");
            System.out.print("아이디 : ");
            id = br.readLine();
            if(id.matches("[a-zA-Z0-9]+") && id.length() >= 4 && id.length() <= 20){
                if(members.get(id) != null) {
                    System.out.println("이미 존재하는 아이디입니다.");
                } else break;
            }
        }
        while(true){
            System.out.println("비밀번호는 6자 이상 20자 이하, 영문 및 숫자로 구성되어야 합니다.");
            System.out.print("비밀번호 : ");
            pw1 = br.readLine();
            if(pw1.matches("[a-zA-Z0-9]+") && pw1.length() >= 6 && pw1.length() <= 20){
                break;
            }
        }
        System.out.println("비밀번호를 한 번 더 입력해주세요.");
        while(true){
            System.out.print("비밀번호 확인 : ");
            pw2 = br.readLine();
            if(!pw1.equals(pw2)) System.out.println("비밀번호가 일치하지 않습니다.");
            else break;
        }
        members.put(id, pw1);
        System.out.println("%s 님의 회원가입이 완료되었습니다.".formatted(id));
        System.out.println("=".repeat(20));
        return id;
    }

  


실행 화면

회원가입 -> 로그인 -> 프로그램 종료

  

admin 로그인

  

회원가입 시 아이디, 비밀번호 검증

  

로그인 시 아이디, 비밀번호 검증

  

* 작업 선택 시 올바른 입력값이 아니면 다시 입력 받는다.

  


- 회원탈퇴 기능도 고려했지만 로그인, 회원가입 흐름과 큰 차이점이 없을 것 같아 추가하지 않았다.

- 로그인 시 올바르지 않은 아이디, 비밀번호를 입력하면 단순히 "아이디(비밀번호)를 다시 입력해주세요."가 출력되고 다시 입력 받는데, 원하는 경우 로그인 작업을 끝내고 회원가입이나 프로그램 종료를 할 수 있도록 흐름을 구성해도 괜찮을 것 같다.

- 정규표현식을 살짝 잊고 있었는데, 이번 프로그램을 구현하면서 다시 공부하는 좋은 기회가 되었다.