[과제] 회원 관리 프로그램

김민재·2022년 6월 14일
0

폴더 구조 및 파일 설명

파일 구조

각 패키지 및 클래스 설명

  • action

    각 기능에 대한 실행할 기능을 담은 패키지

    Action.java
    공통적인 기능을 상속받아야 함으로 interface로 한 뒤, execute 함수가 있다.

    MemberDeleteAction.java
    Action.java를 상속받아 멤버 삭제시 필요한 기능들을 모아놓은 파일

    MemberListAction.java
    Action.java를 상속받아 모든 멤버를 출력할 수 있는 기능들을 모아놓은 파일

    MemberRegistAction.java
    Action.java를 상속받아 멤버 가입을 도와주는 기능들을 모아놓은 파일

    MemberSearchAction.java
    Action.java를 상속받아 멤버 검색을 도와주는 기능들을 모아놓은 파일

    MemberUpdateAction.java
    Action.java를 상속받아 멤버의 수정을 도와주는 기능들을 모아놓은 파일

  • controller

    UI와 기능을 연결해 주는 기능을 담은 패키지

    MemberController.java
    UI와 기능들을 이어주는 메서드를 담은 파일

  • svc(service)

    각 기능의 실질적인 로직을 담은 패키지

    MemberDeleteService.java
    멤버 삭제를 위한 실질적인 로직을 담은 파일

    MemberListService.java
    총 멤버 리스트를 반환하는 파일

    MemberRegistService.java
    멤버 가입를 위한 실질적인 로직을 담은 파일

    MemberSearchService.java
    멤버 검색을 위한 실질적인 로직을 담은 파일

    MemberUpdateService.java
    멤버 수정을 위한 실질적인 로직을 담은 파일

  • ui

    화면 구성을 위한 패키지

    MemberUI.java
    프로그램의 UI를 담당하는 파일

  • util

    프로그램에 유용할 수 있는 기능들을 담은 패키지

    ConsoleUtil.java
    입력받는 기능들을 담았고, 콘솔에 찍어주는 기능을 담은 파일


    Exce.java
    기능 구현 시 에러를 방지하기 위한 기능들을 담은 파일

  • vo

    사용할 가장 기초적인 클래스를 담은 패키지

    Member.java
    프로그램에서 사용할 기본 필드, 메서드를 담은 파일


    SearchData.java
    멤버 검색에 필요한 필드, 메서드를 담은 파일

회원 관리 프로그램 플로우 설명

다시 한번 설명하자면, UI에서는 사용자가 편리하게 프로그램을 이용할 수 있도록 UI를 담당한다. 그 후 사용자가 어떠한 기능을 선택하면 Action으로 넘어가 해당 기능을 수행한다. 여기서 Action 안에는 ConsoleUtil과 svc(service)가 있다. ConsoleUtil은 해당 기능에서 필요한 입출력 및 프린트를 담당한다. 반대로 svc(service)는 해당 기능을 수행하기 위해 로직화하여 핵심 기능을 구현하는 담당을 한다. 여기서 ConsoleUtil에서 입력 에러 등의 오류를 제어해 주는 곳이 Exce다.

프로그램 수정

1. 아이디 자동 부여( A001부터 시작 )

아이디 자동 부여는 MemberUI에 int형 static으로 id를 생성해주고, 사용할때 포맷팅(String.format)을 하여 형식에 맞게 사용했다.

2. 이름이 2글자 이상인지 확인

Exce파일에 따로 오류를 제어할 수 있도록 분기처리를 해두었다.

3. 이메일 주소 양식 체크

이메일 주소 양식 체크는 regex를 이용하여 사용하였고 Exce파일에 분기처리를 해두었다.

4. 데이터 수정시 빈칸 입력하면 이전 내용 그대로 유지

Exce파일에 따로 오류를 제어할 수 있도록 분기처리를 해두었다.

5. 사용자 삭제 선택 시 전체 리스트 보여주고 번호로 선택 삭제

해당 기능 Action 파일에 작성해두었다.

6. 회원검색 때 아이디 이름 둘 다로 검색

이 기능은 MemberSearchService 파일에 있던 ~byId, ~byName 메서드는 필요없기 때문에 모두 지우고 하나로 통일시켰다.

전체 코드

Action Package

Action.java

package action;

import java.util.Scanner;

public interface Action {
	void execute(Scanner sc) throws Exception;
}

MemberDeleteAction.java

package action;

import java.util.Scanner;

