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
기능 구현 시 에러를 방지하기 위한 기능들을 담은 파일
사용할 가장 기초적인 클래스를 담은 패키지
Member.java
프로그램에서 사용할 기본 필드, 메서드를 담은 파일
SearchData.java
멤버 검색에 필요한 필드, 메서드를 담은 파일
다시 한번 설명하자면, UI에서는 사용자가 편리하게 프로그램을 이용할 수 있도록 UI를 담당한다. 그 후 사용자가 어떠한 기능을 선택하면 Action으로 넘어가 해당 기능을 수행한다. 여기서 Action 안에는 ConsoleUtil과 svc(service)가 있다. ConsoleUtil은 해당 기능에서 필요한 입출력 및 프린트를 담당한다. 반대로 svc(service)는 해당 기능을 수행하기 위해 로직화하여 핵심 기능을 구현하는 담당을 한다. 여기서 ConsoleUtil에서 입력 에러 등의 오류를 제어해 주는 곳이 Exce다.
아이디 자동 부여는 MemberUI에 int형 static으로 id를 생성해주고, 사용할때 포맷팅(String.format)을 하여 형식에 맞게 사용했다.
Exce파일에 따로 오류를 제어할 수 있도록 분기처리를 해두었다.
이메일 주소 양식 체크는 regex를 이용하여 사용하였고 Exce파일에 분기처리를 해두었다.
Exce파일에 따로 오류를 제어할 수 있도록 분기처리를 해두었다.
해당 기능 Action 파일에 작성해두었다.
이 기능은 MemberSearchService 파일에 있던 ~byId, ~byName 메서드는 필요없기 때문에 모두 지우고 하나로 통일시켰다.
package action;
import java.util.Scanner;
public interface Action {
void execute(Scanner sc) throws Exception;
}
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);
}
}
}
}
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);
}
}
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());
}
}
}
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()));
}
}
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());
}
}
}
}
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();
}
}
}
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;
}
}
package svc;
import ui.MemberUI;
import vo.Member;
public class MemberListService {
public Member[] getMemberArray() {
return MemberUI.memberArray;
}
}
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;
}
}
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;
}
}
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;
}
}
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);
}
}
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]);
}
}
}
}
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;
}
}
}
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====================";
}
}
package vo;
public class SearchData {
private String searchValue;
public String getSearchValue() {
return searchValue;
}
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
}