프로젝트 진행 중 JpaRepository에서 Pagenation을 적용한 Page객체를 받은 이후 Collections.sort로 정렬을 하였습니다.
하지만 이와 관련된 문제점 하나를 발견하게 되었고 포스팅으로 남길려고 합니다.
우선 db에 유저의 정보를 저장해줍니다.
profile_url은 file저장을 공부하면서 사용해본 것이며 이 글과는 상관 없는 file입니다.
내일쯤 file 저장관련 글을 포스팅할 예정입니다.
각 유저들의 점수(score)를 같이 저장해줍니다.
이 유저들을 score기준 내림차순으로 조회를 하는데 Pagenation을 적용시키려고 합니다.
UserRepository에서는 Page 객체로 리턴하는 findAll 메소드를 작성합니다.
UserServiceImpl에서 UserRepository의 findAll 메소드를 호출하는 findAllUser 메소드를 작성합니다.
userRepository.findAll로 Page객체를 가져오고, UserGetRes의 of 메소드에서 정렬을 진행합니다.
Pagenation을 적용했기 때문에 변수를 많이 사용하였지만 of 메소드의 정렬하는 부분이 핵심입니다.
Page객체를 가져와서 score기준 내림차순으로 정렬을 진행합니다.
그리고 Controller에서는 page와 size를 RequestParam으로 받아서 UserService의 findAllUser 메소드를 호출합니다.
이제 스웨거를 통해 테스트를 합니다.
확인할 페이지는 0페이지, 즉 첫번째 페이지를 조회하며 최대 3개의 데이터를 조회하려고 합니다.
결과는...
네.. 이렇게 나왔습니다.
원래 의도한 대로라면 score가 120인 id10부터 score가 100인 id2까지 나오는게 맞습니다.
여기서 확인해봐도 id는 10 -> 5 -> 2 순서대로 조회가 되어야합니다.
이 과정에서 제가 치명적인 실수를 한 것이 있습니다.
바로 Repository에서 Page객체를 가져온 이후에 정렬을 진행했다는 것입니다.
Page객체에 있는 데이터는 조회 가능한 모든 리스트가 있는것이 아니라 size만큼의 데이터만 있는 것이었습니다.
따라서 제가 Service에서 Repository를 호출할 때 Sort 기준을 아무것도 주지 않았기 때문에 먼저 추가된 데이터부터 size만큼 데이터가 조회된 것이었습니다.
그럼 이제 알맞게 수정을 해야겠죠?
우선 UserRepository의 findAll 메소드에 OrderByScore를 추가하거나 Pageable에 Sort를 추가합니다.
그 후에 UserGetRes의 정렬하는 부분을 지웁니다.
일단 UserGetRes의 of 메소드의 정렬부분을 지웁니다.
먼저 UserRepository의 findAll 메소드 수정하는 방법입니다.
findAllUsers로는 자동완성이 안뜨길래 findUsersByOrderByScoreDesc로 수정합니다.
뒤에 Desc를 안붙이면 default로 Asc가 적용됩니다.
다음은 UserService의 PageRequest에 Sort를 추가하는 방법입니다.
UserRepository에 있는 findAll 메소드는 그대로 두고 Sort를 추가합니다.
score 기준 DESC를 추가합니다.
둘 중 아무방법이나 사용한 다음 스웨거를 통해 테스트를 합니다.
그러면 이렇게 올바르게 조회를 할 수가 있습니다.
저는 두 번째 방법을 선호하기는 합니다만 두 방법 중 어떤 방법이 더 좋을지는 잘 모르겠습니다.
앞으로 로직을 구현할 때 생각이라는 것을 많이 해야겠다는 생각이 듭니다.
정렬을 적용하는 시점이 잘못되어 생긴 문제였습니다.