간단한 게시판 프로그램을 구성해보려고 합니다.
콘솔창으로 표현되는 게시판이라 조잡하지만 기본 개념을 복습한다는 생각으로 만들어보겠습니다
회원으로 로그인 해서 게시판을 읽고 게시글을 수정, 삭제할 수 있는 기본 게시판 기능을 탑재하겠습니다.
손 가는대로 코딩하다 보니 게시판 보다 회원가입 기능을 먼저 구현했네요 (설계실패..)
기능
회원 가입, 회원정보 읽기, 회원정보 수정, 회원 삭제 등 CRUD
콘솔창에서 요청 입력
패키지 구조
코드
MemberVO.class
VO(Value Object) 클래스를 생성합니다.
참고로 toString() 메서드의 경우 IDE 자동완성 기능을 활용하면 쉽게 오버라이드해 생성할 수 있습니다.
import java.util.Date;
public class MemberVO {
private String id;
private String name;
private String pw;
private String email;
private Date registerDate;
public String getId() {
return id;
}
public MemberVO setId(String id) {
this.id = id;
return this;
}
public String getName() {
return name;
}
public MemberVO setName(String name) {
this.name = name;
return this;
}
public String getPw() {
return pw;
}
public MemberVO setPw(String pw) {
this.pw = pw;
return this;
}
public String getEmail() {
return email;
}
public MemberVO setEmail(String email) {
this.email = email;
return this;
}
public Date getRegisterDate() {
return registerDate;
}
public MemberVO setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
return this;
}
//회원정보 확인
@Override
public String toString() {
return "MemberVO{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", pw='" + pw + '\'' +
", email='" + email + '\'' +
", registerDate=" + registerDate +
'}';
}
}
MemberService.class
회원 관련 서비스를 수행할 수 있는 코드를 작성합니다.
먼저 인터페이스에 필요한 메서드를 코딩합니다.
import java.util.List;
public interface MemberService {
boolean memberSearch(String id);
void memberInsert(MemberVO vo);
MemberVO memberRead(String id);
void memberUpdate(MemberVO vo);
boolean memberDelete(String id);
List<MemberVO> memberAll();
}
MemoryMemberServiceImpl.class
위에서 작성한 MemberService 인터페이스의 구현체를 작성합니다.
메서드를 오버라이드해 로직코드를 작성합니다.
현재는 메모리에 임시로 저장하고 나중에 DB 연결할 예정이니까 Memory라고 이름을 붙여주었습니다.
import java.util.ArrayList;
import java.util.List;
public class MemoryMemberServiceImpl implements MemberService {
private static List<MemberVO> memberList;
public MemoryMemberServiceImpl() {
memberList = new ArrayList<>();
}
private static List<MemberVO> getMemberList(){
return memberList;
}
//회원정보 조회
@Override
public boolean memberSearch(String id) {
List<MemberVO> list = getMemberList();
for (MemberVO member : list) {
if(member.getId().equals(id)){
return true;
}
}
return false;
}
//회원가입
@Override
public void memberInsert(MemberVO vo) {
System.out.println("MemberServiceImpl.memberInsert");
List<MemberVO> list = getMemberList();
list.add(vo);
}
//회원정보 읽기
@Override
public MemberVO memberRead(String id) {
System.out.println("MemberServiceImpl.memberRead");
List<MemberVO> list = getMemberList();
MemberVO result = new MemberVO();
for (MemberVO member : list) {
if(member.getId().equals(id)){
result.setId(member.getId())
.setPw(member.getPw())
.setName(member.getName())
.setEmail(member.getEmail())
.setRegisterDate(member.getRegisterDate());
break;
}
}
return result;
}
//회원정보 수정
@Override
public void memberUpdate(MemberVO vo) {
System.out.println("MemberServiceImpl.memberUpdate");
List<MemberVO> list = getMemberList();
MemberVO result = null;
for (MemberVO member : list) {
if(member.getId().equals(vo.getId())){
result.setPw(member.getPw())
.setName(member.getName())
.setEmail(member.getEmail());
break;
}
}
}
//회원정보 삭제
@Override
public boolean memberDelete(String id) {
System.out.println("MemberServiceImpl.memberDelete");
List<MemberVO> list = getMemberList();
for (MemberVO member : list) {
if(member.getId().equals(id)){
list.remove(member);
return true;
}
}
return false;
}
//전체 회원정보 가져오기
@Override
public List<MemberVO> memberAll() {
System.out.println("MemberServiceImpl.memberAll");
return getMemberList();
}
}
Assembler.class
의존성 주입을 위해 구현객체를 지정해 조립(assemble)해주는 클래스입니다.
어떤 MemberService 구현체를 선택할지 지정하는 역할을 수행합니다.
public class Assembler {
public MemberService getMemberService() {
return new MemoryMemberServiceImpl();
}
}
Main.class
코드가 꽤 깁니다. 일단 실행되는 것을 확인하기 위한 코드 입니다.
실행시켜보면 잘 되는데 추후 간결한 코드로 수정해보겠습니다.
public class Main {
private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
private static final Assembler assembler = new Assembler();
private static final MemberService memberService = assembler.getMemberService();
private static final String ONLY_NUMBER = "숫자만 입력바랍니다";
private static MemberVO memberVO;
public static void main(String[] args) {
try {
while(true){
memberRequest();
}
} catch (IOException ignored) {
}
}
public static void memberRequest() throws IOException {
printHelp();
String input = reader.readLine();
System.out.println("입력값 = " + input);
if(!isNumber(input)){
System.out.println(ONLY_NUMBER);
return;
}
int request = Integer.parseInt(input);
switch (request){
case 0: //종료
exit();
case 1: //가입
String id = "";
while(true){
System.out.print("id : ");
id = reader.readLine().trim();
break;
}
memberService.memberSearch(id);
System.out.print("name : ");
String name = reader.readLine().trim();
System.out.print("pw : ");
String pw = reader.readLine().trim();
System.out.print("email : ");
String email = reader.readLine().trim();
memberVO = new MemberVO();
memberVO.setId(id)
.setPw(pw)
.setName(name)
.setEmail(email)
.setRegisterDate(new Date());
memberService.memberInsert(memberVO);
break;
case 2: //정보 확인
System.out.print("검색할 id : ");
String searchId = reader.readLine().trim();
memberVO = memberService.memberRead(searchId);
if(memberVO.getId() == null){
System.out.println("검색결과가 없습니다");
} else {
System.out.println(memberVO);
}
break;
case 3: //정보 수정
boolean search = false;
String updateId = null;
int count = 3;
for (int i = 1; i <= count; i++) {
System.out.print("수정할 id : ");
updateId = reader.readLine().trim();
search = memberService.memberSearch(updateId);
if(search) {
break;
}
System.out.println("다시 입력해주세요");
}
if(!search){
break;
}
System.out.print("수정할 name : ");
String updateName = reader.readLine().trim();
System.out.print("수정할 pw : ");
String updatePw = reader.readLine().trim();
System.out.print("수정할 email : ");
String updateEmail = reader.readLine().trim();
memberVO.setId(updateId)
.setPw(updateName)
.setName(updatePw)
.setEmail(updateEmail);
memberService.memberUpdate(memberVO);
break;
case 4: //정보 삭제
System.out.print("삭제할 id : ");
String deleteId = reader.readLine().trim();
boolean result = memberService.memberDelete(deleteId);
if(result){
System.out.println("회원정보 삭제되었습니다");
} else {
System.out.println("삭제된 정보가 없습니다");
}
break;
case 5: //정보 현황
List<MemberVO> list = memberService.memberAll();
if(list.isEmpty()){
System.out.println("회원 검색결과가 없습니다");
break;
}
System.out.println("전체 회원 현황");
for (MemberVO member : list) {
System.out.println(member);
}
System.out.println("end");
break;
default:
System.out.println("숫자를 다시 입력해주세요");
}
}
public static void printHelp() {
StringBuilder sb = new StringBuilder();
sb.append("\n-------------------------")
.append("\n원하는 서비스를 선택하세요")
.append("\n 0. 프로그램 종료")
.append("\n 1. 회원 가입")
.append("\n 2. 회원정보 확인")
.append("\n 3. 회원정보 수정")
.append("\n 4. 회원정보 삭제")
.append("\n 5. 전체회원 현황")
.append("\n-------------------------")
.append("\n입력 : ");
System.out.print(sb);
sb.setLength(0);
}
public static boolean isNumber(String s) {
boolean isNumber = false;
try {
Integer.parseInt(s);
isNumber = true;
} catch (NumberFormatException ignored) {
System.out.println("숫자변환 실패");
}
return isNumber;
}
public static void exit() throws IOException {
reader.close();
System.exit(0);
}
}
실행 결과