[개발일지] 230616 Quarkus Redis WRONGTYPE Operation against a key holding the wrong kind of value

Quarkus Redis


문제해결에 시간을 많이 사용한 하루였다.

 

문제 상황은 아래와 같다.

기존 redis에 key에 대응되는 하나의 value값을 String 타입으로 저장하고 있었늗네 이 key값(동일한 key)의 value를 3개 저장해야 했다. 그래서 데이터 타입을 hash로 변경해서 redis에 데이터를 저장을 하려고 했다.

 

기존에 작성된 코드 부분을 살펴보니 ValueCommands를 구현해서 String 값을 저장하고 있음을 알 수 있었다. 그래서 hash값을 저장하기 위해서 RedisCommands에 대해 알아보니 ValueCommands로 구현되어있던 부분을 hash 자료구조로 저장하기 위해서는 HashCommands로 변경하면 된다고 나와있었다.

 

HashCommands


 

위와 같이 각 key, field, value의 타입을 정해주고 hashCommands.hset() 메서드를 이용해 key값에 데이터를 저장하려고 했다.

 

https://quarkus.io/guides/redis-reference

 

대충 아래처럼 하나의 key값에 value를 3개 저장할 수 있다.

 

String key = "key";
String value = ...; 
LocalDate date1 = ...;
LocalDate date2 = ...;

hashCommands.hset(key, "value", value);
hashCommands.hset(key, "date1", date1);
hashCommands.hset(key, "date2", date2);

 

위와 같은 방법말고도 아래처럼 value들을 필드로 갖고있는 객체를 하나 생성해서 이 객체를 Value값으로 사용할 수도 있다. 

 

public class Value {
    String value;
    LocalDate date1;
    LocalDate date2;
    // 생성자, getter, setter
}

HashCommands<String, String, TradeInfo>

 

하지만 이 방법은 생성한 객체의 인스턴스를 문자열로 변환하거나 문자열에서 복원할 수 있는 방법이 필요하게 된다. (Jackson 라이브러리, 직접 직렬화 방법을 구현)

 

이렇게 key값에 대해 value값들을 저장하면 되는줄 알았는데 아래와 같은 에러 메시지가 발생했다.

 

WRONGTYPE Operation against a key holding the wrong kind of value


해당 에러는 보통 해당 key가 가진 값의 타입과 사용하려는 명령의 타입이 일치하지 않을 때 발생한다고 한다.

즉, key의 타입은 String인데 데이터를 조회할떄 hget으로 조회하려고 하면 위의 에러가 발생한다.

 

그래서 내 key값의 타입을 확인하는데 String으로 나오고 있었다.

 

redis key 타입을 확인하는 명령어

 

type key

 

나는 hash값이 나올 줄 알았는데 String이 나오고 있었다. 그래서 hashCommands.hset()메서드 작성이 잘못된줄 알고 이부분에서 삽질을 오래 했었는데 결론은 잘못된 부분은 없었다...

 

일단 type이 String이라 get key 해보는데 이전에 저장하고 있던 값이 나오고 있었다.

 

내가 저장하려는 값이 저장되고 있지 않았는데 그 이유는 아래와 같다.

문제의 원인은 이미 특정 타입의 데이터가 할당된 키에 대해 다른 타입의 데이터를 할당할 수 가 없다.

그러니까 이미 덮어쓰기가 안된다는 소리다. 그래서 기존의 key값을 지워주고 새로 할당해야 한다.

 

redis key 삭제 명령어

 

del key

 

key를 지워주고 다시 실행하니 정상적으로 hash형태로 저장되는것을 확인할 수 있었다.

 

간단한 문제였는데 근본적인 문제의 원인을 정확히 파악하지 못하니 다른 부분에서 삽질하느라 시간을 너무 소비했다.

사실 quarkus에 대해서 하나도 모르는 상황(quarkus redis가 따로 존재하는지도 몰랐다...)이라 내가 모르는 quarkus redis쪽에 문제가 있는건 아닌지 엄청 살펴보느라 시간을 엄청 썼다. 사수분은 redis의 값만 바꾸는 작업이라 간단할 줄 알고 작업을 맡기신거 같은데.. 아직 많이 부족하다는걸 매번 느낀다.

 

요즘엔 새로운 기술을 많이 접하고 있다. GraphQL, Amplify, AppSync 등등 많이 공부하고 있는데 생소한 기술이라 어렵지만 새로운걸 배운다는게 재밌기도 하고 더 잘하고 싶은데 쉽지가 않다.

 

 

References

https://quarkus.io/guides/redis-reference

 

Redis Extension Reference Guide

Quarkus: Supersonic Subatomic Java

quarkus.io