Dandy Now!
  • [스프링] MySQL 페이징 처리 쿼리
    2022년 06월 23일 14시 45분 18초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    구멍가게 코딩단의 책 "코드로 배우는 스프링 웹 프로젝트(개정판)"으로 Spring legacy project 실습을 하고 있다. 책에서는 Oracle DB를 베이스로 하고 있는데 나의 경우에는 MySQL로 실습 중이다. 293~297쪽에서 Oracle DB에서의 페이징 처리를 다루기 있는데 MySQL에서는 쿼리문을 다르게 처리해줘야 한다.

    아래의 코드는 BoardMapper.xml에 추가된 Oracle DB의 쿼리이다. MySQL에서는 이 쿼리를 사용할 수 없다.

    <select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
    <![CDATA[
    select 
    	bno, title, content, writer, regdate, updatedate
    from 
        (
        select /*+INDEX_DESC(tbl_board pk_board) */
        	rownum rn, bno, title, content, writer, regdate, updatedate 
        from 
        	tbl_board
        where rownum <= #{pageNum} * #{amount}
    	)
    	where rn > (#{pageNum} -1) * #{amount}
    ]]>
    </select>

     

    MySQL에서는 다음의 쿼리를 BoardMapper.xml에 추가하면 된다.

    <select id="getListWithPaging" resultType="com.dand.domain.BoardVO">
    <![CDATA[
    	select bno, title, content, writer, regdate, updatedate from tbl_board WHERE bno > 0 order by bno DESC, regdate DESC LIMIT #{skip}, #{amount};
    ]]>
    </select>

     

    MySQL에서는 order by DESC 적용 시 인덱스 정렬로 수행되기 때문에 rownum을 고려할 필요가 없다.  또한 페이징은 LIMIT #{pageNum}, #{amount}를 이용하면 된다. #{pageNum}는 몇 개를 skip 하는지이고, #{amount}는 몇 개의 데이터를 가져오는지이다. 예를 들어 1~10을 가져오고 싶다면 "LIMIT 0, 10"이라고 하면 된다.

     

    위 쿼리를 작성 후 아래 테스트 코드를 JUnit으로 실행하면 [그림 1]과 같이 성공적으로 수행된다.

    @Test
    public void testPaging() {
    
        Criteria cri = new Criteria();
    
        List<BoardVO> list = mapper.getListWithPaging(cri);
    
        list.forEach(board -> log.info(board));
    }

     

    [그림 1] 테스트 코드 수행 결과

    728x90
    반응형
    댓글