본문 바로가기
카테고리 없음

Spring Redis 직렬화..역직렬화???

by dal_been 2023. 12. 16.
728x90

개인프로젝트하면서 redis를 이용해서 config로 redis를 설정했는데 아무생각없이 코드를 복붙했다가 멘토님께서 이거 이렇게 수정해하는게 좋겠다고 하셨다. 근데 그게 뭔지 모르니... 대충 찾아보고 고쳤기했는데 그래도 이해는 하고 있어야 하니 기록해보자구!

 

내가 쓴 코드는 뭐냐면....

 

  @Bean
  public RedisTemplate<?,?> redisTemplate(){
    RedisTemplate<byte[], byte[]> redisTemplate=new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    return redisTemplate;
  }

 

여기서 StringRedisSerializer를 아무 생각 없이 썻다. 그냥 다들 그렇게 하길래..

 

역직렬화 ?? 직렬화?

 

간단하게 얘기하자면 직렬화는 객체나 데이터 구조를 메로리나 디스크에 저장하거나 네트워크를 통해 전송하기 위해 바이트 스트림 또는 다른 형식으로 변환하는 과정을 의미한다. Redis의 경우 데이터를 문자열 형식으로 저장하고 이때 직렬화된 형태로 저장된다

 

역직렬화란 앞서 얘기한 직렬화된 데이터 형태를 원래 형태로 변환하는 과정을 의미한다. 예를 들어 직렬화된 json데이터를 다시 객체로 변환하는 작업을 역직렬화고 할 수 있다.

 

 

Redis 직렬화

 

직렬화 방법에는 여러가지가 있다.

 

1. Jackson2JsonRedisSerializer

 

Class Type을 지정해야한다. Redis에 객체를 저장할때 class 값 대신 class type을 json형태로 저장한다. 다만 class type을 지정하기 때문에 특정 클래스에 종석적이고, redisTemplate를 여러 스레드가 접근할게 될때 serializer타입의 문제가 발생하는 경우가 발생한다.

 

더보기

ThreadA에서는 ClassA 객체를 JSON으로 직렬화하고 저장하였는데, ThreadB에서는 ClassB 객체를 JSON으로 직렬화하려고 할 경우, redisTemplateThreadA에서 이미 설정한 직렬화 도구를 사용하여 ClassB 객체를 처리하려고 시도할 수 있습니다.

 

2. StringRedisSerializer

 

Json형태로 직접 encoding,decoding해줘야한다.

다만 class 타입 지정을 안해도 되고, 쓰레드간의 문제가 발생하지 않는다

 

3.GenericJackson2JsonRedisSerializer

 

객체의 클래스 지정없이 모든 class type을 json형태로 저장할 수 있다.

다만 Object의 클래스 및 Package까지 전부 함께 저장하게 되어 다른 프로젝트에서 redis에 저장되어있는 값을 사용하려면 Package까지 일치시켜줘야한다.

즉 msa 구조의 프로젝트같은 경우 문제가 발생할 수 있다.

 

4.JdkSerializationRedisSerializer

 

디폴트로 적용되는 기본 자바 직렬화 방식을 사용한다. Seriablizable인터페이스만 구현하면 별도의 작업 없이 사용가능하다. 하지만 SerialVersionUID 설정하지 않으면 클래스의 기본 해시값을 SerialVersionUid로 사용하는데 클래스 구조가 조금이라도 변경되면 SerialVersionUID가 달라서 역직렬화에 실패할 수 있다.

만약 개발자가 SerialVersionUID설정한다고 해도 클래스 내부 필드 타입이 변경되면 역시 역직렬화가 실패할 수 있다.

또한 타입에 대한 정보등 클래스 메타 정보들을 가지고 있기 때문에 직렬화시 용량이 비대해진다. 따라서 클래스 변경이 잦다면 사용하기 좀 그렇다..