[Spring Boot 게시판] 26일차

김정현·2022년 11월 1일
0

SPRINGBOOT게시판

목록 보기
26/36

1. 댓글 작성 기능 구현

  • 댓글도 마찬가지로 ReplyController, ReplyService, ReplyRepository 먼저 만들고 기능을 추가

1) ReplyController

@RequestMapping("/usr/reply/doWrite")
	@ResponseBody
	public String doWrite(String relTypeCode, int relId, String body, String replaceUri) {

		if (Ut.empty(relTypeCode)) {
			return rq.jsHistoryBack("relTypeCode을(를) 입력해주세요");
		}

		if (Ut.empty(relId)) {
			return rq.jsHistoryBack("relId을(를) 입력해주세요");
		}

		if (Ut.empty(body)) {
			return rq.jsHistoryBack("body을(를) 입력해주세요");
		}
		ResultData writeReplyRd = replyService.writeReply(rq.getLoginedMemberId(),relTypeCode,relId,body);

		if (Ut.empty(replaceUri)) {
			switch (relTypeCode) {
			case "article":
				replaceUri = Ut.f("../article/detail?id=%d", relId);
				break;
			}
		}

		return rq.jsReplace(writeReplyRd.getMsg(), replaceUri);
  • 댓글 작성 폼으로 댓글을 작성을 시도한다면 onsubmit="ReplyWrite__submitForm(this); return false; 속성을 통해 빈 내용 시 제출 하지 않는다.
  • relTypeCode와 relId 또한 폼태그안에서 전달하고 있으므로 문제가 없으나
  • uri로 요청시 relTypeCode,relId ,body에 대한 데이터가 없다면 뒤로돌아가게 구현
  • replyService를 통해 댓글이 작성됬다면 해당 게시물 상세페이지로 replace

2) ReplyService

public ResultData writeReply(int actorId, String relTypeCode, int relId, String body) {
		
		replyRepository.writeReply(actorId,relTypeCode, relId, body);
		
		int id = replyRepository.getLastInsertId();
		
		return ResultData.from("S-1", Ut.f("%d번 댓글이 등록되었습니다", id), "id", id);
	}
  • replyRepository를 통해 DB에 댓글테이블에 댓글을 추가하고
  • 마지막으로 추가된 댓글의 아이디과 함께 ResultData로 댓글 작성 결과를 반환한다.

3) ReplyRepository

@Insert("""
			<script>
			INSERT INTO reply
			SET regDate = NOW(),
			updateDate = NOW(),
			memberId = #{actorId},
			relTypeCode = #{relTypeCode},
			relId = #{relId},
			`body` = #{body}
			</script>
			""")
	void writeReply(int actorId, String relTypeCode, int relId, String body);
	
	@Select("""
			<script>
			SELECT LAST_INSERT_ID()
			</script>
			""")
	int getLastInsertId();
  • DB에 댓글테이블에 데이터를 추가하는 쿼리문과 추가된 로우의 마지막 아이디 구하는 쿼리문

2. 댓글의 갯수 가져오기

1) Reply (vo)

public class Reply {
	private int id;
	private String regDate;
	private String updateDate;
	private int memberId;
	private String relTypeCode;
	private int relId;
	private String body;
	private int goodReactionPoint;
	private int badReactionPoint;

	private String extra__writerName;
	private boolean extra__actorCanDelete;
	private boolean extra__actorCanModify;
  • goodReactionPoint, badReactionPoint : 댓글의 좋아요/싫어요 포인트
  • extra__actorCanDelete, extra__actorCanModify : 댓글 삭제, 수정 권한 체크

2) ArticleController showDetail()

	List<Reply> replies = replyService.getForPrintReplies("article",id);
		int repliesCount = replies.size();
		model.addAttribute("repliesCount",repliesCount);
  • Service로 부터 댓글리스트를 가져오고
  • detail페이지에서 댓글의 갯수를 보여주기 위해, 댓글 갯수를 model객체에 addAttribute

3) ReplyRepository

	@Select("""
			<script>
			SELECT R.*, M.nickname AS extra__writerName
			FROM reply AS R
			LEFT JOIN `member` AS M
			ON R.memberId = M.id
			WHERE R.relTypeCode = #{relTypeCode}
			AND R.relId = #{relId}
			</script>
			""")
	List<Reply> getForPrintReplies(String relTypeCode, int relId);
  • relTypeCode(관련데이터) , relId(관련 번호) 즉 게시물데이터, 게시물 번호를 토대로 게시물의 댓글 리스트를 가져오는 쿼리문

3. 댓글테이블에 인덱스 걸기

ALTER TABLE `SB_AM`.`reply` ADD INDEX (`relTypeCode` , `relId`);
  • 댓글의 조회를 빠르게 하기위해

4. 댓글 리스팅

  • Controller에서 model객체에 addAttribute한 댓글들을 테이블로 보여줌
public String getForPrintBody() {
		return body.replaceAll("\n", "<br>");
	}
  • 위의 메서드는 댓글, 게시물의 내용의 줄바꿈 처리를 위한 메소드

0개의 댓글