본문 바로가기
IT관련/JAVA_자유 노트

[수업창작] 게시판만들기 20-05-15(PP)

by XoX 2020. 5. 15.
728x90

< 구현 기능 >

1. 회원가입
- ID 중복 확인 가능 
- 로그인 중에 회원가입 불가 

- 첫번째로 회원가입 하는 사람은 관리자로 지정된다. (회원 번호 0번)

 

 

2. 로그인 
- 가입되지 않은 ID 확인 가능 
- PW 불일치 여부 확인 가능 
- 로그인 상태에서 로그인 불가 

 

 

3. 로그아웃 
- 로그아웃 상태에서 로그아웃 불가 

- 로그아웃 여부 질문에 맞는 답이 입력되지 않을 경우,

  재질문을 통해 로그아웃 할 수 있게 함.

 

 

4. 게시물 작성(추가)
- 로그인 회원만 작성(추가) 가능


5. 게시물 리스트
- 작성자 확인 가능


6. 게시물 상세보기
- 작성자 확인 가능
- 조회수, 추천수 확인 가능

 

 

7. 게시물 조회수 


8. 게시물 추천 
-중복추천 금지는 아직 불가 

 

 

9. 게시물 삭제 
- 관리자, 작성자 본인만 삭제 가능 

 

10. 게시물 수정 
- 관리자, 작성자 본인만 수정 가능 

 

 


11. 명령어 리스트 보기 

 


12. 게시판 종료



<어려운 점>

 

- 코드가 길어질 수록 복잡성에 적응하지 못하고 작은 실수가 많아진다.

- 아직 제어문을 제대로 제어하지 못한다.
for문과 if문이 중첩될 때 return, else를 적절하게 사용하는 법을 명확히 알고 있는 게 아니라
오류가 나면 예상되는 문제점을 수정해서 여러번 실행시켜보는 방식으로 오류를 해결한다.
그런데 때로는 좀 전에 작성 했던 코드가 왜 안됐는지 정확히 모르는 경우가 있다.

- 원하는 실행결과에 대한 논리구조를 짜는 데 어려움이 있다. 

- 다른 클래스의 변수값을 활용하는 데 익숙하지 않다.

- IF문의 조건 속에 어떤 변수타입이 적절할 지 파악하는 데 오래 걸린다.

- 중복되는 코드들을 하나로 만들어 정리해서 쓰는 것이 아직 어렵다.



<정원pp소감>
막히는 부분이 많아서 상대적으로 도움을 많이 받았다.
혼자했으면 오늘까지 완료하지 못 했을 문제들을 해결할 수 있게 됐다.


<혜련pp소감>
서로의 생각을 공유할 수 있어서 좋았다.
실행결과는 똑같지만 소스코드가 다르다는 것이 신기했고
상대방이 더 효율적일 코드를 쓸 경우 그걸 참고할 수 있어서 좋았다.

 


 

 

import java.util.Scanner;
import java.util.Calendar;
import java.text.SimpleDateFormat;
class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		Board board = new Board();
		board.setScanner(scanner);
		board.start();
		scanner.close();
	}
}
class Board {
	Article[] articles;
	int articleLastIndex;
	int lastArticle;
	int lastMember;
	Member[] members;
	int memberLastIndex;
	Member loginedMember;
	
