JavaStudy(open)/코딩

게시판 만들어보기(맴버 아이디 별로 게시글 작성하기, 삭제시 userName과 password 확인 후 삭제, memberId로 게시글을 조회 했을시 없는 사용자일때 예외로 던지고 예외처리 )

핑구뱅구 2021. 6. 17. 01:09

1. Member

public class Member {
	
	int memberNo;
	String memberId;	// int 대신에  String으로
	String userName;
	String password;
	
	public String getMemberId() {
		return memberId;
	}
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	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 int getMemberNo() {
		return memberNo;
	}
	public void setMemberNo(int memberNo) {
		this.memberNo = memberNo;
	}
	
}

 

2. Board

public class Board {

	int boardId;
	String title;
	String contents;
	Member member;
	
	public int getBoardId() {
		return boardId;
	}
	public void setBoardId(int boardId) {
		this.boardId = boardId;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContents() {
		return contents;
	}
	public void setContents(String contents) {
		this.contents = contents;
	}
	public Member getMember() {
		return member;
	}
	public void setMember(Member member) {
		this.member = member;
	}
	
	public String toString() {
		return  "[ 게시글 번호: " + boardId + 
				",  제목: " + title + 
				",  내용: " + contents + "]";
	}
	
}

 

3. interface - MemberService

/**
 * 게시판 기본 설계도
 * */

public interface MemberService {
	
	// execute method
	void init();
	
	// menu 출력하여 화면에 보여주어서 기능 선택
	void menu();
	
	// 회원가입
	// 숫자 id 중복확인
	// 예외처리 : 숫자 id에 문자를 기입했을 시 
	void insert();
	
	// 게시글 작성
	// 아이디 확인 후 그 게시판에 작성한 글 저장
	void write();
	
	// 게시글 삭제
	// 아이디 비밀번호 확인 후 게시글 삭제
	// 멤버 아이디별 게시판에 저장되어 있는 게시글 제목 보여주고 삭제 할 글 고르기?
	void delete();

	// 멤버 아이디별 게시글 보여주기
	// 예외처리 : 없는 사용자일때 
	void findBy();
	
