페이징 & 정렬 실무 팁

Thomas·2023년 8월 2일
0

페이징 & 정렬 실무 팁

List가 필요하면 응답을 Page로 받지말고 List로 받아라

  • 전체 Count 쿼리가 추가로 발생하는 Page보다는 List가 대용량 처리할 떄 더 안정적이고 빠르다
//전체셀러 목록 조회
    @Override
    @Transactional(readOnly = true)
    public List<SellerProfileResponseDto> allSellerList(PageDTO pageDTO){

		// 이부분은 List로 받아도됨 (userRepository 도 수정)
        Page<User> usersByUserRole = userRepository
                .findUsersByUserRole(UserRole.SELLER, pageDTO.toPageable());

        List<SellerProfileResponseDto> sellerProfileResponseDtos = new ArrayList<>();

        for(User user:usersByUserRole){
            if(!user.getProfile().getIntroduce().isEmpty()) {
                sellerProfileResponseDtos.add(new SellerProfileResponseDto(user.getUserName(), user.getProfile().getIntroduce()));
            }
        }

        return sellerProfileResponseDtos;

    }

이게 전체 코드인데 주석에도 있듯이

Page<User> usersByUserRole = userRepository
              .findUsersByUserRole(UserRole.SELLER, pageDTO.toPageable());

Page로 받을 필요없이 List로 받으면 된다

List<User> usersByUserRole = userRepository
              .findUsersByUserRole(UserRole.SELLER, pageDTO.toPageable());

Pageable과 실제 페이지사이의 -1 문제 해결하기

  • JPA 페이지는 0부터인데 화면은 1부터 시작하는 문제
    • -1 처리를 중복으로 해줘야하는 이슈

해결 방법: pageDTO를 만들어서 toPageable() 메소드를 사용

@ReqyiredArgsConstructor
public class PageDTO {
  @Positive // 0보다 큰수
  private final Integer currentPage;
  private final Integer size;
  private String sortBy; // 필요할 때 final 붙이면 된다 

  public Pageable toPageable() {
    return PageRequest.of(currentPage-1, size, Sort.by(sortBy).descending());
  }
}

currentPage는 0보다 큰수가 들어와서 1부터시작이다.

// UserService 일부
public List<User> findAll(PageDTO pageDTO){
	return userRepository.findUsers(pageDTO.toPageable());
}

-1처리가 pageDTO.toPageable으로 인해 자동으로 이루어진다.

@Test

@Test
void pageDTOTest() {

	// given
	var newUser1 = User.builder().username("new_user1").password("new-pass1").build();
	var newUser2 = User.builder().username("new_user2").password("new-pass2").build();
    var newUser3 = User.builder().username("new_user3").password("new-pass3").build();
	userRepository.save(newUser1);
  	userRepository.save(newUser2);
  	userRepository.save(newUser3);
	var = pageDTO = new pageDTO(1,2,"paassword");

	// when
	var page = userRepository.findAll(pageDTO.toPageable());

    // then
    assert page.getContent().size == 2;

}

Pageable을 GET API의 요청필드로 받아오기

  • Pageable을 API 요청필드에서 바로 받아올 수 있다.
@GetMapping("/users")
public Page<User> getAllUsers(Pageable pageable) {
	return userRepository.findAll(pageable);  
}
profile
Backend Programmer

0개의 댓글