[MyBatis] 페이징 처리

웹 개발 시 페이징 처리는 필수입니다. MyBatis를 사용하여 페이징 처리하는 방법에 대해 알아보겠습니다.

데이터베이스는 Oracle을 사용하였습니다.

1. 기본 페이징

공지사항 조회 시 페이징을 예제로 만들었습니다.

Class 생성

공지사항 관련 Class와 페이징을 위한 Class를 생성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Notice.java
@Data
public class Notice {

/** 작성사용자ID */
private String userId;

/** 작성사용자명 */
private String userName;

/** 제목 */
private String title;

/** 내용 */
private String content;

/** 조회수 */
private int hit;
}
1
2
3
4
5
6
7
8
9
10
// Pagination.java
@Data
public class Pagination {

/** 페이지 번호 */
private int pageNo;

/** 한 페이지당 데이터 수 */
private int amount;
}

Mapper 생성

1
2
3
4
5
6
// NoticeMapper.java
@Mapper
public interface NoticeMapper {

public List<Notice> getListWithPaging(Pagination pagination);
}

쿼리 작성

CDATA 태크는 XML에서 부등호를 사용하기 위함입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.hgko.test.repository.NoticeMapper">

<select id="getListWithPaging" resultType="Notice" parameterType="Pagination">
<![CDATA[
SELECT USER_NAME, TITLE, CONTENT
FROM
(
SELECT *, ROWNUM RN
FROM TB_NOTICE
WHERE ROWNUM <= #{pageNo} * #{amount}
)
WHERE RN > (#{pageNo} - 1) * #{amount}
]]>
</select>

</mapper>

테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RunWith(SpringRunner.class)
@MybatisTest
public class NoticeMapperTest {

@Autowired
private NoticeMapper noticeMapper;

@Test
public void getListTest() {

Pagination pagination = new Pagination();
pagination.setPageNo(1);
pagination.SetAmount(10);

List<Notice> notices = noticeMapper.getListWithPaging(pagination);
System.out.println(notices);
}
}

2. 조회 조건 추가

위의 기본 페이징 형식에서 조회 조건을 추가하였습니다.

조회 조건 Class 생성

조회 조건 Class 를 생성하고, Pagination Class 를 상속받았습니다.

1
2
3
4
5
6
7
8
9
10
// SearchParam.java
@Data
public class SearchParam extends Pagination {

/** 작성사용자명 */
private String userName;

/** 제목 */
private String title;
}

Mapper 수정

Mapper Class에 조회 조건으로 조회하는 함수를 추가하였습니다.

1
2
3
4
5
6
7
8
9
// NoticeMapper.java
@Mapper
public interface NoticeMapper {

public List<Notice> getListWithPaging(Pagination pagination);

/** 조회조건을 통해 조회 */
public List<Notice> getListWithCondition(SearchParam searchParam);
}

조회 쿼리 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- NoticeMapper.xml -->
<select id="getListWithCondition" resultType="Notice" parameterType="SearchParam">
SELECT USER_NAME, TITLE, CONTENT
FROM
(
SELECT *, ROWNUM RN
FROM
(
SELECT *
FROM TB_NOTICE
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="userName != null and userName != ''">
AND USER_NAME LIKE %'||#{userName}||'%'
</if>
<if test="title != null and title != ''">
AND TITLE LIKE %'||#{title}||'%'
</if>
</trim>
)
<![CDATA[
WHERE ROWNUM <= #{pageNo} * #{amount}
]]>
)
<![CDATA[
WHERE RN > (#{pageNo} - 1) * #{amount}
]]>
</select>

MyBatis 와 Oracle DB를 이용하여 페이징 처리를 해봤습니다.

Share