[Spring Data JPA] 스프링 데이터 JPA에서 페이징(Paging) 사용하기

저번 포스팅에서 순수 JPA를 통해 페이징을 적용하는 방법에 대해 알아보았다.

Spring Data JPA를 사용하면 정말 편리하게 PageRequest를 따로 만들필요없이 페이징 적용이 가능하다.

하지만 Spring Data JPA도 Page와 Pageable 인터페이스를 사용하기 때문에 해당 인터페이스에 대한 설명은 아래 포스팅을 참고하는 걸 추천한다.

 

[JPA] 페이징과 정렬에 대해 알아보자.

페이징 (Pageable, Page, Slice ) 데이터베이스의 대용량 데이터를 처리할 때, 데이터를 효율적으로 로드하고 출력하기 위해 페이지 단위로 데이터를 분할하여 가져오는 기능을 페이징이라고 한다. 페

hstory0208.tistory.com

 


페이징 적용

 

파라미터로 Pageable 인터페이스를 받고 다음과 같이 Page<엔티티>를 반환하면 페이징이 적용된다. 

@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
    Page<Member> page = memberRepository.findAll(pageable);
    return page;
}

 

 

추가로 Mapping URI 뒤에 요청 파라미터를 추가하여 결과를 얻을 수 도 있다.

// page는 0부터 시작, 한 페이지당 크기 3, id 기준 내림차순 & username 기준 내림차순 
/members?page=0&size=3&sort=id,desc&sort=username,desc

 

기본값

pageable의 JSON 값을 보면 시작 페이지는 0부터 시작, 한 페이지당 크기(Size)는 20으로 기본 설정되어 있는 것을 볼 수 있다.

 

페이징 옵션 글로벌 설정

해당 기본 값을 원하는 값으로 바꿔 글로벌 적용을 한다면, 다음과 같이 apllication.properties에 코드를 추가하면 된다.

spring.data.web.pageable.default-page-size=20 // 기본 페이지 사이즈
spring.data.web.pageable.max-page-size=2000 // 최대 페이지 사이즈

 

페이징 옵션 개별 설정 (@PageableDefault)

개별 적용을 한다면 다음과 같이 @PageableDefault 어노테이션을 사용하여 개별 적용할 수 있다.

@GetMapping("/membersPage")
public Page<Member> pageList(@PageableDefault(size = 5, sort = "username", direction = Direction.DESC) Pageable pageable) {
    Page<Member> page = memberRepository.findAll(pageable);
    return page;
}

페이지당 크기(size), 정렬 조건(sort), 정렬 기준(direction)을 적용할 수 있다.


한 페이지에 여러 페이징 적용

만약 하나의 페이지에 둘 이상의 엔티티를 페이징 해야 할 경우 다음과 같이 @Qualifier 어노테이션을 사용하여 접두사로 구분해 사용할 수 있다.

public String list(
    @Qualifier("member") Pageable memberPageable,
    @Qualifier("order") Pageable orderPageable, 
    ...
}

 


DTO로 변환하여 반환

엔티티를 직접 반환하는 것은 상당히 위험하다고 하였다. (자세한 내용은 아래 포스팅 참조)

 

[Spirng/JPA] Dto와 Entity를 분리해서 사용하는 이유

프로젝트를 진행하거나 강의, 책을 보면 항상 엔티티를 직접 반환하지말고 DTO로 변환하여 반환하라는 말을 접하거나 보았을 것이다. 하지만 단순히 "아 ~ 그렇게 하라니까 그렇게 해야지" 보다

hstory0208.tistory.com

 

List형식인 엔티티를 DTO로 변환하는데 Page 인터페이스가 제공해주는 map() 메서드를 사용하여 다음과 같이 람다식으로 변환할 수 있다.

@GetMapping("/membersPage")
public Page<MemberDto> pageList(@PageableDefault(size = 5, sort = "username", direction = Direction.DESC) Pageable pageable) {
    Page<Member> page = memberRepository.findAll(pageable);
    return page.map(member -> MemberDto.builder()
            .id(member.getId())
            .username(member.getUsername())
            .build());
}