프로젝트/[Java] 게시판 제작

[Java] 게시판 제작(18)

simonpark817 2024. 4. 2. 22:54

[게시판 제작 ~ing]

 

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 [게시물 번호]");

 

  • 현재까지 작성 및 수정된 코드를 실행하면 다음과 같이 게시판이 동작한다.

개선된 게시판 동작 8

반응형