사이먼's 코딩노트

[Java] 게시판 제작(17) 본문

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

[Java] 게시판 제작(17)

simonpark817 2024. 4. 2. 21:35

[게시판 제작 ~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 write DB 연결]

  • 이번에는 기존에 구현되었던 List 배열인 articles를 사용하지 않고 DB와 직접 연결하여 article write 기능을 재구현 해봅시다.
public void doWrite() {
    System.out.printf("제목 : ");
    String title = sc.nextLine();
    System.out.printf("내용 : ");
    String body = sc.nextLine();

    int memberId = session.getLoginedMember().getId();
    int boardId = session.getCurrentBoard().getId();

    int newId = articleService.write(memberId, boardId, title, body);

    System.out.printf("%d번 게시물이 생성되었습니다.\n", newId);
}
  • 먼저 ArticleController.java에서 doWrite() 수정이 필요하다.
  • 기존에는 id와 regDate라는 변수를 하나씩 생성해서 메서드를 통해 값을 저장했었지만, 해당 코드는 필요없어지게 되었다.
  • memberId와 boardId는 session과 연결시켜 lombok 라이브러리를 통해 getId()를 한다.
  • articleService.write()를 통해 memberId, boardId, title, body를 모두 인자로 넘겨 DB에 연결하여 게시물을 추가하고, 각 게시물의 고유번호를 newId라는 변수에 저장한다.

 

public int write(Article article) {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("INSERT INTO `article` "));
    sb.append(String.format("SET regDate = NOW(), "));
    sb.append(String.format("updateDate = NOW(), "));
    sb.append(String.format("title = '%s', ", article.title));
    sb.append(String.format("`body` = '%s', ", article.body));
    sb.append(String.format("memberId = %d, ", article.memberId));
    sb.append(String.format("boardId = %d ", article.boardId));

    return dbConnection.insert(sb.toString());

}
  • ArticleController에서 ArticleService로 이동하고, 다시 ArticleDao로 이동하여 DB에 직접 데이터를 추가하는 코드를 작성한다.
  • return 값으로 게시물 번호를 반환해야되기 때문에 메서드의 타입은 int로 지정한다.
  • StringBuilder를 통해 INSERT 문을 작성하고 dbConnection과 연결하여 데이터를 추가한다.

 

[article detail DB 연결]

  • 이번에는 기존에 구현되었던 List 배열인 articles를 사용하지 않고 DB와 직접 연결하여 article detail 기능을 재구현 해봅시다.
public void showDetail() {
    String[] cmdBits = cmd.split(" ");
    int id = Integer.parseInt(cmdBits[2]);

    Article foundArticle = articleService.getForPrintArticle(id);

    if ( foundArticle == null ) {
        System.out.printf("%d번 게시물은 존재하지 않습니다.\n", id);
        return;
    }

    foundArticle.increaseHit();

    System.out.printf("번호 : %d\n", foundArticle.id);
    System.out.printf("날짜 : %s\n", foundArticle.regDate);
    System.out.printf("작성자 : %d\n", foundArticle.memberId);
    System.out.printf("제목 : %s\n", foundArticle.title);
    System.out.printf("내용 : %s\n", foundArticle.body);
    System.out.printf("조회 : %d\n", foundArticle.hit);
}
  • 먼저 ArticleController.java에서 showDetail() 수정이 필요하다.
  • articleService을 통해 getForPrintArticle()를 수행하면서 상세보기를 원하는 게시물을 찾는다.

 

public Article getForPrintArticle(int id) {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("SELECT A.*, M.name As writerName "));
    sb.append(String.format("FROM `article` AS A "));
    sb.append(String.format("INNER JOIN `member` AS M "));
    sb.append(String.format("ON A.memberId = M.id "));
    sb.append(String.format("WHERE A.id = %d ", id));

    Map<String, Object> row = dbConnection.selectRow(sb.toString());

    if(row.isEmpty()) {
        return null;
    }

    return new Article(row);
}
  • ArticleController에서 ArticleService로 이동하고, 다시 ArticleDao로 이동하여 DB에 직접 데이터를 조회하는 코드를 작성한다.
  • return 값으로는 상세보기를 원하는 게시물을 반환해야되기 때문에 메서드의 타입은 Article로 지정한다.
  • StringBuilder를 통해 SELECT 문을 작성하고, 이번에는 INNER JOIN을 사용해서 Member와 조인을 해준다. 

 

