(2) 스프링 직렬화 For RedisCache, RedisSerializer
직렬화란 ?
자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.
이를 시스템적으로 얘기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태입니다.
즉 Redis는 Key와 Value를 byte 배열 형태로 저장하기 때문에, 자바의 데이터들을 Redis에 저장하기 위해서는 직렬화하여야 하고, Redis에 저장된 값들을 자바에서 사용하기 위해서는 역직렬화가 필요합니다.
Serializer
Redis에 자주 조회되는 데이터들을 저장하여 캐싱하기 위해서는 객체들을 직렬화/역직렬화 하여야 합니다.
이를 위한 RedisSerializer들이 있습니다.
JdkSerializationRedisSerializer
- Default로 적용되는 Serializer로, 기본 자바 직렬화 방식을 사용합니다.
- 직렬화하고자 하는 객체는 Serializable 인터페이스를 구현하여 간편하게 사용가능하다는 장점이 있지만, DB 등 장기간 저장하는 정보에 사용하기에는 어려움이 있습니다. serialVersionUID를 설정하지 않으면 클래스의 기본 해쉬값을 serialVersionUID로 사용하고, 클래스의 구조가 조금이라도 바뀌면 해당 값이 달라져서 역직렬화에 실패하기 때문입니다.
- 자바 직렬화는 객체를 바이트 스트림으로 변환하는 과정에서 많은 메타 데이터를 생성하고 추가하기 때문에, 이는 직렬화된 데이터의 크기를 증가시키기 때문에 성능 면에서 떨어질 수 있습니다.
즉, 클래스의 변경이 잦은 경우에는 이를 사용하는 것을 지양해야 하며 성능 면에서도 떨어질 수 있습니다.
GenericJackson2JsonRedisSerializer
- 클래스 타입을 지정할 필요없이 json으로 직렬화하여 다양한 데이터 타입을 저장할 때 사용합니다.
- JdkSerializationRedisSerializer와 달리 객체의 구조나 유형 변경에 유연하게 대처가 가능합니다.
- 하지만 클래스 타입을 포함하여 데이터를 저장하고 클래스의 패키지까지 같이 저장되기 때문에, 해당 데이터를 사용하기 위해서는 루트를 포함한 같은 경로에 해당 클래스를 생성해야만 사용이 가능합니다.
따라서 MSA 구조를 가지는 여러 애플리케이션에서 상호작용하는 도메인은 데이터를 공유하지 못할 수도 있습니다.
Jackson2JsonRedisSerializer
- 클래스 타입을 포함하여 저장하지 않지만, 항상 클래스 타입의 정보를 Serializer에 함께 지정해줘야 합니다.
- 따라서 RedisTemplate에 저장하고자 하는 클래스 타입 별로 Serializer를 지정해줘야 합니다.
- 이는 Redis에 저장하고자 하는 클래스의 종류가 많아지면 단점이 될 수도 있습니다.
StringRedisSerializer
- 문자열 데이터를 처리하는데 특화되어 있다.
- 클래스 타입을 별도로 지정할 필요가 없고, 패키지 정보를 저장하지 않을 수 있다.
- Jackson 라이브러리를 사용하여 객체를 json 문자열로 변경하여 Redis에 저장할 수 있다.
- 하지만 필요하지 않은 정보를 저장하지 않음과 그에 따른 문제를 해결할 수 있음으로 다른 구현체들의 단점을 보완 가능하다.
마무리
Redis의 데이터는 byte 배열로 저장되기 때문에 직렬화가 필요하고, 그 데이터를 사용하기 위해 역직렬화가 필요하며,
이를 위해 Serializer를 사용하고 구현체들의 각 특성을 따져 사용해야 합니다.
https://prefercoding.tistory.com/47
스프링 Redis 캐시, 세션 저장소와 분리
Redis는 서버에서 세션 저장소와 캐시 저장소로 많이 쓰인다. 한 개의 Redis 서버에서 둘을 모두 관리한다면 간편하지 않을까? 그렇지 않다. 그럼 분리하는 이유를 알아보자. 1. Redis의 싱글 스레드
prefercoding.tistory.com