이전에 올린 코드랑 별로 달라진 건 없고 쿼리만 달라졌다
public int insertComment(CommentDTO dto) {
CommentEntity comment = dto.toComment();
if (comment.getCno() != 0) { // 대댓글
handleReply(comment);
} else { // 댓글
handleComment(comment);
}
return 1;
}
private void handleComment(CommentEntity comment) {
comment.setDepth(0);
comment.setParent_cno(0);
comment.setOrder_cno(0); //
mapper.insertComment(comment);
comment.setGroup_cno(comment.getCno()); // group_cno를 새로 생성된 cno로 설정
mapper.updateGroupCno(comment);
}
private void handleReply(CommentEntity comment) {
comment.setDepth(comment.getDepth() + 1);
comment.setOrder_cno(comment.getOrder_cno()+1);
comment.setParent_cno(comment.getCno());
comment.setGroup_cno(comment.getGroup_cno());
mapper.insertComment(comment);
}
@Insert("INSERT INTO comments (bno, group_cno, parent_cno, content, depth, id, created_date, order_cno) VALUES(#{bno}, #{group_cno}, #{parent_cno}, #{content}, #{depth}, #{id}, SYSDATE, #{order_cno})")
@Options(useGeneratedKeys = true, keyProperty = "cno", keyColumn = "cno")
public int insertComment(CommentEntity commen);
@Update("UPDATE comments SET group_cno = #{group_cno} WHERE cno = #{cno}")
void updateGroupCno(CommentEntity comment);
@Select("SELECT * FROM comments WHERE bno=#{bno} START WITH parent_cno = 0 CONNECT BY PRIOR cno = parent_cno ORDER SIBLINGS BY order_cno")
public List<CommentDTO> getCommenList(int bno);
Mapper 에서 cno 가져오려고 넣은 Options 가 My SQL 에서는 KeyColumn 이 필요하지 않았는데 Oracle 은 필요하다! 꼭 넣어줘야 오류가 안 남..
댓글 정렬은 결국 오라클에서 사용 가능한 connect by 문을 썼고, 형제들의 순서는 order_cno 로 구분했다.
보통은 connect by 쓰면 depth로 비교하고 그다음 date로 order by~ 줘서 정렬할텐데
나는 My SQL 으로 로직짜느라 order_cno 컬럼이 있었기 때문에 그냥
order_cno로 같은 parent_cno 를 가진 경우 같은 레벨(형제)로 보고
형제들의 순서를 order_cno 로 정렬한 거다.
단 한 줄로 되는 걸 보니까... 허탈하고 속 시원하고 짜증나고 기쁘고 그랬다
다음에는 10초만에 할 수 있으면 좋겠다