	Board() {
		articles = new Article[100];
		articleLastIndex = -1;
		lastArticle = 0;
		lastMember = -1;
		members = new Member[100];
		memberLastIndex = -1;
	
	
	}
	Scanner scanner;
	void setScanner(Scanner scanner) {
		this.scanner = scanner;
	}
	void showHelp() {
		System.out.println("== 명령어 리스트 ==");
		System.out.println("help : 명령어 리스트");
		System.out.println("list : 게시물 리스팅");
		System.out.println("add : 게시물 추가");
		System.out.println("exit : 종료");
		System.out.println("detail ${게시물 번호} : 게시물 상세보기");
		System.out.println("delete ${게시물 번호} : 게시물 삭제");
		System.out.println("modify ${게시물 번호} : 게시물 수정");
		System.out.println("like ${게시물 번호} : 게시물 추천");
		System.out.println("sign_up : 회원가입");
		System.out.println("log_in : 로그인");
		System.out.println("log_out : 로그아웃");
	}
	void start() {
		showHelp();
		while( true ) {
			System.out.println("--------------------------------------------------------------------");
			System.out.printf("게시판) ");
			String command = scanner.next().trim();
			System.out.println("--------------------------------------------------------------------");
			if ( command.equals("help")) {
				scanner.nextLine();
				showHelp();
			}
			else if ( command.equals("add")) {
				scanner.nextLine();
				doCommandAdd();
			}
			else if ( command.equals("detail")) {
				int idToDetail = scanner.nextInt();
				scanner.nextLine();
				doCommandDetail(idToDetail);
			}
			else if ( command.equals("delete")) {
				int idToDelete = scanner.nextInt();
				scanner.nextLine();
				doCommandDelete(idToDelete);
			}
			else if ( command.equals("modify")) {
				int idToModify = scanner.nextInt();
				scanner.nextLine();
				doCommandModify(idToModify);
			}
			else if ( command.equals("list")) {
				scanner.nextLine();
				doCommandList();
			}
			else if ( command.equals("like")) {
				int idToLike = scanner.nextInt();
				scanner.nextLine();
				doCommandLike(idToLike);
			}
			else if ( command.equals("exit")) {
				scanner.nextLine();
				doCommandExit();
				break;
			}
			else if ( command.equals("sign_up")) {
				scanner.nextLine();
				doCommandSignUp();
			}
			else if ( command.equals("log_in")) {
				scanner.nextLine();
				doCommandLogIn();
			}
			else if ( command.equals("log_out")) {
				scanner.nextLine();
				doCommandLogOut();
			}
			else {
				scanner.nextLine();
				System.out.println("< 일치하는 항목이 존재하지 않습니다. >");
			}
		}
	}
	void doCommandLogOut() {
		if ( loginedMember == null ) {
			System.out.println("< 현재 접속 중이지 않은 상태로 로그아웃 할 수 없습니다.>");
			return;
		}
		System.out.println("\t\t\t== 로그아웃 ==");
		System.out.printf("< %s님. 로그아웃 하시겠습니까?(yes or no) >", loginedMember.userId);
		String yesOrNo = scanner.nextLine().trim();
		if ( yesOrNo.equals("yes")) {
			loginedMember = null;
			System.out.println("< 로그아웃 상태로 전환되었습니다. >");
		}
		else if ( yesOrNo.equals("no")) {
			System.out.println("< 로그인 상태를 유지합니다. >");
		}
		else {
			System.out.println("< 다시 입력바랍니다. >");
			doCommandLogOut();
		}
	}
	int getMembersCount() {
		return memberLastIndex + 1;
	}
	void doCommandLogIn() {
		if ( getMembersCount() == 0 ) {
			System.out.println("< 관리자님. 회원가입 후 게시판 관리를 부탁드립니다. >");
			return; // 처음 가입해야 하는 사람은 관리자로 지정.
		}
		
		if ( loginedMember != null ) {
			System.out.println("< 현재 접속 중으로 로그인을 하실 수 없습니다. >");
			return;
		}
		System.out.println("\t\t\t== 로그인 ==");
		System.out.printf("ID를 입력바랍니다 :");
		String loginId = scanner.nextLine();
		System.out.printf("PW를 입력바랍니다 :");
		String loginPw = scanner.nextLine();
		
		for ( int i = 0; i <= memberLastIndex; i++ ) {
			if ( members[i].userId.equals(loginId)) {
				if ( members[i].userPw.equals(loginPw)) {
					loginedMember = members[i];
					System.out.printf("< %s님. 로그인에 성공하셨습니다. >\n", loginedMember.userId);
				}
			}
			if ( members[i].userId.equals(loginId)) {
				if ( !members[i].userPw.equals(loginPw)) {
					System.out.println("< 등록된 ID로 PW가 일치하지 않습니다. >");
					System.out.println("< 다시 입력바랍니다. >");
				}
				return;
			}
		}
		System.out.println("< 등록되지 않은 ID입니다. >");
		System.out.println("< 회원가입 후 로그인 바랍니다. >");
	}
	