import svc.MemberDeleteService;
import svc.MemberListService;
import util.ConsoleUtil;

public class MemberDeleteAction implements Action{
	
	@Override
	public void execute(Scanner sc) throws Exception{
		ConsoleUtil consoleUtil = new ConsoleUtil();
		MemberListService memberListService = new MemberListService();
		boolean toggle = consoleUtil.printMemberList(memberListService.getMemberArray());
		
		if(toggle) {
			String id = consoleUtil.getId("삭제할 ", sc);
			MemberDeleteService memberDeleteService = new MemberDeleteService();
			
			boolean deleteSuccess = memberDeleteService.deleteMember(id);
			
			if(deleteSuccess) {
				consoleUtil.printDeleteSuccessMessage(id);
			}else {
				consoleUtil.printDeleteFailMessage(id);
			}	
		}
	}
}

MemberListAction.java

package action;

import java.util.Scanner;

import svc.MemberListService;
import util.ConsoleUtil;
import vo.Member;

public class MemberListAction implements Action{
	
	@Override
	public void execute(Scanner sc) throws Exception{
		ConsoleUtil consoleUtil = new ConsoleUtil();
		MemberListService memberListService = new MemberListService();
		
		Member[] memberArray = memberListService.getMemberArray();
		consoleUtil.printMemberList(memberArray);
	}
}

MemberRegistAction.java

package action;

import java.util.Scanner;

import svc.MemberRegistService;
import util.ConsoleUtil;
import vo.Member;

public class MemberRegistAction implements Action{
	
	@Override
	public void execute(Scanner sc) throws Exception{
		ConsoleUtil consoleUtil = new ConsoleUtil();
		Member newMember = consoleUtil.getNewMember(sc);

		MemberRegistService memberRegistService = new MemberRegistService();
		boolean registSuccess = memberRegistService.registMember(newMember);
		
		if(registSuccess) {
			consoleUtil.printRegistSuccessMessage(newMember.getId());
		}else {
			consoleUtil.printRegistFailMessage(newMember.getId());			
		}
	}
}

MemberSearchAction.java

package action;

import java.util.Scanner;
import svc.MemberSearchService;
import util.ConsoleUtil;
import vo.SearchData;

public class MemberSearchAction implements Action{
	
	@Override
	public void execute(Scanner sc) throws Exception{
		ConsoleUtil consoleUtil = new ConsoleUtil();
		SearchData searchData = consoleUtil.getSearchData(sc);
		MemberSearchService memberSearchService = new MemberSearchService();
		
		consoleUtil.printSearchMemberArray(memberSearchService.searchMember(searchData.getSearchValue()));
	}
}

MemberUpdateAction.java

package action;

import java.util.Scanner;

import svc.MemberUpdateService;
import ui.MemberUI;
import util.ConsoleUtil;
import vo.Member;

public class MemberUpdateAction implements Action{
	
	@Override
	public void execute(Scanner sc) throws Exception{
		ConsoleUtil consoleUtil = new ConsoleUtil();
		if(MemberUI.memberArray.length == 0) {
			System.out.println("\n추가된 회원 정보가 없습니다.");
		}else {
			String id = consoleUtil.getId("수정할 ", sc);
			
			MemberUpdateService memberUpdateService = new MemberUpdateService();
			Member oldMember = memberUpdateService.getOldMember(id);
			Member newMember = consoleUtil.getNewMember(oldMember, sc);
			boolean updateSuccess = memberUpdateService.updateMember(newMember);
			
			if(newMember == null) {
				consoleUtil.printNullMessage();
			}
			else if(updateSuccess) {
				consoleUtil.printUpdateSuccessMessage(newMember.getId());
			}else {
				consoleUtil.printUpdateFailMessage(newMember.getId());		
			}	
		}
	}
}

controller Package

MemberController.java

package controller;

import java.util.Scanner;
import action.Action;

public class MemberController {
	public void processRequest(Scanner sc, Action action) {
		try {
			action.execute(sc);
		} catch(Exception e){
			e.printStackTrace();
		}
	}
}

svc Package

MemberDeleteService.java

package svc;

import ui.MemberUI;
import vo.Member;

