Spring boot 3.2.2 & Redis & GenericJackson2JsonRedisSerializer

2024. 4. 15. 15:25·개발중/Spring Boot & Redis
728x90
반응형

 

Spring Boot 2 에서 Spring Boot 3 으로 마이그레이션 하면서 Redis 역/직렬화 이슈가 발생하였습니다.

 

아래 문서를 읽고 기존에 사용하던 Jackson2JsonRedisSerializer 라이브러리를 GenericJackson2JsonRedisSerializer  라이브러리로 교체하였습니다.

 

https://docs.spring.io/spring-session/reference/configuration/redis.html

 

Jackson2JsonRedisSerializer  라이브러리 주석

 

GenericJackson2JsonRedisSerializer 

 

GenericJackson2JsonRedisSerializer 클래스는 Spring Data Redis에서 제공하는 RedisSerializer의 구현체 중 하나로, Java 객체를 JSON으로 직렬화하거나 JSON을 Java 객체로 역직렬화하는 데 사용됩니다. 이 직렬화기는 Jackson 라이브러리를 기반으로 합니다.

 

GenericJackson2JsonRedisSerializer의 특징

유연성

이 직렬화기는 ObjectMapper를 사용하여 객체를 JSON으로, JSON을 객체로 변환합니다. 

사용자가 직렬화 과정에서 사용할 ObjectMapper를 커스터마이즈 할 수 있어 다양한 설정을 적용할 수 있는 유연성을 제공합니다.

타입 정보 저장

기본 설정에서, GenericJackson2JsonRedisSerializer는 객체의 클래스 타입 정보를 JSON에 저장합니다. 이는 역직렬화 시 정확한 타입으로 객체를 복원할 수 있도록 도와주지만, JSON의 크기를 증가시킬 수 있습니다. 필요에 따라 이 기능을 비활성화할 수도 있습니다.

보안 설정

기본적으로 이 직렬화기는 타입 정보를 사용하여 역직렬화를 수행할 때 특정 클래스 타입으로의 역직렬화를 제한하여 보안 위험을 감소시킵니다. 예를 들어, 알려지지 않은 타입으로의 역직렬화 시도를 차단할 수 있습니다.

 

GenericJackson2JsonRedisSerializer를 사용하는 예는 다음과 같습니다. Spring에서 RedisTemplate 설정 시 이 직렬화기를 사용할 수 있습니다.

 

 @Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(factory);

    GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
    template.setValueSerializer(serializer);
    template.setHashValueSerializer(serializer);

    template.setKeySerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());

    template.afterPropertiesSet();
    return template;
}

 

 

이 설정은 모든 Redis 값에 대해 JSON 형태로 직렬화를 수행하도록 설정합니다. 

키에 대해서는 StringRedisSerializer를 사용하여 문자열로 직렬화합니다.

GenericJackson2JsonRedisSerializer 주의 사항

성능과 저장 공간

JSON 직렬화는 바이너리 직렬화에 비해 CPU 자원을 더 많이 사용하며, 저장 공간도 더 많이 필요할 수 있습니다. 직렬화된

데이터의 크기가 중요한 경우 다른 직렬화 방법을 고려할 수 있습니다.

 

역직렬화 문제

클래스 타입 정보가 변경되거나 삭제되었을 때 역직렬화 과정에서 오류가 발생할 수 있습니다. 이는 클래스 정의가 변경된 경우에 특히 문제가 될 수 있습니다.
GenericJackson2JsonRedisSerializer는 매우 유용하지만, 사용 사례에 따라 적절한 설정과 관리가 필요합니다.

 

 

GenericJackson2JsonRedisSerializer 을 활용하여 직렬화와 역직렬화하는 방법

public void saveDataToRedis(String key, SomeObject data) {
    redisTemplate.opsForValue().set(key, data);
}

public SomeObject fetchDataFromRedis(String key) {
    return (SomeObject) redisTemplate.opsForValue().get(key);
}

 

 

GenericJackson2JsonRedisSerializer 고급 설정 및 사용자 정의

GenericJackson2JsonRedisSerializer는 내부적으로 ObjectMapper를 사용합니다. 기본 생성자 외에도 사용자 정의 ObjectMapper를 인자로 받는 생성자를 제공하여, 직렬화 및 역직렬화 동작을 더 세밀하게 제어할 수 있습니다.

사용자 정의 ObjectMapper 설정 예제

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);

    // ObjectMapper 사용자 정의
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);  // 타입 정보 포함 설정
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);  // 날짜와 시간 형식 설정
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

    GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(objectMapper);

    template.setValueSerializer(serializer);
    template.setHashValueSerializer(serializer);
    template.setKeySerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());

    template.afterPropertiesSet();
    return template;
}

 

참고문서

 

https://github.com/spring-projects/spring-data-redis/blob/main/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java

 

spring-data-redis/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java at main · spr

Provides support to increase developer productivity in Java when using Redis, a key-value store. Uses familiar Spring concepts such as a template classes for core API usage and lightweight reposito...

github.com

 

728x90
반응형
저작자표시 (새창열림)

'개발중 > Spring Boot & Redis' 카테고리의 다른 글

Spring Boot와 Redis를 사용한 데이터 저장 및 관리  (0) 2024.05.03
Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생  (0) 2024.04.16
클래스 변경과 직렬화: Spring Redis 환경에서의 serialVersionUID 관리  (0) 2023.11.17
로컬에서는 Spring Session, 배포에서는 Redis: 세션 저장소 분리 전략  (0) 2023.09.20
Spring Security에서 Redis를 사용하면서 겪은 SessionRegistry 문제  (0) 2023.09.20
'개발중/Spring Boot & Redis' 카테고리의 다른 글
  • Spring Boot와 Redis를 사용한 데이터 저장 및 관리
  • Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생
  • 클래스 변경과 직렬화: Spring Redis 환경에서의 serialVersionUID 관리
  • 로컬에서는 Spring Session, 배포에서는 Redis: 세션 저장소 분리 전략
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (938)
      • 개발중 (635)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (88)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
      • 논문 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    git
    네트워크 관리사 2급
    리눅스 마스터 요약
    Spring
    네트워크 관리사 학점
    네트워크 관리사 요약
    BackendDevelopment
    리눅스 마스터
    리눅스 마스터 1급
    쿠버네티스 스터디
    리눅스 1급 요약
    스프링
    리눅스 마스터 1급 정리
    파이썬
    네트워크 관리사 자격증
    docker
    네트워크 관리사 실기
    springboot
    네트워크 관리사
    쿠버네티스
    REST API
    Git 저장소
    VUE
    redis
    리눅스 마스터 1급 요약
    jpa
    파이썬 알고리즘
    네트워크 관리사 2급 실기
    java
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
Spring boot 3.2.2 & Redis & GenericJackson2JsonRedisSerializer
상단으로

티스토리툴바