💡 개요
오늘은 자바 애플리케이션에서 Redis에 데이터를 저장하거나 조회할 때 사용하는 직렬화에 대해 정리해 보자
📕 Redis 직렬화 적용 전
자바 환경에서 Redis에 데이터를 저장할 땐 직렬화를 사용해야 한다.
다음은 Redis에 접근할 때 사용하는 RedisTemplate을 설정하는 Redis Confguration 코드이다.
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
return redisTemplate;
}
}
위 코드에서는 redisConnectionFactory() 와 redisTemplate() 두 개의 빈(Bean)을 등록하여, 애플리케이션에서 RedisTemplate을 사용할 수 있도록 설정하고 있다.
참고로 위 설정 코드는 Redis에 아무런 직렬화를 적용하지 않은 코드이다.
🤔 직렬화를 사용하지 않으면?
만약 직렬화 관련 설정이 없다면 어떻게 될까?
일단 위 코드를 그대로 사용해 Redis에 데이터를 저장해 보자.
Redis에 저장된 데이터를 확인해 보면 다음과 같은 형태가 된다.
127.0.0.1:6379> KEYS *
1) "\\xac\\xed\\x00\\x05t\\x00 CHECK_EMAIL:gudtjr2949@naver.com"
127.0.0.1:6379> GET "\\xac\\xed\\x00\\x05t\\x00 CHECK_EMAIL:gudtjr2949@naver.com"
"\\xac\\xed\\x00\\x05t\\x00\\x06af60f5"
Key와 Value가 알 수 없는 문자(\xac\xed\x00\x05t\x00)가 포함되어 저장된 것을 확인할 수 있다.
😎 알 수 없는 문자가 추가되는 이유
이러한 현상은 RedisTemplate의 기본 직렬화 방식이 JDK 직렬화이기 때문이다.
🛠️ JdkSerializationRedisSerializer
JdkSerializationRedisSerializer 은 JDK의 기본 직렬화 방식이다.
만약 Redis 설정에서 아무런 직렬화 설정을 하지 않은다면 JdkSerializationRedisSerializer 방식을 사용한다.
JDK 기본 직렬화의 문제점은 위에서 보다시피 데이터가 바이너리 형태(\xac\xed\x00\x05t\x00) 그대로 저장된다.
그렇기 때문에 사람이 알아보기 힘든 형태인 것이다.
🛠️ Redis 직렬화 기술
🛠️ StringRedisSerializer
StringRedisSerializer는 Redis에 저장되는 데이터를 UTF-8 문자열(String)로 변환하는 직렬화 도구이다.
보통 Key 직렬화에는 웬만하면 StringRedisSerializer를 사용하는 것이 좋다.
그 이유는 일반적으로 Redis에 저장되는 Key는 문자열 형태로 저장되기 때문이다.
🛠️ GenericJackson2JsonRedisSerializer
GenericJackson2JsonRedisSerializer는 이름에서 알 수 있듯이 데이터를 JSON 형식으로 직렬화하는 기술이다.
자바에서 DTO(Data Transfer Object)는 일반적으로 JSON 형태로 내부 또는 외부 시스템과 주고받는다.
이러한 특성 덕분에, DTO를 별도의 변환 과정 없이 그대로 Redis에 저장하고 사용할 수 있다.
📕 Redis 직렬화 적용 후
위에서 언급한 대로 Key는 StringRedisSerializer, Value는 GenericJackson2JsonRedisSerializer 을 사용하자.
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
그리고 Redis에 저장된 데이터는 다음과 같다.
127.0.0.1:6379> KEYS *
1) "CHECK_EMAIL:gudtjr2949@naver.com"
127.0.0.1:6379> GET "CHECK_EMAIL:gudtjr2949@naver.com"
"\\"49d33e\\""
참고로 Value에 보이는 \..\ 는 Redis CLI가 데이터를 JSON 스타일로 출력하면서 이스케이프 처리한 것일 뿐, 실제 Redis에 저장된 데이터에는 포함되지 않는다!
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.03.03 - Thread 조정 (동기화) (1) | 2025.03.03 |
---|---|
[개발 일기] 2025.03.02 - Thread 조정 (종료) (1) | 2025.03.02 |
[개발 일기] 2025.02.28 - @Profiles, @ActiveProfiles (1) | 2025.02.28 |
[개발 일기] 2025.02.26 - Dangling quantifier '+’ 에러 (0) | 2025.02.26 |
[개발 일기] 2025.02.25 - 전략 패턴 (0) | 2025.02.25 |