public class MemberDeleteService {
	public boolean deleteMember(String id) {
		boolean deleteSuccess = false;
		int index = -1;
		
		for(int i = 0; i < MemberUI.memberArray.length; i++) {
			if(MemberUI.memberArray[i].getId().equals(id)) {
				index = i;
			}
		}
		
		if(index != -1) {
			Member[] tempArray = MemberUI.memberArray;
			MemberUI.memberArray = new Member[MemberUI.memberArray.length - 1];
			
			for(int i = 0; i < tempArray.length; i++) {
				if(i < index) {
					MemberUI.memberArray[i] = tempArray[i];
				}else if(i > index) {
					MemberUI.memberArray[i - 1] = tempArray[i];
				}
			}
			deleteSuccess = true;
		}
		
		return deleteSuccess;
	}
}

MemberListService.java

package svc;

import ui.MemberUI;
import vo.Member;

public class MemberListService {
	public Member[] getMemberArray() {
		return MemberUI.memberArray;
	}
}

MemberRegistService.java

package svc;

import ui.MemberUI;
import vo.Member;

public class MemberRegistService {
	public boolean registMember(Member newMember) throws Exception{
		boolean registSuccess = true;
		
		for(int i = 0; i < MemberUI.memberArray.length; i++) {
			if(MemberUI.memberArray[i].getId() == newMember.getId()) {
				registSuccess = false;
				break;
			}
		}
		
		if(registSuccess) {
			Member[] tempArray = MemberUI.memberArray;
			MemberUI.memberArray = new Member[MemberUI.memberArray.length + 1];
			
			for(int i = 0; i < tempArray.length; i++) {
				MemberUI.memberArray[i] = tempArray[i];
			}
			MemberUI.memberArray[MemberUI.memberArray.length - 1] = newMember;
		}
		
		return registSuccess;
	}
}

MemberSearchService.java

package svc;

import ui.MemberUI;
import vo.Member;

public class MemberSearchService {
	public Member[] searchMember(String searchValue) {
		Member[] searchMemberArrayTmp = new Member[MemberUI.memberArray.length];
		int cnt = 0;

		for(int i = 0; i < MemberUI.memberArray.length; i++) {
			if(MemberUI.memberArray[i].getId().equals(searchValue) || MemberUI.memberArray[i].getId().contains(searchValue)) { // 아이디랑 같을때
				searchMemberArrayTmp[cnt++] = MemberUI.memberArray[i];
			}else if(MemberUI.memberArray[i].getName().equals(searchValue) || MemberUI.memberArray[i].getName().contains(searchValue)) { // 이름이랑 같을때
				searchMemberArrayTmp[cnt++] = MemberUI.memberArray[i];				
			}
		}
		
		Member[] searchMemberArray = null;
		if(cnt != 0) {
			searchMemberArray = new Member[cnt];
			for(int i = 0; i < searchMemberArray.length; i++) {
				searchMemberArray[i] = searchMemberArrayTmp[i];
			}
		}
		
		return searchMemberArray;
	}
}

MemberUpdateService.java

package svc;

import ui.MemberUI;
import vo.Member;

public class MemberUpdateService {
	public Member getOldMember(String id) {
		Member oldMember = null;

		for(int i = 0; i < MemberUI.memberArray.length; i++) {
			if(MemberUI.memberArray[i].getId().equals(id)) {
				oldMember = MemberUI.memberArray[i];
				break;
			}
		}

		return oldMember;
	}  
	
	public boolean updateMember(Member newMember) {
		boolean updateSuccess = false;
		
		if(newMember != null) {
			for(int i = 0; i < MemberUI.memberArray.length; i++) {
				if(MemberUI.memberArray[i].getId().equals(newMember.getId())) {
					MemberUI.memberArray[i] = newMember;
					updateSuccess = true;
					break;
				}
			}	
		}

		return updateSuccess;
	}
}

ui Package

UI.java

package ui;

import java.util.Scanner;
import action.Action;
import action.MemberDeleteAction;
import action.MemberListAction;
import action.MemberRegistAction;
import action.MemberSearchAction;
import action.MemberUpdateAction;
import controller.MemberController;
import util.Exce;
import vo.Member;

public class MemberUI {
	public static Member[] memberArray = new Member[0];
	public static int id = 0;
	
