Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] 페이지네이션 기본 값 재설정 #690

Closed
kyum-q opened this issue Sep 25, 2024 · 1 comment · Fixed by #691
Closed

[BUG] 페이지네이션 기본 값 재설정 #690

kyum-q opened this issue Sep 25, 2024 · 1 comment · Fixed by #691
Assignees
Labels
BE 백엔드 bug 개발자가 의도하지 않은 상황

Comments

@kyum-q
Copy link
Contributor

kyum-q commented Sep 25, 2024

들아기기 전에 상황 설명

기본 페이지네이션 설정

페이지네이션의 페이지 번호는 기본적으로 0부터 시작한다.

원하는 것

하지만 프론트엔드와 소통하는 측면에서 페이지 값이 1일 때 0번째 페이지를 보여주고자 했다.

페이지 값 1 -> 0번째 페이지
페이지 값 2 -> 1번째 페이지

페이지네이션 설정 변경 방법

그래서 다음 yml 파일을 추가해서 페이지 값이 1로 들어오면 0번째 페이지를 보여지도록 설정했다. (관련 PR #539 )

spring:
  data.web.pageable.one-indexed-parameters: true

중요한 착각 포인트

여기서 우리는 저 설정이 JPA 처리 단을 변경해주는 줄 알고 있었다. 😊
즉, 컨트롤러에서 pageable 의 페이지 값이 1일 때 0번째 페이지를 보여주는 걸로 알고 있었다. 😊


🐞 어떤 버그인가요?

페이지 값을 설정하지 않고 템플릿 조회 요청을 보냈을 때 , 몇몇 케이스들이 검색된 전체 템플릿 수를 보면 템플릿 배열에 값이 있어야하는데 템플릿 배열에는 값이 없음.

🙄 어떤 상황에서 발생한 버그인가요?

(가능하면) Given-When-Then 형식으로 서술해주세요

  1. DB에 memberId=2이고 keyword="Card watch" 인 템플릿이 1개 존재
  2. http://localhost:8080/templates?memberId=2&keyword=Card%20watch 요청
  3. 반환 값이 잘못됨. 배열에 값이 존재하지 않음.
    image

👍 해결 방법

요약

spring:
  data.web.pageable.one-indexed-parameters: true

위 설정은 JPA 단에서 페이지 처리해주는 것이 아닌, 컨트롤러에 들어올 때 스프링이 처리해주는 것이다.
그래서 page를 입력했을 땐 컨트롤러 단에서 -1 됨을 확인할 수 있다.

http://localhost:8080/templates?memberId=2&keyword=Card%20watch&page=1 요청 시
: 컨트롤러에는 page가 자동으로 -1해서 0이 된다.
image

위 문제의 원인은 이를 모르고 다음과 같이 pageable에 page의 기본 값을 1로 해줬다.
그래서 위에 문제는 시작 페이지가 0인데 1번째 페이지를 찾으니 배열에 값이 없었던 것이다 !

    @GetMapping("/login")
    public ResponseEntity<FindAllTemplatesResponse> getTemplatesWithMember(
            @AuthenticationPrinciple MemberDto memberDto,
            @RequestParam(required = false) Long memberId,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) Long categoryId,
            @RequestParam(required = false) List<Long> tagIds,
            @PageableDefault(size = 20, page = 1) Pageable pageable
    ) {    }

그래서 해당 코드를 수정함으로 해결하였다.

AS-IS

    @GetMapping("/login")
    public ResponseEntity<FindAllTemplatesResponse> getTemplatesWithMember(
            @AuthenticationPrinciple MemberDto memberDto,
            @RequestParam(required = false) Long memberId,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) Long categoryId,
            @RequestParam(required = false) List<Long> tagIds,
            @PageableDefault(size = 20, page = 1) Pageable pageable
    ) {    }

TO-BE

    @GetMapping("/login")
    public ResponseEntity<FindAllTemplatesResponse> getTemplatesWithMember(
            @AuthenticationPrinciple MemberDto memberDto,
            @RequestParam(required = false) Long memberId,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) Long categoryId,
            @RequestParam(required = false) List<Long> tagIds,
            @PageableDefault(size = 20) Pageable pageable
    ) {    }

🎁 결과

  1. DB에 memberId=2이고 keyword="Card watch" 인 템플릿이 1개 존재
  2. http://localhost:8080/templates?memberId=2&keyword=Card%20watch 요청
  3. 배열에 값이 존재함.
    image

⏳ 소요 시간

1시간

🔍 참고할만한 자료(선택)

@kyum-q kyum-q added the bug 개발자가 의도하지 않은 상황 label Sep 25, 2024
@kyum-q kyum-q added the BE 백엔드 label Sep 25, 2024
@kyum-q kyum-q added this to the 5차 스프린트🍗 milestone Sep 25, 2024
@kyum-q
Copy link
Contributor Author

kyum-q commented Sep 25, 2024

어떻게 이 문제를 알았는지 더 알고 싶은 분들을 위해 적는 글

image

해당 코드를 디버깅해보니
703번 줄에는 query.getResultList() 의 사이즈가 1이었다.
704번 줄에서 사이즈가 0이 된다.

704번 줄은 페이지 설정해주는 것, 즉 해당 페이지를 보여주는 코드다.
이 때 pageable 의 페이지 번호가 1이었음.
디버깅으로 pageable의 페이지 번호를 0으로 변경해서 넣으니 query.getResultList() 의 사이즈가 1이었다.

이렇게 문제 발견 ~!

@kyum-q kyum-q closed this as completed Sep 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 백엔드 bug 개발자가 의도하지 않은 상황
Projects
Status: Weekend Done
Development

Successfully merging a pull request may close this issue.

2 participants