🚨ERROR🚨

page 2 of 1 containing unknown instances

코딩베이비 2023. 8. 9. 14:36

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()로 생성해주는게 더 깔끔했을 것 같다!