[article modify DB 연결]

  • 이번에는 기존에 구현되었던 List 배열인 articles를 사용하지 않고 DB와 직접 연결하여 article modify 기능을 재구현 해봅시다.
public void doModify() {
    String[] cmdBits = cmd.split(" ");

    if (cmdBits.length <= 2) {
        System.out.println("수정하고 싶은 게시물 번호를 입력해주세요.");
        return;
    }

    int id = Integer.parseInt(cmdBits[2]);

    Article foundArticle = articleService.getArticle(id);

    if (foundArticle == null) {
        System.out.printf("%d번 게시물은 존재하지 않습니다.\n", id);
        return;
    }

    Member loginedMember = session.getLoginedMember();

    if (foundArticle.memberId != loginedMember.id) {
        System.out.println("권한이 없습니다.");
        return;
    }

    System.out.printf("제목 : ");
    String title = sc.nextLine();
    System.out.printf("내용 : ");
    String body = sc.nextLine();

    articleService.modify(foundArticle.id, title, body);

    System.out.printf("%d번 게시물이 수정되었습니다.\n", foundArticle.id);
}
  • 먼저 ArticleController.java에서 doModify() 수정이 필요하다.
  • articleService을 통해 getArticle()를 수행하면서 수정을 원하는 게시물 하나만을 찾는다.

 

public int modify(int id, String title, String body) {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("UPDATE `article` "));
    sb.append(String.format("SET updateDate = NOW(), "));
    sb.append(String.format("title = '%s', ", title));
    sb.append(String.format("body = '%s' ", body));
    sb.append(String.format("WHERE id = %d ", id));

    return dbConnection.update(sb.toString());
}
  • ArticleController에서 ArticleService로 이동하고, 다시 ArticleDao로 이동하여 DB에 직접 데이터를 수정하는 코드를 작성한다.
  • return 값으로는 게시물 번호를 반환해야되기 때문에 메서드의 타입은 int로 지정한다.
  • StringBuilder를 통해 UPDATE 문을 작성하고 dbConnection과 연결하여 데이터를 추가한다.

 

[article delete DB 연결]

  • 이번에는 기존에 구현되었던 List 배열인 articles를 사용하지 않고 DB와 직접 연결하여 article delete 기능을 재구현 해봅시다.
public void doDelete() {
    String[] cmdBits = cmd.split(" ");

    if (cmdBits.length <= 2) {
        System.out.println("삭제하고 싶은 게시물 번호를 입력해주세요.");
        return;
    }

    int id = Integer.parseInt(cmdBits[2]);

    Article foundArticle = articleService.getArticle(id);

    if (foundArticle == null) {
        System.out.printf("%d번 게시물은 존재하지 않습니다.\n", id);
        return;
    }

    Member loginedMember = session.getLoginedMember();

    if (foundArticle.memberId != loginedMember.id) {
        System.out.println("권한이 없습니다.");
        return;
    }

    articleService.delete(foundArticle.id);

    System.out.printf("%d번 게시물이 삭제되었습니다.\n", id);
}
  • 먼저 ArticleController.java에서 doDelete() 수정이 필요하다.
  • articleService을 통해 getArticle()를 수행하면서 삭제를 원하는 게시물 하나만을 찾는다.

 

public int delete(int id) {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("DELETE FROM `article` "));
    sb.append(String.format("WHERE id = %d ", id));

    return dbConnection.delete(sb.toString());
}
  • ArticleController에서 ArticleService로 이동하고, 다시 ArticleDao로 이동하여 DB에 직접 데이터를 삭제하는 코드를 작성한다.
  • return 값으로는 게시물 번호를 반환해야되기 때문에 메서드의 타입은 int로 지정한다.
  • StringBuilder를 통해 DELETE 문을 작성하고 dbConnection과 연결하여 데이터를 삭제한다.

 

반응형

'프로젝트 > [Java] 게시판 제작' 카테고리의 다른 글

[Java] 게시판 제작(18)  (2) 2024.04.02
[Java] 게시판 제작(16)  (2) 2024.04.01
[Java] 게시판 제작(15)  (0) 2024.03.27
[Java] 게시판 제작(14)  (0) 2024.03.25
[Java] 게시판 제작(13)  (0) 2024.03.25