본문으로 바로가기

[스프링]23. 대댓글 구현(스프링 레거시)

category SPRING/스프링 2021. 7. 14. 02:28
728x90
반응형
SMALL

고민

댓글에 댓글을 추가를 할수있는 기능을 생각해야한다.
댓글을 추가할땐 부모 댓글이 있을것이고 추가되어지는것은 자식댓글일 것이다.
추가되는 댓글은 꼬리에 꼬리를 물어 지속적인 계층형으로 표현해야 할것이며, 이 부분에 있어서는 무제한으로 댓글을 달수있어버리면 서버에 과부화를 줄수 있기때문에 어느정도 제한도 필요하다.

페이징의 수정도 해야한다. 기존에 댓글만 달 수 있는 기능에서 10개씩 페이징을 진행하였으나

대댓글로 인해 한 페이지에서 보여줄 수 있는 댓글 수가 늘어나기 때문에 부모 댓글을 기준으로 10개를 할것인지? 대댓글까지 포함한 수를 페이징 할 것인지 결정해야한다.



설계

현재 댓글은 내림차순으로 생성되며 최신 댓글이 맨 위로 올라가는 상황이다.

허나 대댓글을 작성하면 보통 최신 작성 글이 아래로 계속 내려가는 형식이기 때문에 구조의 변환이 필요하다.
일단 댓글을 ASC 로 하여 오름차순으로 설정한다.

 

1.필요한 것

댓글번호: Long RNO

부모번호: Long PARENT

깊이: int DEEP

그룹번호: Long GROUPNO

댓글 작성시 생성되는 순서로 RNO(댓글번호)가 생성되며,

대댓글 같은 경우 부모의 RNO 값을 PARENT 값으로 받으며 부모 자기 자신은 자신의 RNO 값PARENT값으로 갖는다

부모는 DEEP이 0부터 시작하여 대댓글이 달리는 순간부터 DEEP이 +1씩 추가된다.

추후 GROUPNO는 해당 댓글의 대댓글 숫자 파악에 쓰일것이다.

 

2.쿼리문 작성

실행 작동 순서

FROM - ON - JOIN - WHERE - GROUP BY - CUBE / ROLL UP - HAVING - SELECT - DISTINCT - ORDER BY -TOP

 

1
2
3
4
5
6
7
8
9
10
11
12
13
   select rno, bno, reply, replayer, replydate, updatedate, hide, groupno, parent, deep
        from
        (
          select
            rownum rn, rno, bno, reply, replayer, replydate, updatedate, hide, groupno, parent, deep
          from (
            select rno, bno, reply, replayer, replydate, updatedate, hide, groupno, parent, deep
            from reply 
            start with parent =0 connect by prior rno = parent
            order siblings by rno asc, groupno asc ) r
          where bno =#{bno} 
          and rownum < #{cri.pageNum} * #{cri.amount}
        ) where rn> (#{cri.pageNum}-1* #{cri.amount}
cs
 

위의 실행조건을 참고하여 쿼리문을 이해해보자

8행의 인라인 뷰부터 먼저 실행된다.

9행:start with 부모의_댓글번호 =0 : 부모의 시작조건이다. ,

connect by prior 자신의_댓글번호 = 부모댓글번호: 자신의 키와 부모의 키를 비교

10행: 계층형에서는 order by 가 따로 적용이 안되기 때문에 order siblings by 사용 : 첫번째 기준은 동일한 GROUPNO 를 오름차순으로 정렬한다.(최신 댓글이 아래쪽에 생기도록) --> 아래 표에서 RNO 와 GROUPNO 가 오름차순이 되고있는 형태를 확인 할 수 있다.

RNO 423번이 저기 있는 이유는 첫째로 RNO를 기준으로 오름차순이 진행되고 두번째 GROUPNO 기준으로 정렬되는 과정에서 저렇게 세팅됨으로서 대댓글 작성시 바로 아래 표현할수 있게된다.(실행 순서상의 이유)

728x90
반응형
LIST