개발자

스프링을 통해 캐싱 중 오류가 발생했습니다

2024년 02월 25일조회 547

안녕하세요 먼저 오류 종류에 대해서 말씀드리면 Null key returned for cache operation입니다 @Cacheable, @CachePut, @CacheEvict 모두 key값에다가 파라미터의 이름과 같이 key="#id"를 주었습니다. 그러자 위와 같은 에러가 발생하였습니다 id라는 변수명이 문제인가? 라는 생각을 가지고 다른 것으로 바꾸어 봤지만 똑같은 문제가 발생했습니다. 일단 해결방법은 defaultKey 값을 사용하거나 파라미터를 직접 key="#p0" 이렇게 하니 해결이 되었습니다. 구글링해도 아래와 같은 방법으로 해결하는 말만 있고 위에서와 같이 변수명을 사용할 때의 문제점이 안나와서 질문 올립니다!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 0

답변이 없을 때 보이는 아이콘

첫 답변을 기다리고 있어요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 02월 25일

`@Cacheable`이나 `@CachePut`, `@CacheEvict` 등에서 키값을 설정할 때 "#id"와 같이 주게 되면, 해당 메서드의 파라미터 중에 'id'라는 이름을 가진 파라미터를 찾아서 그 값을 키로 사용하려고 시도합니다. 즉, 이 문제가 발생한다면 메서드의 파라미터에 'id'라는 이름을 가진 것이 없거나, 그 값이 null일 가능성이 큽니다. 이런 경우 null 키는 캐싱 작업에서 불가능하기 때문에 오류가 발생하는 것입니다. 따라서 해결 방법으로 defaultKey를 사용하거나 "#p0"과 같은 인덱스 형태로 파라미터를 지정하게 되면 null인 경우 대비하여 키 값을 찾을 수 있습니다. 파라미터 이름 대신 인덱스를 사용하는 방법도 있지만, 이 경우 코드의 명확성 면에서는 조금 떨어질 수 있습니다. 따라서 key="#id"와 같은 방식으로 파라미터 이름을 직접 지정하는 것이 보통 더 바람직한데, 이 경우 메서드의 signature를 잘 확인하고 적용하는 것이 중요합니다. 즉, 메서드 호출시 전달되는 실제 id 값이 null인지 여부, 그리고 id라는 이름의 파라미터가 실제로 존재하는지 확인해야 합니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!