-
Web 확장 - 페이징과 정렬JPA/스프링 데이터 JPA 2023. 8. 12. 15:32
페이징과 정렬을 Web에서 편하게 사용할 수 있도록 스프링 데이터 JPA가 기능을 지원한다.
@GetMapping("/members") public Page<Member> list(Pageable pageable) { Page<Member> page = memberRepository.findAll(pageable); return page; } @PostConstruct public void init() { for (int i = 0; i < 100; i++) { memberRepository.save(new Member("user" + i, i)); } }
memberRepository의 findAll의 파라미터에 pageable을 넣어주면 페이징을 사용할 수 있다.
url에 파라미터로 페이지와 사이즈를 넘겨주면 웹에서 페이징을 해서 결과값을 자동으로 반환해준다. 처음 5개의 데이터가 나올 것이고, page=1&size5라고 적으면 id가 6~10인 데이터가 나올 것이다.
그 뒤에 sort를 이용해서 id와 username을 DESC로 정렬했더니 반대로 id가 100번인 것부터 나오게 되었다.
초기설정 바꾸기
파라미터에 아무것도 설정하지 않으면 default 개수는 20개이며 정렬하지 않은 순으로 보여준다.
spring: date: web: pageable: default-page-size: 10 max-page-size: 2000
application.yml에 다음과 같이 설정해서 default 크기와 max 페이지를 설정할 수 있다.
초기설정을 단체로 하는게 아니라 기능별로 하나씩 설정할 때가 많은데 그럴 때에는 컨트롤러에 별도로 설정해주면 된다.
@GetMapping("/members") public Page<Member> list(@PageableDefault(size = 5) Pageable pageable) { Page<Member> page = memberRepository.findAll(pageable); // 그냥 findAll에 pageable을 넘겨주면 알아서 sorting 해줌 return page; }
Page 내용을 Dto로 변환하기
위의 내용들은 엔티티를 그대로 반환한 것이기 때문에 항상 말했듯이 절대 해서는 안되는 것이다. 이럴 때에는 Dto로 변환해서 반환해줘야 한다.
@GetMapping("/members") public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable) { Page<Member> page = memberRepository.findAll(pageable); Page<MemberDto> map = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null)); return map; }
이렇게 map을 이용해서 Dto로 변경시켜주면 된다.
'JPA > 스프링 데이터 JPA' 카테고리의 다른 글
Auditing - 엔티티의 생성 변경 기록 (0) 2023.08.12 스프링 데이터 JPA에서의 사용자 정의 리포지토리 (0) 2023.08.12 JPA Hint (0) 2023.08.12 @EntityGraph - 어노테이션으로 fetch join (0) 2023.08.12 벌크성 수정 쿼리 (0) 2023.08.11