gimmickbutreal

[Spring] 댓글의 페이징 처리 본문

Programming/Spring

[Spring] 댓글의 페이징 처리

isshosng 2022. 12. 20. 22:20

댓글에 대해서 우선적으로 고려해야 하는 일은 댓글 테이블(tbl_reply)에 접근할 때는 댓글의 번호(rno)가 중심이 아니라, 게시물의 번호(bno)가 중심이 되어야 한다는 점입니다. 

만일, bno가 200인 댓글을 찾고 싶을 경우엔 200에 해당하는 범위만 찾아서 사용(range scan)을 하면 효율적으로 찾을 수 있습니다. 이러한 구조를 생성하는 것을 인덱스를 생성한다고 말합니다.

 

위의 구조를 만드는 인덱스를 작성하는 SQL은 다음과 같습니다.

create index idx_reply on tbl_reply (bno desc, rno asc);

 

인덱스를 이용하면 정렬을 피할 수 있습니다. 특정한 게시물의 rno 순번대로 데이터를 조회하기 위해 아래와 같이 코드를 작성합니다 . 

idx_reply를 이용해서 테이블에 접근해 rownum이 가장 낮은 rno 값을 가지는 데이터가 1번이 되게 됩니다.댓글들을 페이징 처리하기 위해서는 해당 게시물의 전체 댓글의 숙자를 파악해서 화면에 보여주어야 합니다. ReplyMapper 인터페이스에 getCountByBno()을 추가하고, ReplyMapper.xml에도 Id 속성값이 getCountByBno인 <select>를 추가합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package org.kosa.mapper;
 
import java.util.List;
 
import org.apache.ibatis.annotations.Param;
import org.kosa.domain.Criteria;
import org.kosa.domain.ReplyVO;
 
public interface ReplyMapper {
 
    public int insert(ReplyVO vo);
 
    public ReplyVO read(Long bno);
 
    public int delete(Long bno);
 
    public int update(ReplyVO reply);
 
    public List<ReplyVO> getListWithPaging
(@Param("cri") Criteria cri, 
@Param("bno") Long bno);
 
    public int getCountByBno(Long bno);
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<select id="getListWithPaging" resultType="org.kosa.domain.ReplyVO">
 
  <![CDATA[
 select  rno, bno, reply, replyer, replydate, updatedate
 from 
   (
    select /*+INDEX(tbl_reply idx_reply) */ 
      rownum rn,  rno, bno, reply, replyer, replyDate, updatedate
    from tbl_reply
    where bno =  #{bno}
    and rno > 0
    and rownum <= #{cri.pageNum} * #{cri.amount}
   ) where rn > (#{cri.pageNum} -1) * #{cri.amount}
]]>
 
</select>
cs

 

단순히 댓글 전체를 보여주는 방식과 달리 댓글 페이징 처리가 필요한 경우에는 댓글 목록과 함께 전체 댓글의 수를 같이 전달해야만 합니다. ReplyService 인터페이스와 구현 클래스인 ReplyServiceImpl 클래스는 List<ReplyVO>와 댓글의 수를 같이 전달할 수 있는 구조로 변경합니다. 그러기 위해 두 가지 정보를 담을 수 있는 ReplyPageDTO 클래스를 정의합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.kosa.domain;
 
import java.util.List;
 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
 
@Data
@AllArgsConstructor
@Getter
public class ReplyPageDTO {
 
  private int replyCnt;
  private List<ReplyVO> list;
}
 
cs

ReplyPageDTO는 객체 생성 시에 편리하도록 @AllArgsConstructor를 이용해서 replyCnt와 lis를 생성자의 파라미터로 처리합니다. ReplyService 인터페이스와 ReplyServiceImpl 클래스에는 ReplyPageDTO를 반환하는 메서드를 추가합니다. 

 

(공부 기록용)