본문 바로가기
Programming Languages/Java

Chapter 16. 회원 관리 프로그램

by 더 이프 2023. 1. 13.
728x90

목차

    1. 회원 관리 프로그램

    ■ User

    package j12_배열;
    
    // Entity(정보를 담는다)
    public class J12_User {
    	private String username; // 사용자이름(아이디, 계정)
    	private String password; // 비밀번호
    	private String name; // 성명
    	private String email; // 이메일
    
    	// ctrl + space(자동완성)
    	public J12_User() {
    
    	}
    
    	// alt + shift + s
    	public J12_User(String username, String password, String name, String email) {
    		super();
    		this.username = username;
    		this.password = password;
    		this.name = name;
    		this.email = email;
    	}
    
    	public String getUsername() {
    		return username;
    	}
    
    	public void setUsername(String username) {
    		this.username = username;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getEmail() {
    		return email;
    	}
    
    	public void setEmail(String email) {
    		this.email = email;
    	}
    
    	@Override
    	public String toString() {
    		return "J12_User [username=" + username + ", password=" + password + ", name=" + name + ", email=" + email + "]";
    	}
    
    }

    ■ UserRepository

    package j12_배열;
    
    // 저장소
    // Entity + 비즈니스 로직
    public class J12_UserRepository {
    	private J12_User[] userTable;
    
    	public J12_UserRepository(J12_User[] userTable) {
    		this.userTable = userTable;
    	}
    
    	// 외부로 가져가기 위해 getter 작성
    	public J12_User[] getUserTable() {
    		return userTable;
    	}
    
    	public void saveUser(J12_User user) {
    		extendArrayOne();
    		userTable[userTable.length - 1] = user;
    	}
    
    	private void extendArray(int length) {
    		J12_User[] newArray = new J12_User[userTable.length + length];
    		transferDataToNewArray(userTable, newArray);
    		userTable = newArray;
    	}
    
    	private void extendArrayOne() {
    		J12_User[] newArray = new J12_User[userTable.length + 1];
    		transferDataToNewArray(userTable, newArray);
    		userTable = newArray;
    	}
    
    	private void transferDataToNewArray(J12_User[] oldArray, J12_User[] newArray) {
    		for (int i = 0; i < oldArray.length; i++) {
    			newArray[i] = oldArray[i];
    		}
    	}
    
    	public J12_User findUserByUsername(String username) {
    
    		J12_User user = null;
    
    		for (J12_User u : userTable) {
            	// null 체크를 해줘야 함
    			if (u == null) { 
    				continue;
    			}
    			if (u.getUsername().equals(username)) {
    				user = u;
    				break;
    			}
    		}
    
    		return user;
    	}
    
    }

    ■ UserService

    package j12_배열;
    
    import java.lang.module.FindException;
    import java.util.Scanner;
    
    // 비즈니스 로직
    // 기능을 가지고 있는 클래스
    public class J12_UserService {
    
    	private Scanner scanner;
    	private J12_UserRepository userRepository;
    
    	// 결합도가 낮은 코드
    	public J12_UserService(Scanner scanner) {
    		// 변수에서 바로 선언하게되게 하면 컴파일 시 자동으로 생성되게 때문(사용하지 않았을 경우 메모리 소모)
    		this.scanner = scanner;
    	}
    
    	// 결합도가 높은 코드
    	public J12_UserService(J12_UserRepository userRepository) {
        	// 생성되었을 때 선언
    		scanner = new Scanner(System.in); 
    		this.userRepository = userRepository;
    	}
    
    	public void run() {
    		boolean loopFlag = true;
    		char select = '\0';
    
    		while (loopFlag) {
    			showMainMenu();
    			select = inputSelect("메인 ");
    			loopFlag = mainMenu(select);
    		}
    
    	}
    
    	public void stop() {
    		for (int i = 0; i < 10; i++) {
    			try {
    				Thread.sleep(500);
    				System.out.println("프로그램 종료중...(" + (i + 1) + "/10)");
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		System.out.println("프로그램 종료");
    	}
    
    	private char inputSelect(String menuName) {
    		System.out.print(menuName + "메뉴 선택 : ");
    		char select = scanner.next().charAt(0);
            // 버퍼 비워줌
    		scanner.nextLine();
    		return select;
    	}
    
    	private void showMainMenu() {
    		System.out.println("========<< 메인메뉴 >>========");
    		System.out.println("1. 회원 전체 조회");
    		System.out.println("2. 회원 등록");
    		System.out.println("3. 사용자 이름으로 회원 조회");
    		System.out.println("4. 회원 정보 수정");
    		System.out.println("==============================");
    		System.out.println("q. 프로그램 종료");
    		System.out.println();
    	}
    
    	private void showUsers() {
    		J12_User[] users = userRepository.getUserTable();
    
    		System.out.println("========<< 회원 전체 조회 >>========");
    
    		for (J12_User user : users) {
    			System.out.println(user.toString());
    		}
    
    		System.out.println("====================================");
    	}
    
    	private void registerUser() {
    		J12_User user = new J12_User();
    
    		System.out.println("========<< 회원 등록 >>========");
    		System.out.print("사용자이름 : ");
    		user.setUsername(scanner.nextLine());
    
    		System.out.print("비밀번호 : ");
    		user.setPassword(scanner.nextLine());
    
    		System.out.print("성명 : ");
    		user.setName(scanner.nextLine());
    
    		System.out.print("이메일 : ");
    		user.setEmail(scanner.nextLine());
    
    		userRepository.saveUser(user);
    	}
    
    	private void showUser() {
    		J12_User user = null;
    
    		System.out.println("========<< 회원 조회 >>========");
    		user = verifyUsername();
    
    		if (user == null) {
    			System.out.println("존재하지 않는 사용자이름입니다.");
    			return;
    		}
    
    		System.out.println(user.toString());
    		System.out.println("===============================");
    	}
    
    	private void updateUser() {
    		J12_User user = verifyUsername();
    		if (user == null) {
    			System.out.println("존재하지 않는 사용자이름입니다.");
    			return;
    		}
    
    		boolean loopFlag = true;
    		char select = '\0';
    
    		while (loopFlag) {
    			showUpdateMenu(user);
    			select = inputSelect("수정");
    			loopFlag = updateMenu(user, select);
    		}
    	}
    
    	private void showUpdateMenu(J12_User user) {
    		System.out.println("========<< 수정 메뉴 >>========");
    		System.out.println("사용자 이름 : " + user.getUsername());
    		System.out.println("===============================");
    		System.out.println("1. 비밀번호 변경");
    		System.out.println("2. 이름 변경");
    		System.out.println("3. 이메일 변경");
    		System.out.println("===============================");
    		System.out.println("b. 뒤로가기");
    		System.out.println();
    	}
    
    	private void updatePassword(J12_User user) {
    		String oldPassword = null;
    		String newPassword = null;
    		String confirmPassword = null;
    
    		System.out.println("========<< 비밀번호 변경 >>========");
    
    		System.out.print("기존 비밀번호 입력 : ");
    		oldPassword = scanner.nextLine();
    
    		if (!comparePassword(user.getPassword(), oldPassword)) {
    			System.out.println("비밀번호가 일치하지 않습니다.");
    			return;
    		}
    
    		System.out.print("새로운 비밀번호 입력 : ");
    		newPassword = scanner.nextLine();
    		System.out.print("새로운 비밀번호 확인 : ");
    		confirmPassword = scanner.nextLine();
    
    		if (!comparePassword(newPassword, confirmPassword)) {
    			System.out.println("새로운 비밀번호가 서로 일치하지 않습니다.");
    			return;
    		}
    
    		user.setPassword(newPassword);
    		System.out.println("비밀번호 변경 완료.");
    	}
    
    	private void updateName(J12_User user) {
    		String newName = null;
    		
    		System.out.print("새로운 이름 입력 : ");
    		newName = scanner.nextLine();
    		
    		user.setName(newName);
    		System.out.println("이름 변경 완료.");
    	}
    	
    	private void updateEmail(J12_User user) {
    		String newEmail = null;
    		
    		System.out.print("새로운 이메일 입력 : ");
    		newEmail = scanner.nextLine();
    		
    		user.setEmail(newEmail);
    		System.out.println("이메일 변경 완료.");
    	}
    	
    	private boolean comparePassword(String prePassword, String nextPassword) {
    		return prePassword.equals(nextPassword);
    	}
    
    	private boolean mainMenu(char select) {
    		boolean flag = true;
    
    		if (isExit(select)) {
    			flag = false;
    
    		} else {
    			if (select == '1') {
    				showUsers();
    			} else if (select == '2') {
    				registerUser();
    			} else if (select == '3') {
    				showUser();
    			} else if (select == '4') {
    				updateUser();
    			} else {
    				System.out.println(getSelectedErrorMessage());
    			}
    
    			System.out.println();
    		}
    		return flag;
    	}
    
    	private boolean updateMenu(J12_User user, char select) {
    		boolean flag = true;
    
    		if (isBack(select)) {
    			flag = false;
    
    		} else {
    			if (select == '1') {
    				updatePassword(user);
    			} else if (select == '2') {
    				updateName(user);
    			} else if (select == '3') {
    				updateEmail(user);
    			} else {
    				System.out.println(getSelectedErrorMessage());
    			}
    		}
    		System.out.println();
    
    		return flag;
    	}
    
    	// 리팩토링 기법
    	private boolean isExit(char select) {
    		return select == 'q' || select == 'Q';
    	}
    
    	private boolean isBack(char select) {
    		return select == 'b' || select == 'B';
    	}
    
    	// 후에 잘못된 부분 수정을 위해 return함
    	private String getSelectedErrorMessage() {
    		return "###<< 잘못된 입력입니다. 다시 입력하세요. >>###";
    	}
    
    	private J12_User verifyUsername() {
    		String username = null;
    		System.out.print("사용자이름 : ");
    		username = scanner.nextLine();
    		return userRepository.findUserByUsername(username);
    	}
    
    }

    ■ UserMain

    package j12_배열;
    
    public class J12_UserMain {
    
    	public static void main(String[] args) {
    		J12_User[] users = new J12_User[0];
    
    		J12_UserRepository userRepository = new J12_UserRepository(users);
    
    		J12_UserService service = new J12_UserService(userRepository);
    
    		service.run();
    		service.stop();
    	}
    
    }