댓글을 저장하기 위해서는 2가지를 고려해야 한다.
먼저, 게시물에 대하여 댓글을 달은 경우와 댓글에 댓글을 달은 경우이다.
게시물에 대하여 댓글을 달은 경우는 부모가 없는 경우로 깊이(redepth)가 0이된다.
개발자에 따라 차이가 있지만 부모가 없다는 걸 의미하기 위해 깊이를 0으로 주고
그 외에 reparent 값을 0으로 주거나 reparent 값을 reno로 준다.
여기에서는 reparent 값을 reno로 주었다.
순서(reorder)값은 게시물 내에서 최대값을(selectBoard6ReplyMaxOrder)을 가지게 된다.
댓글에 댓글을 달은 경우는
부모 댓글의 정보(selectBoard6ReplyParent)를 가지고 와서
깊이(redepth)는 부모 댓글에 1을 더한 값을 가지고
순서(reorder)도 부모 순서에 1 더한 값을 가진다.
부모(reparent)는 부모 댓글의 댓글 번호(reno)를 지정한다.
여기서는 깊이는 Java에서 1 더했고, 순서는 SQL에서 1을 더했다.
어느 쪽에서 처리해도 되지만 개인적으로 SQL에서 처리하는 것을 선호한다.
public void insertBoardReply(BoardReplyVO param) {
if (param.getReno() == null || "".equals(param.getReno())) {
if (param.getReparent() != null) {
BoardReplyVO replyInfo = sqlSession.selectOne("selectBoard6ReplyParent", param.getReparent());
param.setRedepth(replyInfo.getRedepth());
param.setReorder(replyInfo.getReorder() + 1);
sqlSession.selectOne("updateBoard6ReplyOrder", replyInfo);
} else {
Integer reorder = sqlSession.selectOne("selectBoard6ReplyMaxOrder", param.getBrdno());
param.setReorder(reorder);
}
sqlSession.insert("insertBoard6Reply", param);
} else {
sqlSession.insert("updateBoard6Reply", param);
}
}
Board6Svc.java
<select id="selectBoard6ReplyParent" resultType="gu.board6.BoardReplyVO" parameterType="String">
SELECT BRDNO, REDEPTH+1 REDEPTH, REORDER
FROM TBL_BOARDREPLY
WHERE RENO=#{reparent}
</select>
<select id="selectBoard6ReplyMaxOrder" resultType="Integer" parameterType="String">
SELECT IFNULL(MAX(REORDER),0)+1
FROM TBL_BOARDREPLY
WHERE BRDNO=#{brdno}
</select>
<update id="updateBoard6ReplyOrder" parameterType="gu.board6.BoardReplyVO">
UPDATE TBL_BOARDREPLY
SET REORDER = REORDER + 1
WHERE BRDNO=#{brdno} AND REORDER>#{reorder}
</update>
board6.xml
마지막으로 저장하기 전에
updateBoard6ReplyOrder를 실행해서 부모 댓글의 순서(reorder)보다 큰 값들을 1씩 증가 시켜야 한다.
이유는 기본 개념에서 설명했다.
저장(INSERT)은 다음과 같이 바꾸어야 한다.
<insert id="insertBoard6Reply" parameterType="gu.board6.BoardReplyVO" >
<selectKey resultType="String" keyProperty="reno" order="BEFORE">
SELECT IFNULL(MAX(RENO),0)+1 FROM TBL_BOARDREPLY
</selectKey>
INSERT INTO TBL_BOARDREPLY(BRDNO, RENO, REWRITER, REDELETEFLAG, REMEMO, REDATE, REORDER, REPARENT, REDEPTH)
VALUES (#{brdno}, #{reno}, #{rewriter}, 'N', #{rememo}, NOW(), #{reorder},
<choose>
<when test="reparent==null">#{reno}, 0</when>
<otherwise>#{reparent}, #{redepth}</otherwise>
</choose>
)
</insert>
board6.xml
순서는 자바에서 처리해서 넘어오기 때문에 그대로 저장한다.
다만, 부모 댓글과 깊이는
게시물에 대한 댓글일 경우(부모가 없는 경우, reparent==null)에는 자기 번호와 0을 주고
댓글의 댓글일 경우는 Java에서 처리된 값을 가지게 된다.
이러한 처리도 Java에서 처리하면 되지만 여기서는 MyBatis에서 처리했다.
개발자의 선택사항이고 이 경우에는 개인적으로는 자바에서 처리하는 걸 선호한다.
수정은 기존 코드 그대로 지정된 댓글번호에 대하여 UPDATE문을 실행한다.
'Java > 게시판 6: 무한댓글' 카테고리의 다른 글
1. 무한 댓글 시작하기 (14) | 2016.05.15 |
---|---|
2. 무한 댓글 리스트 (11) | 2016.05.15 |
4. 무한 댓글 쓰기 – JSP (0) | 2016.05.15 |
5. 무한 댓글 삭제 (1) | 2016.05.15 |
6. 무한 댓글 삭제 II (0) | 2016.05.15 |