00. 시작하기에 앞서
▶ 기존 Servlet/JSP 방식
- 기존에 Servlet/JSP 에서는 쿼리문에서 RowNum 컬럼과 서브쿼리를 통해서 페이징 처리를했다.
DB 쿼리가 바뀌면 페이징을 위해서 수정 작업이 지속적으로 필요하다.
▶ Mybatis 방식
- 하지만, Mybatis에서는 페이징 처리를 위해서 RowBounds 클래스를 제공해준다.
- 쿼리문 조회 결과를 가지고 RowBounds를 만들어서
session 객체에 매개값으로 넘겨주면,
session 객체에서 쿼리문을 실행하여
쿼리 조회해서 나온 결과를 RowBounds 내용을 가지고 페이징에 필요한 데이터를 가져다 준다.
- 즉, 조회된 결과에서 내가 만든 RowBounds를 가지고 원하는 데이터만 가져온다.
※ 한 줄 요약!
- RowBounds의 객체를 생성할 때 offset과 limit 값을 전달해서 내가 원하는 데이터만 가지고 페이징 처리를 쉽게 구현한다.
01. BoardServiceTest.java
@ParameterizedTest
@MethodSource("listProvider")
public void findAllTest(String[] filters, int currentPage, int expected) {
List<Board> list = null;
PageInfo pageInfo = null;
int listCount = 0;
listCount = service.getBoardCount(filters);
pageInfo = new PageInfo(currentPage, 10, listCount, 10);
list = service.findAll(filters, pageInfo);
assertThat(list).isNotNull();
assertThat(list.size()).isPositive().isEqualTo(expected);
}
※ 여기에서!
/** * * @param currentPage 현재 페이지 * @param pageLimit 한 페이지에 보이는 페이지의 수 * @param listCount 전체 리스트의 수 * @param listLimit 한 페이지에 표시될 리스트의 수 */ |
02. BoardService.java
- findAll() 매개 변수에 PageInfo pageInfo 포함시키기
03. BoardDao.java
- findAll() 매개 변수에 PageInfo pageInfo 포함시키기
- RowBounds(offset, limit) 객체를 활용할 것이다.
▷ offset : 얼마만큼 건너 뛸지?
▷ limit : 얼마만큼 가져올지?
예시)
offset = 0, limit = 10 이라면 => 1페이지
-> 0개를 건너뛰고 10개를 가져온다. (첫 번째 게시글(= 첫번째 결과, 첫번째 행부터) ~ 10번째 게시글까지)
offset = 10, limit = 10 이라면 => 2페이지
-> 10개를 건너뛰고 10개를 가져온다. (11번째 게시글 ~ 20번째 게시글까지)
offset = 20, limit = 10 이라면 => 3페이지
-> 20개를 건너뛰고 10개를 가져온다. (21번째 게시글 ~ 30번째 게시글까지)
public List<Board> findAll(SqlSession session, String[] filters, PageInfo pageInfo) {
Map<String, Object> map = new HashMap<>();
map.put("filters", filters);
int offset = (pageInfo.getCurrentPage() - 1 ) * pageInfo.getListLimit();
int limit = pageInfo.getListLimit();
RowBounds rowBounds = new RowBounds(offset, limit);
return session.selectList("boardMapper.selectBoardListByFilters", map, rowBounds);
}
▷ int offset = (pageInfo.getCurrentPage() - 1 ) * pageInfo.getListLimit();
- 원래는 (pageInfo.getCurrentPage() - 1 ) * 10; 이렇게도 표현할 수 있었는데 이 뜻은,
: 현재 페이지가 1페이지이면 (1 - 1) * 10 이라면 어차피 0이다. 따라서 1페이지일때는 offset이 0이 되도록 만든 공식
: 현재 페이지가 2페이지라면 (2 - 1) * 10 이라서 10이니까 10개 건너뛰라는 뜻이 됨 offset이 10이 되어서 10개 건너뛰니까 11번째 게시글부터 조회되는 것
- 하드 코딩해서 10이라고 하기에는 5페이지, 7페이지, ... 사용자가 원하는대로 바뀔 수 있기 때문에 하드코딩해서는 안되고, PageInfo에서 ListLimit(한 페이지에 표시될 리스트의 수)을 얻어오는 것이다.
▷ int limit = pageInfo.getListLimit();
'Programming > Framework' 카테고리의 다른 글
DAY 145. Spring 개요 (0) | 2022.01.10 |
---|---|
DAY 141. TDD 방식으로 게시글 상세조회 기능(댓글 포함) (0) | 2022.01.06 |
DAY 139. TDD 방식으로 게시판 필터 기능 만들기 (0) | 2022.01.04 |
DAY 138. Mybatis - 동적 SQL (0) | 2022.01.03 |
DAY 137. Mybatis - xml 파일 만들기 (0) | 2022.01.02 |