	public static void main(String[] args) {
		MemberController memberController = new MemberController();
		Exce exce = new Exce();
		boolean stop = false;
		Scanner sc = new Scanner(System.in);
		Action action = null;
		int menu = 0;
		
		
		do {
			System.out.println("\n===== 회원데이터 관리 =====");
			System.out.println("(1) 회원가입");
			System.out.println("(2) 회원 목록 보기");
			System.out.println("(3) 회원 정보 수정");
			System.out.println("(4) 회원 정보 삭제");
			System.out.println("(5) 회원 정보 검색");
			System.out.println("(6) 프로그램 종료");
			
			menu = exce.onlyIntInputWithSpace("메뉴 번호 : ", "", sc);
			
			switch(menu) {
			case 1:
				action = new MemberRegistAction();
				break;
			case 2:
				action = new MemberListAction();
				break;
			case 3:
				action = new MemberUpdateAction();
				break;
			case 4:
				action = new MemberDeleteAction();
				break;
			case 5:
				action = new MemberSearchAction();
				break;
			case 6:
				stop = true;
				System.out.println("프로그램 종료");
				break;
			}
			
			if(action != null) {
				memberController.processRequest(sc, action);
				action = null;
			}
			
		}while(!stop);
	}
}

util Package

ConsoleUtil.java

package util;

import java.util.Scanner;
import ui.MemberUI;
import vo.Member;
import vo.SearchData;

public class ConsoleUtil {
	public Member getNewMember(Scanner sc) {
		Member newMember = new Member();
		Exce exce = new Exce();
		MemberUI.id++;
		sc.nextLine();
		
		System.out.println("\n===== 새 회원 정보 등록 =====");
		System.out.printf("회원 아이디: A%03d\n", MemberUI.id);
		
		String name = exce.nameSizeCheckWithSpace("회원이름 : ", "", sc);
		
		String email = exce.emailFormCheckWithSpace("회원이메일 : ", "", sc);
		
		System.out.print("회원주소 : ");
		String addr = sc.next();
		
		System.out.print("회원취미 : ");
		String hobby = sc.next();
		
		System.out.print("회원전화번호 : ");
		String tel = sc.next();
		
		int age = exce.onlyIntInputWithSpace("회원나이(숫자) : ", "", sc);
		
		newMember.setId(String.format("A%03d", MemberUI.id)); // 아이디 자동 지정
		newMember.setName(name);
		newMember.setEmail(email);
		newMember.setAddr(addr);
		newMember.setHobby(hobby);
		newMember.setTel(tel);
		newMember.setAge(age);
		
		return newMember;
	}
	
	public void printRegistSuccessMessage(String id) {
		System.out.printf("\n%s 회원 등록 성공\n", id);
	}
	
	public void printRegistFailMessage(String id) {
		System.out.printf("\n%s 회원 등록 실패\n", id);
	}
	
	public boolean printMemberList(Member[] memberArray) {
		System.out.println();
		if(memberArray.length == 0) {
			System.out.println("추가된 회원 정보가 없습니다.");
			return false;
		}else {
			for(int i = 0; i < memberArray.length; i++) {
				System.out.println(memberArray[i]);
			}
			return true;
		}
	}
	
	public String getId(String msgKind, Scanner sc) {
			System.out.printf("\n%s 아이디 : ", msgKind);
			return sc.next();
	}
	
	public Member getNewMember(Member oldMember, Scanner sc) {
		Exce exce = new Exce();
		
		if(oldMember == null) return oldMember;
		Member member = new Member();
		sc.nextLine();
		
		System.out.println("=====새 회원 정보 수정=====");
		System.out.println("회원 아이디 : " + oldMember.getId());
		
		System.out.println("이전 회원 이름 : " + oldMember.getName());
		String name = exce.nameSizeCheckWithSpace("새 회원 이름 : ", oldMember.getName(), sc);
		
		System.out.println("이전 회원 이메일 : " + oldMember.getEmail());
		String email = exce.emailFormCheckWithSpace("새 회원 이메일 : ", oldMember.getEmail(), sc);

		System.out.println("이전 회원 주소 : " + oldMember.getAddr());
		String addr = exce.updateSpaceCheck("새 회원 주소 : ", oldMember.getAddr(), sc);
		
		System.out.println("이전 회원 취미 : " + oldMember.getHobby());
		String hobby = exce.updateSpaceCheck("새 회원 취미 : ", oldMember.getHobby(), sc);
		
		System.out.println("이전 회원 전화번호 : " + oldMember.getTel());
		String tel = exce.updateSpaceCheck("새 회원 전화번호 : ", oldMember.getTel(), sc);
		
		System.out.println("이전 회원 나이 : " + oldMember.getAge());
		int age = exce.onlyIntInputWithSpace("새 회원 나이 : ", String.valueOf(oldMember.getAge()), sc);
		
		member.setId(oldMember.getId());
		member.setName(name);
		member.setEmail(email);
		member.setAddr(addr);
		member.setHobby(hobby);
		member.setTel(tel);
		member.setAge(age);
		
		return member;
	}
	