	// 프로그램 종료
	void quit();
}

 

4. MemberServiceImpl

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class MemberServiceImpl implements MemberService {

	boolean run = true;
	Scanner scanner = new Scanner(System.in);
	
	// ArrayList보다 비연속적인 데이터의 추가,삭제가 빠르다. 순차적인 추가삭제는 ArrayList가 더 빠름.
	List<Board> list = new LinkedList<Board>();
	
	@Override
	public void init() {
		while(run)
			menu();
		
	}

	@Override
	public void menu() {
		System.out.println("*************");
		System.out.println("1. 게시글 작성");
		System.out.println("2. 게시글 삭제");
		System.out.println("3. 게시글 조회");
		System.out.println("4. 회원가입");
		System.out.println("*************");
		
		String input = scanner.next();
		
		switch(input) {
		
			case "1" :
				write();
				break;
			case "2" :
				delete();
				break;
			case "3" :
				findBy();
				break;
			case "4" :
				insert();
				break;
			default :
				System.out.println("잘못 입력하였습니다. 다시 입력해주세요.");
		}
		
	}

	@Override
	public void insert() {
		Member member = new Member();
		Board board = new Board();
		String id="";		// 빈문자열로 저장해야 쓸 수 있다.
		boolean run2 = true;
		
		
		while(run2) {
			System.out.println("*** 회원등록 ***");
			System.out.println(" 아이디 : ");
		
		try {
		// 아이디 중복확인
			id = scanner.next();
			
//		 숫자만 입력했을 시 일부러 예외발생(NumberFormatException)
			if(0 <= Integer.parseInt(id)) 
			
		// 처음에 list.size가 0이여서 for문이 돌지 않아서	
			if(list.size() == 0) {
				break;
			
				} else {
					
					for(int i=0; i<list.size(); i++) {
						if(id.equals(list.get(i).getMember().getMemberId())) {
							System.out.println("이미 있는 아이디입니다.");
							break;
					// break문은 자신이 포함된 가장 가까운 반복문을 벗어난다. -> for문 벗어남
					
				// else if 조건문 목적 : 이 조건문의 실행을 한번만 하기 위해
			    // 전체 데이터베이스를 확인했는데도 중복된게 없으면 while문을 빠져나가는 조건문
				} 		else if(i == list.size()-1 || i == list.size()) {
							run2 = false; 
				}
				
			}	// for 
		
			}  // else
				
			}	catch (Exception e) {
				System.out.println("숫자만 입력 할 수 없습니다.");
			}
		}	// while
			
		
		// 1. member 인스턴스에 저장
		member.setMemberId(id);
		
		System.out.println(" 이름 : ");
		member.setUserName(scanner.next());
		
		System.out.println(" 비밀번호 : ");
		member.setPassword(scanner.next());
		
		// 2. board 인스턴스에 저장
		board.setMember(member);
		
		// 3. ArrayList에 저장
		list.add(board);
		
		System.out.println(" 회원가입이 완료되었습니다.\n");
		
	}

	@Override
	public void write() {
		
		Board board = new Board();
		String password ="";
		
		System.out.println("*** 게시글 작성 ***");
		System.out.println(" 아이디 : ");
		String id = scanner.next();
		boolean run2 = true;
		
		if(list.size() == 0) {
			System.out.println(" 아이디가 없습니다. \n 회원가입 하세요. \n");

			} else { 
				for ( int i=0; i<list.size(); i++  ) {
					if(id.equals(list.get(i).getMember().getMemberId())) {
						
						while(run2) {
							System.out.println(" 비밀번호 : ");
							password = scanner.next();
						
							if(password.equals(list.get(i).getMember().getPassword())) {
								
								board.setMember(list.get(i).getMember());
								
								System.out.println(" 제목 : ");
								board.setTitle(scanner.next());
							
								System.out.println(" 내용 :");
								board.setContents(scanner.next());
							
								System.out.println(" 글 등록이 완료되었습니다.\n ");
								board.setBoardId(list.get(i).getMember().getMemberNo());
							
								// 멤버 아이디마다 게시판 글 번호 붙이기
								int no = list.get(i).getMember().getMemberNo();
								no++;	// 1 증가시키고
                                				// 1 증가시킨 걸 다시 저장
								list.get(i).getMember().setMemberNo(no); 
							
								list.add(board);
								
                                				// 글 등록이 완료 되었으니 while문 다시 돌지 않게
								run2 = false;	
							
							} else {
								System.out.println("비밀번호를 다시 입력해 주십시오.");
								// while문 돌아서 다시 비밀번호 확인
							}
						}	// while
					
					} else if(i == list.size()-1 ) {
						System.out.println(" 아이디가 없습니다. \n 회원가입 하세요. \n");
					} 	// 바깥  if
			
		}	// for
		
		}	// else문 	
		
		}	
		

	@Override
	public void delete() {
		System.out.println(" *** 게시글 삭제 *** ");
		System.out.println(" 아이디 : ");
		String id = scanner.next();
		
//		System.out.println("삭제할 글 번호를 하나 선택하세요.");
		if(0 == list.size()) {
			System.out.println(" 아이디가 없습니다. ");
			} else {
				for(int i=0; i<list.size(); i++) {
					if(id.equals(list.get(i).getMember().getMemberId())) {
					
						// 처음에 member 저장한 제목 내용이 없는 빈 board 인스턴스 출력안하게 하기
						if(null == list.get(i).getTitle())
							continue;
						
						System.out.println("***************");
						System.out.print(" "+list.get(i).getBoardId());
						System.out.print(". ");
						System.out.println(list.get(i).getTitle());
						System.out.println("***************");
						
						System.out.println(" 이 글을 삭제하시겠습니까? ");
						System.out.println(" 네 : 1번 입력 \n 아니오 : 2번 입력 ");
						
						String input = scanner.next();
						
						switch(input) {
							case "1" : 
								
								System.out.println(" 비밀번호 : "); 
								String password = scanner.next();
								if(password.equals(list.get(i).getMember().getPassword())) {
									list.remove(i);
									System.out.println(" 삭제 되었습니다. ");
									}
								
								break;
							
							case "2" : break;
						}
						
					} else if (i == list.size()-1) {
						System.out.println("아이디가 없습니다.");
					} 
									
			}	// for문
			
		}	// else문
		
	}

	@Override
	public void findBy()  {

		System.out.println(" *** 게시글 조회 *** ");
		System.out.println(" 아이디 : ");
		String id = scanner.next();
		
		// 조회시 아이디 없을때 예외 발생시켜서 예외처리하기 
		try {
			if(0 == list.size()) {
				Exception e = new Exception("아이디가 없습니다.");
				throw e;
			} else {
				for(int i=0; i<list.size(); i++) {
					if(id.equals(list.get(i).getMember().getMemberId())) {
						if( null == list.get(i).getTitle() )
							continue;
			// continue문은 반복문 내에서만 사용 될 수 있으며, 
			// 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
						
						System.out.println(list.get(i));
					} else if ( i == list.size()-1) {
						Exception e = new Exception("아이디가 없습니다.");
						throw e;
					}
					
					} // for문
			}
		} catch (Exception e) {
			System.out.println("\n"+e.getMessage()+"\n");
		}
	
	}	
	

	@Override
	public void quit() {
		run = false;
		System.out.println("프로그램이 종료되었습니다.");
		
	}

	
}

 

5. Execute

public class Execute {

	public static void main(String[] args) {
		
		MemberService ms = new MemberServiceImpl();
		ms.init();
	
	}

}