프로젝트/[Java] 게시판 제작
[Java] 게시판 제작(18)
simonpark817
2024. 4. 2. 22:54
[게시판 제작 ~ing]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 리포지터리 주소 URL : https://github.com/psm817/full_stack_proj_2024_03
GitHub - psm817/full_stack_proj_2024_03
Contribute to psm817/full_stack_proj_2024_03 development by creating an account on GitHub.
github.com
[article list와 article detail에서 작성자 이름 나오도록 수정]
- 현재까지 구현된 article list는 DB에서 SELECT 문을 통해 조회하였을 때 번호, 조회, 제목은 모두 정상적으로 콘솔에 출력되지만, 작성자는 null 값이 출력된다.
- 이를 해결하기 위해서 ArticleController.java의 수정이 필요하다.
public void showList() {
// String searchKeyword = cmd.substring("article list".length()).trim();
// List<Article> forPrintArticles = articleService.getForPrintArticles(searchKeyword);
// if (forPrintArticles.size() == 0) {
// System.out.printf("검색어 : %s(이)가 포함된 게시물이 존재하지 않습니다.\n", searchKeyword);
// return;
// }
List<Article> forPrintArticles = articleService.getArticles(session.getCurrentBoard().id);
Board board = session.getCurrentBoard();
System.out.printf("===== %s 게시판 =====\n", board.getName());
System.out.println("번호 | 작성자 | 조회 | 제목");
for (int i = forPrintArticles.size() - 1; i >= 0; i--) {
Article article = forPrintArticles.get(i);
Member member = memberService.getMember(article.memberId);
System.out.printf("%4d | %5s | %4d | %s\n", article.id, member.name, article.hit, article.title);
}
}
public void showDetail() {
String[] cmdBits = cmd.split(" ");
if (cmdBits.length <= 2) {
System.out.println("조회하고 싶은 게시물 번호를 입력해주세요.");
return;
}
int id = Integer.parseInt(cmdBits[2]);
Article foundArticle = articleService.getForPrintArticle(id);
if (foundArticle == null) {
System.out.printf("%d번 게시물은 존재하지 않습니다.\n", id);
return;
}
foundArticle.increaseHit();
Member member = memberService.getMember(foundArticle.memberId);
System.out.printf("번호 : %d\n", foundArticle.id);
System.out.printf("날짜 : %s\n", foundArticle.regDate);
System.out.printf("작성자 : %s\n", member.name);
System.out.printf("제목 : %s\n", foundArticle.title);
System.out.printf("내용 : %s\n", foundArticle.body);
System.out.printf("조회 : %d\n", foundArticle.hit);
}
- DB를 살펴보면 현재 article 테이블에서는 작성된 회원의 이름은 찾을 수 없다.
- 대신, article 테이블의 memberId라는 컬럼값을 이용하여 회원의 고유 번호는 알 수 있다.
- 그렇기 때문에 member라는 변수를 통해 memberService와 연결하여 각 게시물의 작성자 이름을 가져올 수 있다.
- showList()와 showDetail() 부분에 [Member member = memberService.getMember()] 를 추가해주고 출력문에서 작성자가 들어갈 부분에 서식지정자 형식을 맞춰 member.name을 넣어준다.
public Member getMember(int id) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("SELECT * "));
sb.append(String.format("FROM `member` "));
sb.append(String.format("WHERE id = %d ", id));
Map<String, Object> memberRow = dbConnection.selectRow((sb.toString()));
if(memberRow.isEmpty()) {
return null;
}
return new Member(memberRow);
}
- MemberDao.java에 작성된 getMember는 매개변수로 id 값을 받게 되고, 이 때 id 값은 memberId 값과 동일한 값이라고 생각하면 좋다.
- DB의 member 테이블에서 SELECT 문을 사용해서 회원의 id가 memberId와 동일한 회원을 조회하여 해당 회원을 return해주면 ArticleController.java의 member 변수의 해당 회원의 정보가 연결된다.
[article list에서 게시판 타입별로 리스팅]
- 현재 게시판에서 article list로 게시물을 조회할 때 작성된 모든 게시물들이 조회된다.
- 이번에는 게시판 타입을 '공지' 게시판과 '자유' 게시판으로 나눠 게시판 타입별로 게시물을 조회하도록 변경해봅시다.
- 먼저 DB에는 board라는 테이블이 존재하고, code와 name을 통해 타입의 구분이 가능하다.
- article 테이블에는 boardId라는 컬럼이 존재하기 때문에 해당 컬럼값을 통해 게시판 타입을 구분할 수 있다.
public App() {
DBConnection.DB_NAME = "sbs_proj";
DBConnection.DB_USER = "sbsst";
DBConnection.DB_PASSWORD = "sbs123414";
DBConnection.DB_PORT = 3306;
Container.getDBConnection().connect();
// 프로그램 시작과 동시의 게시판 타입을 1번(공지)로 설정
Container.getSession().setCurrentBoard(Container.articleService.getBoard(1));
}
- App.java 에서 생성자에 session과 연결하여 setCurruentBoard()를 통해 프로그램 시작과 동시의 게시판 타입을 1번인 '공지' 로 설정한다.
public Board getBoard(int id) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("SELECT * "));
sb.append(String.format("FROM `board` "));
sb.append(String.format("WHERE id = %d ", id));
Map<String, Object> row = dbConnection.selectRow(sb.toString());
if(row.isEmpty()) {
return null;
}
return new Board(row);
}
- ArticleDao.java 에서는 getBoard()라는 메서드를 추가하여 DB의 board 테이블에서 id 컬럼과 article 테이블의 boardId 컬럼의 값이 같은 조건을 사용해 원하는 게시판 타입을 가져온다.
public void showList() {
// String searchKeyword = cmd.substring("article list".length()).trim();
// List<Article> forPrintArticles = articleService.getForPrintArticles(searchKeyword);
// if (forPrintArticles.size() == 0) {
// System.out.printf("검색어 : %s(이)가 포함된 게시물이 존재하지 않습니다.\n", searchKeyword);
// return;
// }
List<Article> forPrintArticles = articleService.getArticles(session.getCurrentBoard().id);
Board board = session.getCurrentBoard();
System.out.printf("===== %s 게시판 =====\n", board.getName());
System.out.println("번호 | 작성자 | 조회 | 제목");
for (int i = forPrintArticles.size() - 1; i >= 0; i--) {
Article article = forPrintArticles.get(i);
Member member = memberService.getMember(article.memberId);
System.out.printf("%4d | %5s | %4d | %s\n", article.id, member.name, article.hit, article.title);
}
}
- ArticleController.java 에서는 showList() 부분에 기존의 getArticles() 메서드에 인자를 추가하여 인자값으로 현재 적용된 게시판 타입의 id 값을 넘겨준다.
- 추가로 어떤 게시판인지 헷갈릴 수도 있기 때문에 출력문을 추가하고 getCurrentBoard()를 통해 현재 게시판 타입을 불러온다.
public List<Article> getArticles(int boardId) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("SELECT * FROM article WHERE boardId = %d ", boardId));
List<Article> articles = new ArrayList<>();
List<Map<String, Object>> rows = dbConnection.selectRows(sb.toString());
for(Map<String, Object> row : rows) {
articles.add(new Article(row));
}
return articles;
}
- 마지막으로 ArticleDao.java 에서 매개변수 boardId를 추가하고, SELECT 문에 where을 사용한 조건을 추가하여 원하는 게시판 타입에 맞게 article list 할 수 있도록 수정한다.
[명령어 모음집 추가]
- 게시판의 작업이 이제 거의 막바지를 향해 달려가고 있다.
- 개발자는 항상 사용자의 편의를 우선시해야 하기 때문에 처음 사용하는 사람은 누구나 쉽게 게시판 프로그램을 접근할 수 있도록 하는 것이 좋다.
- 그렇기 때문에 이번에는 프로그램 시작과 동시에 명령어 모음집을 출력문을 통해 출력해봅시다.
- 아래 출력문은 App.java에 작성된 코드이며, start()와 동시에 실행되도록 맨 윗줄에 작성하였다.
System.out.println("== 프로그램 시작 ==");
System.out.println("= 명령어 모음 =");
System.out.println("1. 회원가입 : member join");
System.out.println("2. 로그인/로그아웃 : member login/logout");
System.out.println("3. 현재 게시판 버전 확인 : article currBoard");
System.out.println("4. 게시판 버전 변경 : article chgBoard [게시판 번호]");
System.out.println("5. 게시물 전체 조회 : article list");
System.out.println("6. 게시물 상세 보기 : article detail [게시물 번호]");
System.out.println("7. 게시물 작성(로그인 후 이용가능) : article write");
System.out.println("8. 게시물 수정/삭제 : article modify/delete [게시물 번호]");
- 현재까지 작성 및 수정된 코드를 실행하면 다음과 같이 게시판이 동작한다.
반응형