Search

[Spring Data JPA] Slice(Page) 객체 확장해서 반환하기

Last update: @7/9/2023

Spring Data JPA의 페이징 지원

Spring Data JPA는 Page, Slice 객체로 페이징을 지원한다. 이 객체들은 반환 리스트를 content 필드로 가지고 있고, 이 외에 size, isFirst, isLast 등 페이징에 필요한 부가 정보들을 가지고 있다.
보통 REST 컨트롤러에서는 데이터를 직접 반환하지 않고 Result 객체로 감싸서 반환한다. 추후 API 스펙에 반환값이 추가되더라도 반환형을 바꾸지 않아도 되기 때문이다.
@ResponseBody @GetMapping("/members") public Result<List<MemberDto>> getMembers(...) {} @Data @AllArgsConstructor static class Result<T> { T data; }
Java
복사

Page, Slice 객체 반환

리포지토리계층으로부터 Page, Slice 객체를 반환 받는다면, 이미 데이터가 한 번 래핑된 상태이기 때문에 바로 반환해도 좋다. 하지만 필드를 추가하고 싶다면 약간 곤란해진다. 한 번 더 감싸기엔 데이터가 너무 깊이 들어가기 때문이다. 따라서 아래 예시처럼 Page, Slice의 구현 객체를 상속받은 Result 객체를 만들어 필드를 추가해주면 된다.
premiumType 필드를 SliceImple에 추가한 Result 객체 예시
@ResponseBody @GetMapping("/sentences") public SentenceListDtosResult<SentenceListDto> getSentences(...) { Slice<SentenceListDto> slice = sentenceService.findAll(sentenceCond, pageable); return new SentenceListDtosResult<>(slice, authentication.getValidPremiumType()); } @Getter @Setter static class SentenceListDtosResult<T> extends SliceImpl<T> { PremiumType premiumType; public SentenceListDtosResult(Slice<T> slice, PremiumType premiumType) { super(slice.getContent(), slice.getPageable(), slice.hasNext()); this.premiumType = premiumType; } }
Java
복사