	void doCommandSignUp() {
		if ( loginedMember != null ) {
			System.out.println("< 현재 접속 중으로 회원가입을 하실 수 없습니다. >");
			return;
		}
		
		System.out.println("\t\t\t== 회원가입 ==");
		Member newMember = new Member();
		
		newMember.id = lastMember + 1; // 게시글 작성할 때 
		System.out.printf("ID를 입력바랍니다 : ");
		newMember.userId = scanner.nextLine();
		for ( int i = 0; i <= memberLastIndex; i++ ) {
			if ( members[i].userId.equals(newMember.userId)) {
				System.out.println("< 중복되는 ID입니다. 다시 입력바랍니다. >");
				doCommandSignUp();
				return;
			}
		}
		System.out.printf("PW를 입력바랍니다 : ");
		newMember.userPw = scanner.nextLine();
		if ( newMember.id == 0 ) {
			System.out.println("< 관리자님. 해당 게시판 관리를 잘 부탁드립니다. >");
		}// 관리자 권한 부여
		else if ( newMember.id >= 1 ) {
			System.out.printf("< %s님. %d번째 회원이 되신 것을 축하드립니다. >\n", newMember.userId, 
					newMember.id);
		}
		int newMemberLastIndex = memberLastIndex + 1;
		members[newMemberLastIndex] = newMember;
		memberLastIndex++;
		lastMember++;
	}
	void doCommandLike(int id) {
		Article article = getArticleById(id);
		System.out.println("\t\t\t== 게시물 추천 ==");
		if ( article == null ) {
			System.out.println("< 해당 게시물은 존재하지 않습니다. >");
			return;
		}
		System.out.printf("< %d번 게시물을 추천하시겠습니까?(yes or no) >", article.id);
		String yesOrNo = scanner.nextLine();
		if ( yesOrNo.equals("yes")) {
			System.out.printf("< %d번 게시물을 추천하셨습니다. >\n", article.id);
			article.like = article.like + 1;
		}
		else if ( yesOrNo.equals("no")) {
			System.out.println("< 이전으로 돌아갑니다. >");
		}
		else {
			System.out.println("< 다시 입력바랍니다. >");
			doCommandLike(id);
		}
		
	}
	void doCommandDelete(int id) {
		int index = -1;
		for ( int i = 0; i <= articleLastIndex; i++ ) {
			if ( articles[i].id == id ) {
				index = i;
				break;
			}
		
		}
		if ( index == -1 || articles[index] == null ) {
			System.out.println("< 삭제 가능한 게시물이 존재하지 않습니다. >");
			return;
		}
		if ( articles[index].memberId == loginedMember.id ||  loginedMember.id == 0) { //합쳐버림
			System.out.println("\t\t\t== 게시물 삭제 == ");
		}
		else {
			System.out.println("< 게시물 수정은 작성자 본인만 가능합니다. >");
			return;
		}
		
		System.out.printf("< %d번 게시물을 삭제하시겠습니까?(yes or no) >", articles[index].id);
		String yesOrNo = scanner.nextLine().trim();
		if ( yesOrNo.equals("yes")) {
			for ( int i = index; i <= articleLastIndex-1; i++ ) {
				articles[i] = articles[i + 1];
			}
			articleLastIndex--;
			System.out.println("< 해당 게시물 삭제를 완료하였습니다. >");
		}
		else if ( yesOrNo.equals("no")) {
			System.out.println("< 이전으로 돌아갑니다. >");
		}
		else {
			System.out.println("< 다시 입력바랍니다. >");
			doCommandDelete(id);
		}
		
	}
	void doCommandModify(int id) {
		Article article = getArticleById(id);
		if ( article == null ) {
			System.out.println("< 수정 가능한 게시물이 존재하지 않습니다. >");
			return;
		}
		if ( article.memberId == loginedMember.id || loginedMember.id == 0 ) { // 합쳐버림
			System.out.println("\t\t\t== 게시물 수정 == ");
		}
		else {
			System.out.println("< 게시물 수정은 작성자 본인만 가능합니다. >");
			return;
		}
		
		System.out.printf("< %d번 게시물을 수정하시겠습니까?(yes or no) >  ", article.id);
		String yesOrNo = scanner.nextLine().trim();
		if ( yesOrNo.equals("yes")) {
			System.out.printf("제목 : ");
			article.title = scanner.nextLine().trim();
			System.out.printf("내용 : ");
			article.body = scanner.nextLine().trim();
			System.out.printf("< %d번 게시물 수정을 완료하였습니다. >\n", article.id );
		}
		else if ( yesOrNo.equals("no")) {
			System.out.println("< 이전으로 돌아갑니다. >");
		}
		else {
			System.out.println("다시 입력바랍니다.");
			doCommandModify(id);
		}
	}
	Article getArticleById(int id) {
		for ( int i = 0; i <= articleLastIndex; i++ ) {
			if ( articles[i].id == id ) {
				return articles[i];
			}
		}
		return null;
	}
	int getArticleView(int id) {
		for ( int i = 0; i <= articleLastIndex; i++ ) {
			if ( articles[i].id == id ) {
				return articles[i].view = articles[i].view + 1;
			}
		}
		return 0;
	}
	void doCommandDetail(int id) {
		System.out.println("\t\t\t== 게시물 상세 ==");
		Article article = getArticleById(id);
		if ( article == null ) {
			System.out.println("< 해당 게시물은 존재하지 않습니다. >");
			return;
		}
		getArticleView(id);
		/*article.view = article.view + 1;    --> 위 메소드를 이렇게 한줄로 작성해도 결과는 똑같은데 
		공부할겸해서 메소드로 만들어보았어용. */
		System.out.printf("번호 : %d\n", article.id);
		System.out.printf("날짜 : %s\n", article.nowDate);
		System.out.printf("작성자 : %s\n", article.addUserId); // 해당 게시물 번호로 조회한 배열의 저장된 작성자를 불러오게 되어요.
		System.out.printf("제목 : %s\n", article.title);
		System.out.printf("내용 : %s\n", article.body);
		System.out.printf("추천수 : %d\n", article.like);
		System.out.printf("조회수 : %d\n", article.view);
		
		
		
	}
	void doCommandList() {
		System.out.println("\t\t\t== 게시물 리스트 ==");
		if ( lastArticle == 0 ) {
			System.out.println("< 게시물이 존재하지 않습니다. >");
			return;
		}
		System.out.println("  번호  |          날짜                 |             제목                      | 작성자  | 추천수 | 조회수");
		for ( int i = 0; i <= articleLastIndex; i++ ) {
			System.out.printf("    %d   | %-10s           | %-21s                 |  %-2s     |  %d     |  %d  \n", articles[i].id, articles[i].nowDate,
					articles[i].title, articles[i].addUserId, articles[i].like, articles[i].view);
		}
	}
	void doCommandAdd() {
		if ( loginedMember == null ) {
			System.out.println("< 게시물 작성은 로그인 회원만 가능합니다. >");
			return;
		}
		System.out.println("\t\t\t== 게시물 추가 ==");
		Article newArticle = new Article();
		
		newArticle.id = lastArticle + 1;
		newArticle.nowDate = getNowDate();
		System.out.printf("제목 : ");
		newArticle.title = scanner.nextLine().trim();
		System.out.printf("내용 : ");
		newArticle.body = scanner.nextLine().trim();
		newArticle.like = 0;
		newArticle.view = 0;
		newArticle.addUserId = loginedMember.userId; 
		// 게시물 list, detail 에 작성자(userId)를 나타내기 위해서 이번에는 Article 클래스에 addUserId 변수를
		//만들어서 현재 로그인 중인 (loginedMember.userId)를 저장해서 해당 게시물 배열 값에 함께 넘겨주었어용.
		newArticle.memberId = loginedMember.id; // 이렇게 로그인해있는 아이디의 id(번호: 고유번호)를 
		// 게시물 클래스 변수인 memberId에 넘겨주어서 이 번호가 일치하는 작성자의 게시물에 대해서 수정, 삭제할거에요 
		System.out.printf("< %d번 게시물이 생성되었습니다. >\n", newArticle.id);
		lastArticle++;
		int newArticleLastIndex = articleLastIndex + 1;
		articles[newArticleLastIndex] = newArticle;
		articleLastIndex++;
		
	}
	String getNowDate() {
		Calendar cal = Calendar.getInstance();
		SimpleDateFormat Date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateStr = Date.format(cal.getTime());
		return dateStr;
	}
	void doCommandExit() {
		System.out.println("\t\t\t== 게시판 종료 ==");
	}
}
class Article {
	int id;
	String nowDate;
	String title;
	String body;
	String addUserId;
	int like;
	int view;
	int memberId; // 회원가입할 때, 각 회원한테 부여하는 고유 번호로써 Member클래스의 int id 번호를 넘겨주어서 
					// 일치시켜 줄거에용 (add) 메서드 참고!
}
class Member {
	int id;   // 회원 가입 시, 회원별로 부여하는 번호(순차적으로)로써 게시물 작성할 때 이 번호를 작성 게시물 내용에 포함 시킬
				// 거에용
	String nowDate;
	String userId;
	String userPw;
	
	
}
728x90
반응형

댓글