JpaRepository를 상속받은 BuddyRepository를 이용해 Page<Budy>를 리턴하는 메서드를 구현할 때 만난 에러(??)이다.
코드
// Controller
@GetMapping("/buddy")
public ResponseEntity<Page<BuddyResponseDto>> getBuddies(
@AuthenticationPrincipal UserDetailsImpl userDetails,
@PageableDefault(page = 1, size = 5, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable) {
return ResponseEntity.ok(buddyService.getBuddies(userDetails, pageable));
}
// Service
public Page<BuddyResponseDto> getBuddies(UserDetailsImpl userDetails, Pageable pageable) {
User sender = userRepository.findByLoginId(userDetails.getUsername()).orElseThrow(
() -> new RuntimeException("존재하지 않는 사용자입니다.")
);
Page<Buddy> buddyPage = buddyRepository.findBySender(sender, pageable);
List<BuddyResponseDto> buddyResponseDtos = buddyPage.getContent().stream().map(
buddy -> new BuddyResponseDto(buddy.getReceiver().getNickname(), buddy.getReceiver().getLoginId())
).toList();
return new PageImpl<>(buddyResponseDtos, pageable, buddyPage.getTotalElements());
}
위 사진과 같이 쿼리문도 실행이 됐는데 Page의 content에 아무 내용도 안찍히길래 디버깅을 돌려보니 아래와 같은 메시지가 나타났다.
buddyPage 객체에는 findBy 메서드로 찾아온 객체가 잘 저장돼있었다.
그럼 뭐가 문제인가 하고 검색해보니 page를 1부터 조회해서 그런거였다 ㅎㅎ
데이터가 0페이지에만 존재하는데 1페이지를 달라고 하니 컴퓨터 입장에서는 어이없었을듯
...
int currentPage = pageable.getPageNumber();
int newPage = currentPage <= 1 ? 0 : currentPage - 1;
Pageable newPageable = PageRequest.of(newPage, pageable.getPageSize(), pageable.getSort());
Page<Buddy> buddyPage = buddyRepository.findBySender(sender, newPageable);...
getBuddies 메서드에서 pageable 객체를 새로 만들어서 사용하게 했다.
이럴거면 PageableDefault 안쓰고 RequestParam 2개 써서 값 받고 size -1 해서 바로 PageRequest.of()로 생성해주는게 더 깔끔했을 것 같다!