지난 포스팅의 레디스 관련 디버깅을 하며, 레디스 키가 잘 들어갔는지 이빅트 처리는 잘 되었는지 확인하는데 꽤 애를 먹었는데 이유는 캐시키가 사람이 읽을 수 없는 바이트배열로 변환이 되어 완전히 동일한 키인지 확인하기 어려웠기 때문이다.
왜 이상한 바이트배열들이 레디스 키로 들어가있나했더니, 레디스 자바 클라이언트인 Redisson의 설정파일에서 redisTemplate의 세팅값으로 자바의 기본 Serializer를 사용하도록 되어있기 때문이었다.
redisTemplate.setDefaultSerializer(new JdkSerializationRedisSerializer());
JdkSerializationRedisSerializer는 DefaultSerializer를 통해 객체를 output stream으로 직렬화시켜 바이트배열로 최종 아웃풋이 만들어 지게 된다. (JdkSerializationRedisSerializer 공식문서) 따라서 직전 포스팅에서 말미에 언급했던 것처럼 오브젝트의 null값과 빈값("")이 다르게 인식하도록 처리된다.
JAVA 직렬화(Serialization)과 역직렬화(Deserialization)
위 블로그가 잘 정리되어있어서 코드테스트 부분을 참조하였다. 바이트 배열로 생성된 직렬화 데이터를 base64로 변환하여 콘솔창에서 문자깨짐현상없이 동일한 오브젝트에 대해 동일한 직렬화 데이터가 생성됨을 확인할 수 있었다.
바이트배열로 레디스키를 생성할 경우 디버깅이 어렵기 때문에 StringRedisSerializer을 사용하는 것이 바람직한 것 같다. 스프링 공식문서에서도 언급이 되고 있는 부분이다.
잘보고갑니다😊