티스토리 뷰

스프링부트에서 캐시 어노테이션을 사용하다보니 여러 가지 에러를 보게 되었다.

그 중 하나가 바로 위 에러인데, @CachePut에 key 값 없이 사용하다보니 제목에도 있듯이 아래 에러가 발생했다.

- java.lang.IllegalStateException: Cannot convert cache key

 

 

에러 발생 원인

우선 에러 발생은 key 값 없이 사용해서가 아니다. key 값 없이 사용할 경우 자동으로 key 값이 아래와 같이 들어가지게 된다.

또한 존재하지 않는 key 값을 사용했을 경우에 또한 존재하지 않는 그 새로운 key 값으로 캐시 데이터가 저장되서 상관 없다.

그렇다면 왜 이런 에러가 발생하는 것일까?

 

그건 바로 key 값이 없고 또한 해당 함수에 별도 파라미터 있을 경우 해당 함수의 파라미터로 key 값이 지정되는데 String이나 int와 같은 파라미터를 받는 함수이면 상관 없는데 별도 DTO를 받는 함수의 경우 DTO를 String으로 변환할 수 없어 이와 같은 에러가 발생되는 것이다.

예를 들어 아래와 같은 함수가 있을 때 'MenuRequest'의 경우 DTO이므로 String으로 변환해 key로 사용할 수 없어 이와 같은 에러가 발생하는 것이다.

// 메뉴 업데이트 하기
@CachePut(value = "menu")
public MenuList updateMenu(MenuRequest menuRequest) {
	...
}

 

 

해결 방법

해결 방법은 아주 간단하다. 캐시 어노테이션을 사용할 때 key value에 static text 값으로 지정하거나, 다른 해결 방법으로는 에러 메시지를 끝까지 보면 'toString()' 함수를 오버라이딩하라고 나와 있다.

여기서는 함수 파라미터로 받는 DTO의 toString() 함수를 오버라이딩 해서 key 값으로 쓸 수 있는 String의 값을 return 하도록 변경하는 방법을 설명해보도록 하겠다.

 

위에서 사용했던 'MenuRequest'를 예로 들면 아래와 같이 toString() 함수를 간단하게 오버라이딩 했다고 예를 들어보자.

@NoArgsConstructor
@AllArgsConstructor
@Getter
public class MenuRequest {
	...
    
	@Override
	public String toString() {
		return "all menu";
	}
}

 

그러면 위에 있었던 아래 함수에서 캐시 데이터 업데이트가 일어나고

// 메뉴 업데이트 하기
@CachePut(value = "menu")
public MenuList updateMenu(MenuRequest menuRequest) {
	...
}

 

키를 조회해보면 아래와 같이 toString()에서 return 값으로 설정해놓은 "all menu"로 key 값이 들어간 것을 볼 수 있다.

 

이와 같이 캐시 어노테이선의 key 값으로 사용해야하는 함수 DTO 파라미터의 경우 toString()을 통해 적절하게 key 값을 만들어 매칭시켜주면 된다.

 

또는 동적으로 key 값을 줄 필요가 없고, @Cacheable에서 이미 key를 넣지 않아서 'Simple Key ...' 형식으로 저장된 경우에는 아래와 같이 텍스트 값으로 key 값을 아예 정적으로 설정해서 사용할 수 있다.

@CachePut(value = "menu", key = "'SimpleKey []'")

 

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함