SpringDataJpa - Web 확장(페이징과 정렬)

박민수·2023년 11월 14일
0

JPA

목록 보기
24/24
post-thumbnail

Web 확장(페이징과 정렬)

SpringDataJpa가 제공하는 페이징과 정렬 기능을 Web(스프링 MVC)에서 편리하게 사용할 수 있다. 파라미터로 page에 대한 파라미터 정보들이 담긴 Pageable 인터페이스를 받을 수 있다. (실제로는 org.springframework.data.domain.PageRequest 객체가 생성된다)

받아온 pageable을 실행하고자 하는 쿼리의 파라미터로 넣어주기만 하면 반환타입이 Page인 결과물을 반환해준다. 참고로 스프링 부트 환경에서는 Pageable 인터페이스의 구현체를 스프링 부트가 자동으로 세팅해준다.

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

요청 파라미터

HTTP 요청 파라미터들이 컨트롤러에서 바인딩 될 때, Pageable이 있으면 pageRequest 라는 객체를 생성해서 값을 채우고 인젝션을 해준다.

url 요청 예시: /members?page=0&size=3&sort=id,desc&sort=username,desc

  • page: 현재 페이지, 0부터 시작한다.
  • size: 한 페이지에 노출할 데이터 건수
  • sort: 정렬 조건을 정의한다. ex) 정렬 속성, 정렬 속성... (ASC | DESC), 정렬 방향을 변경하고 싶으면 sort 파라미터 추가 ( asc 생략 가능)

기본 값 설정

파라미터로 page나 size 값을 아무 것도 넣지 않았을 때 설정되는 기본 값들을 변경하려면 아래 방법을 참고하자.

// 글로벌 설정
spring.data.web.pageable.default-page-size=20 // 기본 페이지 사이즈
spring.data.web.pageable.max-page-size=2000 // 최대 페이지 사이즈
// 개별 설정
@GetMapping("/members_page")
public String list(@PageableDefault(size = 12, sort = “username”, direction = Sort.Direction.DESC) Pageable pageable) {
}

@Qualifier

페이징 정보가 둘 이상일 때는 @Qualifier 어노테이션을 사용하면 된다. ex) /members?member_page=0&order_page=1

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

Page 내용을 DTO로 변환하기

엔티티를 API로 노출하면 다양한 문제가 발생한다. 그래서 엔티티를 꼭 DTO로 변환해서 반환해야 한다. Page는 map() 메소드를 이용해서 내부 데이터를 다른 것으로 손쉽게 변경할 수 있다.

// MemberDto 클래스 생성
@Data
public class MemberDto {
    private Long id;
    private String username;
    
    public MemberDto(Member m) {
        this.id = m.getId();
        this.username = m.getUsername();
    }
}
// Member -> MemberDto 변환
@GetMapping("/members")
public Page<MemberDto> list(Pageable pageable) {
    /*
    Page<Member> page = memberRepository.findAll(pageable);
    Page<MemberDto> pageDto = page.map(MemberDto::new);
    return pageDto;
    */
    
    return memberRepository.findAll(pageable).map(MemberDto::new);
}

참조
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard

profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글