인프런 커뮤니티 질문&답변

danseung님의 프로필 이미지

작성한 질문수

비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)

@Cacheable key 속성에서 page, size 파라미터값 null

24.09.22 23:15 작성

·

16

0

BoardService.class

@Cacheable(
            cacheNames = "getBoards",
            key = "'boards:page:' + #page + ':size:' + #size",
            cacheManager = "boardCacheManager"
    )
    public List<Board> getBoards(int page, int size) {
        log.info("page={},size={}", page, size);
        Pageable pageable = PageRequest.of(page - 1, size);
        Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
        return pageOfBoards.getContent();
    }

BoardController.class

@GetMapping
    public List<Board> getBoards(
            @RequestParam(name = "page", defaultValue = "1") int page,
            @RequestParam(name = "size", defaultValue = "10") int size
    ) {
        log.info("page={}, size={}", page, size);
        return boardService.getBoards(page, size);
    }

#page, #size 값에 모두 null이 저장되는 것 같습니다.

위 코드에서처럼 BoardService.getBoards(), BoardController.getBoards() 두 메서드 전부 page, size 값을 로그로 출력해보니 각각 1, 10으로 여기서는 정상적으로 나오는데, 어디서 문제가 있는지 모르겠습니다.

구글링을 해도 마땅한 답을 구할 수 없어서 질문 남깁니다!

답변 3

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

2024. 09. 23. 09:43

안녕하세요 danseung님!

 

말씀해주신 에러 해결 도와드리기 위해

#page, #size 값에 null이 저장되는 코드 상태로

Github Reposiory 링크 한 번 전달해주실 수 있을까요~??

 

그리고 null이 저장된다고 판단하신 출력값 또는 화면 캡쳐해서 같이 보여주세요!

저도 공유해주시는 Repository 활용해서 디버깅해보겠습니다!

danseung님의 프로필 이미지
danseung
질문자

2024. 09. 23. 12:19

아 방금 해결했습니다!

이런 SpEL 표현식에서 메서드 파라미터를 제대로 인식하지 못하는 이유는, 런타임 시에 자바가 메서드의 매개변수 이름을 유지하지 않기 때문이었습니다.

해결 방법으로는

  1. build.gradle 파일에 다음 옵션을 추가하거나,

tasks.withType<JavaCompile>() {
    options.compilerArgs.add("-parameters")
}
  1. 인텔리제이 프로젝트 설정에서 직접 -parameters 옵션을 추가하거나,

  2. Build and run using 설정을 Gradle 로 지정하면 되는 것 같습니다.

     

    image.png

     

저는 보통 이 설정을 Intellij IDEA로 지정했었는데, 이것 때문에 파라미터명을 제대로 인식하지 못한 듯 합니다.

혹시 비슷한 에러를 겪고 계신 분들이 있을지도 몰라 해결 방법 작성해 놓겠습니다.

강의로 많은 도움 받고 있습니다 감사합니다!!

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

2024. 09. 24. 21:24

Intellij 내부의 설정으로 인해 이런 차이가 발생했었군요!!

저도 몰랐던 사실인데 하나 배우고 갑니다👍

다른 사람들을 위해서 이렇게 해결방법도 공유해주셔서 정말 감사드려요!!

0

danseung님의 프로필 이미지
danseung
질문자

2024. 09. 22. 23:26

우선 key 속성을 설정하는 부분을 다음과 같이 파라미터 순서를 입력하도록 해서 문제를 해결하긴 했습니다.

    @Cacheable(
            ...
            key = "'boards:page:' + #p0 + ':size:' + #p1",
            ...

하지만 #page, #size와 같이 파라미터명을 직접 사용하면 왜 null로 지정되는지는 아직 모르겠습니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 22. 23:21

안녕하세요, 인프런 AI 인턴입니다. danseung님,

Cacheable key 값 설정 시 null이 들어가는 문제에 대해 궁금해하셨군요. 일부 다른 수강생들도 유사한 문제를 겪었으며, 이에 대한 답변을 드리도록 하겠습니다.

아래는 유사한 질문과 그에 대한 답변 링크입니다:

1. CacheManager 설정 관련 질문

이 질문에서는 CacheManager를 설정하는 방법에 대한 논의가 있으며, 캐시 설정을 통해 키값의 구조를 어떻게 변경할 수 있는지에 대한 힌트를 얻을 수 있습니다.

2. 페이지 데이터 캐싱할때 질문

이 질문에서는 페이징 처리와 같은 상황에서 Page 객체를 어떻게 캐싱할 수 있는지에 대한 논의가 있습니다. Cacheable 키에 대한 문제점을 해결하는 데 참고하실 수 있습니다.

추가 팁:

  • 메소드의 파라미터가 제대로 전달되지 않아 캐시 키값에 null이 들어가는 경우가 있으므로 @Cacheable 어노테이션의 key 속성에서 사용하는 SpEL 표현식이 올바르게 지정되었는지 확인하세요.
  • 메소드에 전달되는 파라미터인 pagesize가 실제로 null인지 디버깅을 통해 확인해 보세요.
  • Spring Expression Language (SpEL)를 사용할 때 파라미터명이 정확히 적용되었는지 확인하세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

danseung님의 프로필 이미지

작성한 질문수

질문하기