	public void printNullMessage() {
		System.out.println("해당 ID의 회원이 없습니다.");
	}
	
	public void printUpdateSuccessMessage(String id) {
		System.out.printf("\n%s 회원 정보 수정 성공\n", id);
	}
	
	public void printUpdateFailMessage(String id) {
		System.out.printf("\n%s 회원 정보 수정 실패\n", id);
	}
	
	public void printDeleteSuccessMessage(String id) {
		MemberUI.id--;
		System.out.printf("\n%s 회원 정보 삭제 성공\n", id);
	}
	
	public void printDeleteFailMessage(String id) {
		System.out.printf("\n%s 회원 정보 삭제 실패\n", id);
	}
	
	public SearchData getSearchData(Scanner sc) {
		String searchValue = null;
		
		System.out.print("검색할 아이디/이름 : ");
		searchValue = sc.next();
		
		SearchData searchData = new SearchData();
		searchData.setSearchValue(searchValue);
		
		return searchData;
	}
	
	public void printSearchMemberArray(Member[] memberArray) {
		if(memberArray == null){
			System.out.println("\n검색한 결과가 없습니다.");
		}else {
			System.out.println("\n검색한 결과");
			for(int i = 0; i < memberArray.length; i++) {
				System.out.println(memberArray[i]);
			}
		}
	}
}

Exce.java

package util;

import java.util.Scanner;
import java.util.regex.Pattern;

public class Exce {
	Pattern pattern = Pattern.compile("^[a-zA-Z0-9+-\\_.]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"); // 이메일 형식 regex
	
	public int onlyIntInputWithSpace(String msg, String oldValue, Scanner sc) {
		String str = "";
		int n;
		
		while(true) {
			System.out.print(msg);
			try {
				if(oldValue.length() != 0) str = sc.nextLine();
				else str = sc.next();
				
				if(str.length() == 0 & oldValue.length() != 0) {
					return Integer.parseInt(oldValue);
				}else {
					n = Integer.parseInt(str);
					break;
				}	
			}catch(Exception e){
				System.out.println("숫자가 아닌 문자를 입력하였습니다! 다시 시도해 주세요.");
			}
		}
		
		return n;
	}
	
	public String nameSizeCheckWithSpace(String msg, String oldValue, Scanner sc) {
		String n;
		
		while(true) {
			System.out.print(msg);
			n = sc.nextLine();
			
			if(n.length() == 0  & oldValue.length() != 0) {
				return oldValue;
			}
			if(n.length() < 2) {
				System.out.println("이름의 크기가 2글자 이상이여야 합니다!");	
			}else break;
		}
		return n;
	}
	
	public String emailFormCheckWithSpace(String msg, String oldValue, Scanner sc) {
        String email;
        
        while(true) {
			System.out.print(msg);
	        email = sc.nextLine();
	        
			if(email.length() == 0  & oldValue.length() != 0) {
				return oldValue;
			}
	        
			if(!pattern.matcher(email).find()) {
				System.out.println("이메일 형식에 맞지 않습니다! 다시 시도해 주세요.");	
			}else break;
		}
		return email;
	}
	
	public String updateSpaceCheck(String msg, Object oldValue, Scanner sc) {
		System.out.print(msg);
		String value = sc.nextLine();
		if(value.trim().equals("")) {
			return String.valueOf(oldValue);
		}else {
			return value;
		}
	}
}

vo Package

Member.java

package vo;

public class Member {
	private String id;
	private String name;
	private String email;
	private String addr;
	private String hobby;
	private String tel;
	private int age;
	
	public String getId() {
		return id;
	}
	
	public void setId(String id) {
		this.id = id;
	}
	
	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;
	}
	
	public String getAddr() {
		return addr;
	}
	
	public void setAddr(String addr) {
		this.addr = addr;
	}
	
	public String getHobby() {
		return hobby;
	}
	
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	
	public String getTel() {
		return tel;
	}
	
	public void setTel(String tel) {
		this.tel = tel;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "====================\n회원 아이디: " + id + "\n이름: " + name + "\n이메일: " + email + "\n주소: " + addr + "\n취미: " + hobby + "\n전화번호: " + tel + "\n나이: " + age + "\n====================";
	}
}

SearchData.java

package vo;

public class SearchData {
	private String searchValue;
	
	public String getSearchValue() {
		return searchValue;
	}
	
	public void setSearchValue(String searchValue) {
		this.searchValue = searchValue;
	}
}

0개의 댓글