Sangil's blog

https://github.com/ChoiSangIl Admin

[MYSQL] LIMIT를이용한 페이징(PAGING) 쿼리 만들기 with Mybatis DEV / DATABASE

2018-10-10 posted by sang12


일반적으로 게시판 같은 것들을 만들때 페이징 처리를 많이 합니다. 이번 포스팅에서는 MYBATIS 환경에서 페이징 처리를 할 수 있는 쿼리문을 만들어 보겠습니다. 

EX1_1) BOARD TABLE 구조 및 데이터

BOARD_ID(PK AUTO_INCREMENT)

TITLECONTENT
1PAGING TEST 1PAGING TEST 1
2PAGING TEST 2PAGING TEST 2
...............
100PAGING TEST 100PAGING 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값을 가져오게 끔 해야 정상적인 페이징 처리를 할 수 있을것입니다.

#MYSQL LIMIT #MYSQL PAGING #페이징 처리 #MYBATIS 페이징 #게시물 페이징