사이먼's 코딩노트
[Java] 게시판 제작(17) 본문
[게시판 제작 ~ing]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 리포지터리 주소 URL : https://github.com/psm817/full_stack_proj_2024_03
[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 |