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
복사