본문 바로가기

Programming/Framework

DAY 140. TDD 방식으로 게시판 페이징 기능

 

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();