JPA Pagination

구성욱·2022년 9월 21일
0

JPA

목록 보기
5/5
post-thumbnail

JPA


페이징 처리

1. Repository

레포지토리에 예시로 Pageable 타입의 파라미터를 받는 findAll 함수를 오버로딩(Overloading)했다.
리턴 타입은 Page<MemberBak>이다.

@Repository
public interface MemberRepository extends JpaRepository<MemberBak, String> {
    Page<MemberBak> findAll(Pageable pageable);
}

2. Controller

API에서 Pageable 타입의 파라미터를 받아서 findAll 인자로 넘겨준다.
리턴 타입은 동일하게 Page<MemberBak>

@RequestMapping(value = "/member/parentList", method = RequestMethod.GET)
public String selectParentList(
        HttpServletRequest request, 
        Model model, 
        MemberBak member, 
        Pageable pageable) {    // Pageable 타입 파라미터를 받는다.
        
    // ... 페이징과 무관한 코드 제거
        
    try {
        Page<MemberBak> memberPage = memberRepository.findAll(pageable);

        if (memberPage != null) {
            traceWriter.add("[Paging]\t\t" + ToStringUtil.toStringWithAttributes(memberPage, ToStringStyle.JSON_STYLE));
        }
    }
    catch (Throwable e) {
        System.err.println(ExceptionUtil.getStackTrace(e));
        throw new MSLPException(e);
    }
    finally {
        traceWriter.log(0);
    }

    return "/member/parentList";
}

<결과>

<쿼리>

Pageable 인자만 추가함으로써 쿼리에 데이터베이스 타입에 맞는 조건절이 추가된다.
oracle => rownum <= ?
mysql => limit ? offset ?

또한 Pageable이 추가 된 쿼리가 실행되면 자동으로 count 쿼리를 한 번 실행한다.

3. 기타

a) Pageable Default 값 설정

Pageable 파라미터 앞 부분에 PageableDefault 어노테이션을 붙이고, 디폴트 값을 지정해준다.

@RequestMapping(value = "/member/parentList", method = RequestMethod.GET)
public String selectParentList(
        HttpServletRequest request, 
        Model model, 
        MemberBak member, 
        @PageableDefault(size = 10, page = 0) Pageable pageable) {
        
        // ...
}
b) 반환값

출처/참고

PagingModel 페이징 적용

상단의 Controller와 View를 참고한다.
view의 경우 thymeleaf를 사용하고 기존 소스에서 수정을 줄였다.

기존 페이징 버튼의 경우 PagingModel 객체를 사용하지만, JPA는 Pageable 객체를 사용하기 때문에 매개변수 타입이 일치하지 않는다.
따라서 페이징 버튼을 처리하는 경우에만 PagingModel을 사용하고 나머지는 Pageable 객체로 제어한다.
Controller에서 PagingModel을 사용할 때는 pageable에 담겨있는 값을 활용한다.!

profile
아무것도 몰라요우

0개의 댓글