Redis캐시 직렬화 이해하기

dahn·2024년 4월 18일

지난 포스팅의 레디스 관련 디버깅을 하며, 레디스 키가 잘 들어갔는지 이빅트 처리는 잘 되었는지 확인하는데 꽤 애를 먹었는데 이유는 캐시키가 사람이 읽을 수 없는 바이트배열로 변환이 되어 완전히 동일한 키인지 확인하기 어려웠기 때문이다.

JdkSerializationRedisSerializer

왜 이상한 바이트배열들이 레디스 키로 들어가있나했더니, 레디스 자바 클라이언트인 Redisson의 설정파일에서 redisTemplate의 세팅값으로 자바의 기본 Serializer를 사용하도록 되어있기 때문이었다.

redisTemplate.setDefaultSerializer(new JdkSerializationRedisSerializer());

JdkSerializationRedisSerializer는 DefaultSerializer를 통해 객체를 output stream으로 직렬화시켜 바이트배열로 최종 아웃풋이 만들어 지게 된다. (JdkSerializationRedisSerializer 공식문서) 따라서 직전 포스팅에서 말미에 언급했던 것처럼 오브젝트의 null값과 빈값("")이 다르게 인식하도록 처리된다.

직렬화 실제 코드테스트

JAVA 직렬화(Serialization)과 역직렬화(Deserialization)

위 블로그가 잘 정리되어있어서 코드테스트 부분을 참조하였다. 바이트 배열로 생성된 직렬화 데이터를 base64로 변환하여 콘솔창에서 문자깨짐현상없이 동일한 오브젝트에 대해 동일한 직렬화 데이터가 생성됨을 확인할 수 있었다.

StringRedisSerializer

바이트배열로 레디스키를 생성할 경우 디버깅이 어렵기 때문에 StringRedisSerializer을 사용하는 것이 바람직한 것 같다. 스프링 공식문서에서도 언급이 되고 있는 부분이다.

profile

2개의 댓글

comment-user-thumbnail
2024년 4월 21일

잘보고갑니다😊

답글 달기
comment-user-thumbnail
2024년 4월 22일

디버깅 어려움을 명확하게 설명해 주셔서 도움이 되었습니다.

답글 달기