롤 전적 사이트 구현 - 댓글(2)

essential·2023년 9월 1일
0

op.gg

목록 보기
11/16
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);

        // 부모 댓글의 바로 다음 order_cno 값을 찾기
        int nextOrderCno = mapper.getOrderCno(comment.getCno()) + 1;

        // nextOrderCno 값과 동일하거나 큰 order_cno를 가진 모든 댓글의 order_cno 값을 1씩 증가
        mapper.upOrderCno(comment.getBno(), nextOrderCno);

        comment.setOrder_cno(nextOrderCno);
        comment.setParent_cno(comment.getCno());
        comment.setGroup_cno(comment.getGroup_cno());
        mapper.insertComment(comment);
    }

Mapper

@Insert("INSERT INTO comments(bno, Group_cno, parent_cno, content, depth, id, comment_date, order_cno) VALUES(#{bno}, #{group_cno}, #{parent_cno}, #{content}, #{depth}, #{id}, NOW(), #{order_cno})")
@Options(useGeneratedKeys = true, keyProperty = "cno")
public int insertComment(CommentEntity commen);

@Select("SELECT `order_cno` FROM comments WHERE cno = #{cno}")
public int getOrderCnoParent(int cno);

@Update("UPDATE comments SET `order_cno` = `order_cno` + 1 WHERE bno = #{bno} AND `order_cno` >= #{startOrderCno}")
public void upOrderCno(int bno, int startOrderCno);

@Update("UPDATE comments SET group_cno = #{group_cno} WHERE cno = #{cno}")
void updateGroupCno(CommentEntity comment);

대댓글과 대대댓글 정렬 꼬임

대댓글과 대댓글의 대댓글

  • order_cno 설정
  • 지금 코드에서 대댓글과 대댓글의 대댓글 정렬이 안되는데 이유가 뭐냐면
  • 첫 대댓글을 달 때 cno (이 때 cno 는 부모의 cno 임)로 order_cno를 가져와서 +1
  • 그다음 update를 통해서 정렬을 하는데 order_cno 가 같거나 큰 값들에게 모두 +1 을 해줌
    • 이게 문제가 된다 하지만 필요한 로직이기도 함
    • 원본 댓글 1번과 대댓글 2번, 대댓글 3번을 달 경우
    • cno 123 , order_cno 123 으로 정렬이 되지 않고 cno 132 가 되어버린다
    • 3번에 대댓글을 달 경우에는 132 -> 1432가 됨 ..
  • 결국은 +1, 모든 값들에 +1 하는 경우가 다른데 이 정렬을 도대체 어떻게 하는 건지 모르겠다

그래서 오라클 connect by 쓰기로 했는데 이건 정말 하다하다 안되면 해야지

참고할 사이트
https://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

profile
essential

0개의 댓글