Data Jpa - Web 확장

Seongjin Jo·2022년 12월 26일
0

Data Jpa

목록 보기
5/6

✔ 페이징과 정렬


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

파라미터로 Pageable 을 받을 수 있다.
Pageable 은 인터페이스, 실제는 org.springframework.data.domain.PageRequest 객체 생성

요청 파라미터
예) /members?page=0&size=3&sort=id,desc&sort=username,desc
page: 현재 페이지, 0부터 시작한다.
size: 한 페이지에 노출할 데이터 건수
sort: 정렬 조건을 정의한다

글로벌 설정

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

개별 설정
@PageableDefault 어노테이션 사용

@RequestMapping(value = "/members_page", method = RequestMethod.GET)
public String list(@PageableDefault(size = 12, sort = “username”,
 direction = Sort.Direction.DESC) Pageable pageable) {
 ...
}

접두사

  • 페이징 정보가 2개 이상이면 접두사로 구분
  • 예제: /members?member_page=0&order_page=1
 @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(); }
}

Controller

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

✔ Page 인덱스를 1부터 시작하기

  • 스프링 데이터는 Page를 0부터 시작한다.
  • 1부터 인덱스를 처리하는 방법
    1. Pageable, Page를 파리미터와 응답 값으로 사용히지 않고, 직접 클래스를 만들어서 처리한다. 그리고 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다. 물론 응답값도 Page 대신에직접 만들어서 제공해야 한다.
    2. spring.data.web.pageable.one-indexed-parameters 를 true 로 설정한다. 그런데 이 방법은 web에서 page 파라미터를 -1 처리 할 뿐이다. 따라서 응답값인 Page 에 모두 0 페이지 인덱스를 사용하는 한계가 있다.

0개의 댓글