MYSQL LIMIT를이용한 페이징(PAGING) 쿼리 만들기 with Mybatis DEV / DATABASE
2018-10-10 posted by sang12
일반적으로 게시판 같은 것들을 만들때 페이징 처리를 많이 합니다. 이번 포스팅에서는 MYBATIS 환경에서 페이징 처리를 할 수 있는 쿼리문을 만들어 보겠습니다.
EX1_1) BOARD TABLE 구조 및 데이터
BOARD_ID(PK AUTO_INCREMENT) | TITLE | CONTENT |
1 | PAGING TEST 1 | PAGING TEST 1 |
2 | PAGING TEST 2 | PAGING TEST 2 |
..... | ..... | ..... |
100 | PAGING TEST 100 | PAGING TEST 100 |
위와 같이 테이블이 존재할 때 페이징 처리를 하기 위해서는 아래와 같이 쿼리를 작성 할 수 있습니다.
EX1_2) PAGING SQL
select R1.* FROM(
SELECT * FROM BOARD01TM
order by boardId asc
) R1
LIMIT 10 OFFSET 0
해당 쿼리에서 LIMIT는 가져올 게시물의 수, OFFSET은 어디서부터 가져올거냐? 입니다. "10개의 게시물을 가져올꺼고 0번째(첫번째부터) 가져올거야"라는 말입니다. 그럼 위에 테이블(EX_1) 처럼 데이터가 존재 할때는 BOARD_ID가 1부터 10까지의 데이터를 가져올건데요. 9번째 게시물이 삭제 됬다면 어떻게 될까요? 당연히 첫번재 데이터부터 10개의 데이터를 가져오니 BOARD_ID가 1부터 11인 데이터를 가져오게 될 것입니다.
EX1_3) PAGING SQL
select R1.* FROM(
SELECT * FROM BOARD01TM order by boardId asc
) R1
LIMIT 0, 10
EX1_2와 EX1_3은 같은 말입니다. LIMIT {OFFSET}, {LIMIT} 와 같은 의미 입니다.
와~ 그럼 페이징 처리를 할 쿼리를 만드는 작업은 끝났습니다. 일반적으로 MYBATIS를 사용하면 저희는 아래와 같이 만들 수 있겠죠?
EX2_1) MYBATIS에서 페이징 적용
<sql id="getBoardList" resultType="com.sang12.blog.BoardEntity">
select R1.* FROM(
SELECT *
FROM BOARD01TM order by boardId asc
) R1
LIMIT #{length, jdbcType=INTEGER} OFFSET #{start, jdbcType=INTEGER}
</sql>
자 그러면 조금더 이쁘게 변경해봅시다. 아래와 같이 페이징 하는 부분을 공통으로 사용하면, 다른 게시물을 가져오는 부분에도 사용 할 수 있을겁니다.
EX2_2) MYBATIS에서 페이징 처리부분 분리
<sql id="COMMON_PAGING_HEADER">
select R1.* FROM(
</sql>
<sql id="COMMON_PAGING_TAIL">
) R1
LIMIT #{length, jdbcType=INTEGER} OFFSET #{start, jdbcType=INTEGER}
</sql>
<sql id="getBoardList" resultType="com.sang12.blog.BoardEntity">
<include refid="COMMON_PAGING_HEADER"/>
SELECT *
FROM BOARD01TM
order by boardId asc
<include refid="COMMON_PAGING_TAIL"/>
</sql>
이렇게 MYSQL에서 LIMIT를 활용하여 페이징 처리를 해봤습니다. 물론 MYSQL에서 페이징을 처리하는 쿼리는 만들었으나, 앞단에서 적절하게 LIMIT값과 OFFSET값을 가져오게 끔 해야 정상적인 페이징 처리를 할 수 있을것입니다.