[Spring] 댓글의 페이징 처리 - Data 처리편
도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
이전 글
2021.08.14 - [Spring] - [Spring] 댓글의 수정/삭제 이벤트 처리
2021.08.14 - [Spring] - [Spring] 특정 댓글의 클릭 이벤트 처리
2021.08.13 - [Spring] - [Spring] 새로운 댓글 처리
2021.08.11 - [Spring] - [Spring] 댓글 목록 HTML 처리
2021.08.11 - [Spring] - [Spring] 댓글 삭제, 수정, 조회
2021.08.11 - [Spring] - [Spring] 댓글의 목록 처리 (javascript)
2021.08.10 - [Spring] - [Spring] 댓글 처리 Front-End - 등록 처리 -
2021.08.09 - [Spring] - [Spring] 댓글 처리 Front-End - 세팅편 -
도움되는 글
MariaDB에서의 쿼리 계획(Query Plan) 활용
댓글의 페이징 처리 1
현재 작성된 예제는 해당 게시물의 전체 댓글을 가져와서 화면에 출력합니다. 문제는 댓글의 숫자가 많을 경우, 데이터베이스에서 많은 양의 데이터를 가져와야 하고, 이는 성능 문제를 가져올 수 있습니다. 일반적으로 이런 문제를 페이징 처리를 이용해서 처리합니다.
댓글을 조회할 때 해당 게시물 번호(seq_bno)가 중심이 됩니다. 하지만 tb_reply 테이블의 PK는 seq_rno이므로, 테이블에 저장되어 있는 모습 보면 '게시물 번호'에 대한 데이터들이 떨어져 있는 형태로 구성되어 있습니다.
효율을 높이고 싶다면 게시물의 번호(seq_bno)에 맞게 댓글들을 모아 빠르게 찾을 수 있는 구조로 만드는 것이 좋습니다.
이러한 구조를 생성하는 것을 '인덱스를 생성한다'고 표현합니다. 인덱스를 사용하여 페이징 처리를 진행합니다.
-- 인덱스 생성
CREATE INDEX idx_reply ON tb_reply (seq_bno DESC, seq_rno ASC);
-- 인덱스 확인
SHOW INDEX FROM tb_reply
인덱스를 이용하는 이유 중에 하나는 정렬을 피할 수 있기 때문입니다. 특정한 게시물의 댓글 번호(seq_rno)가 순번대로 나열된 것을 다음 SQL로 확인합니다.
-- 인덱스 활용 SELECT 1
SELECT seq_bno, seq_rno FROM tb_reply USE INDEX (idx_reply)
-- 인덱스 활용 SELECT, 내용 확인
EXPLAIN SELECT * REPLY FROM tb_reply USE INDEX (idx_reply)
WHERE SEQ_BNO = '777'
만들어 둔 idx_reply 인덱스를 활용해서 데이터 접근을 하는 것을 확인할 수 있습니다. EXPLAIN에 대한 설명은 해당 글 제일 위해 도움되는 글로 링크 걸어두었습니다.
댓글의 페이징 처리 2
샘플로 먼저 사용할 SQL를 작업하여 테스트를 진행합니다. 제가 작성한 SQL은 다음과 같습니다.
SELECT *
FROM
(
SELECT
@rn := @rn + 1 AS RN , A.*
FROM tb_reply AS A USE INDEX (idx_reply)
CROSS JOIN (SELECT @rn := 0 ) AS R
WHERE A.SEQ_BNO = 783
) AS R
WHERE RN > (1 - 1) * 10
LIMIT 10
ReplyMapper.xml에 페이징 처리 쿼리를 반영합니다.
테스트 코드를 통해 최종적인 결과를 확인합니다. 테스트 코드 작성 위치는 'src/test/java' 폴더 아래 com.project.mapper 패키지 아래 작성했습니다.
테스트 결과
SQL 쿼리 결과 및 ReplyMapperTests.java 실행 결과
페이지(pageNum)와 가지고 올 데이터 수(amount)에 맞게 데이터를 가져오도록 처리했습니다.
댓글의 숫자 파악
댓글들을 페이징 처리하기 위해서는 해당 게시물의 전체 댓글의 숫자를 파악해서 화면에 보여줄 필요가 있습니다. ReplyMapper 인터페이스에 getCountBySeq_bno( )를 추가합니다.
com.project.mapper 패키지 > ReplyMapper 인터페이스
ReplyMapper.xml에는 id속성값이 getCountBySeq_bno인 <select>를 추가합니다.
ReplyServiceImpl에서 댓글과 댓글 수 처리
댓글 전체를 보여주는 방식과 달리 댓글의 페이징 처리가 필요한 경우에는 댓글 목록과 함께 전체 댓글의 수를 같이 전달해야만 합니다. ReplyService 인터페이스와 구현 클래스인 ReplyServiceImpl 클래스는 List<ReplyVO>와 댓글의 수를 같이 전달할 수 있는 구조로 변경합니다.
ReplyPageDTO 클래스 정의
ReplyService 인터페이스와 ReplyServiceImpl 클래스에는 ReplyPageDTO를 반환하는 메서드를 추가합니다.
ReplyService 인터페이스
ReplyServiceImpl 클래스
ReplyController 수정
ReplyController에서는 ReplyService에 새롭게 추가된 getListPage( )를 호출하고 데이터를 전송하는 형태로 수정합니다.
ReplyController의 일부
url 테스트
ReplyPageDTO객체를 JSON으로 전송하게 되므로, 특정 게시물의 댓글 목록을 조회하면 'replyCnt'와 'list'라는 이름의 속성을 갖는 JSON 문자열이 전송됩니다.
오늘은 댓글의 페이징 처리에서 데이터를 처리하는 방법에 대해 알아보았습니다. 댓글 페이지의 화면을 처리하는 방법으로 댓글 관련 처리가 마무리 될 것 같습니다.
도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
'java, spring' 카테고리의 다른 글
[Spring]AOP, Aspect-Oriented Programming/관점 지향 프로그래밍 개념 이해하기 (0) | 2021.08.20 |
---|---|
[Spring] 댓글 페이지의 화면 처리 (0) | 2021.08.16 |
[Spring] 댓글의 수정/삭제 이벤트 처리 (0) | 2021.08.14 |
[Spring] 특정 댓글의 클릭 이벤트 처리 (0) | 2021.08.14 |
[Spring] 새로운 댓글 처리 (0) | 2021.08.13 |