Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생

2024. 4. 16. 13:46·개발중/Spring Boot & Redis
728x90
반응형


문제: Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생

Spring Boot를 2.x.x 버전에서 3.x.x 버전으로 업그레이드하면서 AuthUser 객체의 직렬화 및 역직렬화 과정에서 문제가 발생했습니다. 

 

업그레이드 이전에는 이러한 이슈가 없었으나, 새 버전에서는 AuthUser 객체를 Redis에 저장하고 불러오는 과정에서 역직렬화를 할 수 없다는 오류가 발생했습니다.

 

 

해결 방법: Jackson Mix-In과 ObjectMapper 설정

이 문제를 해결하기 위해, Jackson 라이브러리의 Mix-In 기능을 활용했습니다. 

Mix-In을 사용하면 기존 클래스를 수정하지 않고도 직렬화 및 역직렬화 규칙을 적용할 수 있습니다. 

AuthUser 클래스에 대한 Mix-In을 다음과 같이 정의했습니다:

 

public abstract class AuthUserMixin {
    @JsonCreator
    public AuthUserMixin(@JsonProperty("id") Long id, 
                         @JsonProperty("email") String email,
                         @JsonProperty("name") String name) {}
}

 

 

위 Mix-In 정의는 AuthUser 객체가 직렬화 및 역직렬화될 때 필요한 필드를 명시적으로 지정합니다. 

이를 통해 JSON으로부터 객체를 올바르게 생성할 수 있게 도와줍니다.

Redis 설정 업데이트

또한, Spring의 RedisTemplate와 함께 사용할 ObjectMapper를 설정하는 부분에 이 Mix-In을 등록했습니다. 

ObjectMapper는 Spring Security와 관련된 모듈들을 불러오고, AuthUser에 대한 Mix-In을 추가하여 직렬화/역직렬화 규칙을 적용합니다.

private ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModules(SecurityJackson2Modules.getModules(this.loader));
    mapper.addMixIn(AuthUser.class, AuthUserMixin.class);
    return mapper;
}

@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
    return new GenericJackson2JsonRedisSerializer(objectMapper());
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    RedisSerializer<Object> serializer = springSessionDefaultRedisSerializer();
    redisTemplate.setHashValueSerializer(serializer);
    redisTemplate.setValueSerializer(serializer);
    return redisTemplate;
}

 

 


 

Jackson Mix-In에 대한 이해

Jackson Mix-In은 복잡한 직렬화 및 역직렬화 요구사항을 처리하는 데 유용한 기능입니다. 

이 기능을 사용하여 클래스에 직접 어노테이션을 추가하지 않고도 필요한 직렬화 또는 역직렬화 동작을 제어할 수 있습니다. 

Mix-In 기능은 특히 코드 변경 없이 외부 라이브러리나 수정할 수 없는 클래스에 대해 특정 직렬화 동작을 적용하고자 할 때 매우 유용합니다.

Mix-In의 작동 원리

Mix-In은 타깃 클래스에 대해 원하는 어노테이션을 "혼합"하여 적용합니다. 

이는 원본 클래스를 변경하지 않고도 특정 직렬화/역직렬화 규칙을 적용할 수 있는 강력한 방법을 제공합니다. 

Jackson은 Mix-In을 사용하여 타깃 클래스의 인스턴스를 직렬화하거나 역직렬화할 때 Mix-In에 명시된 어노테이션을 참조합니다.

 

Mix-In 클래스 정의

public abstract class MyClassMixIn {
    @JsonIgnore
    public int age;  // 직렬화에서 이 필드를 제외합니다.
}


ObjectMapper에 Mix-In 등록

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(MyClass.class, MyClassMixIn.class);

 

 

이 설정을 통해 MyClass 객체를 직렬화할 때 age 필드는 JSON 결과에 포함되지 않습니다. 

이러한 방식으로 다양한 직렬화 옵션을 클래스에 적용할 수 있으며, 이는 코드의 재사용성과 유지 관리의 용이성을 증가시킵니다.

 


 

결과 및 결론

이러한 변경을 통해 AuthUser 객체의 직렬화 및 역직렬화 문제를 성공적으로 해결할 수 있었습니다. 

Spring Boot 3.x.x로의 업그레이드 과정에서 발생한 호환성 문제를 Jackson Mix-In을 활용해 깔끔하게 해결하면서, 애플리케이션의 세션 관리 기능을 원활하게 유지할 수 있게 되었습니다. 

이 경험은 비슷한 문제에 직면할 수 있는 다른 개발자들에게도 유용한 참고자료가 될 것입니다.


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

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

Spring Boot 3.x 및 Security 6.x를 이용한 중복 로그인 관리 방법  (0) 2024.05.03
Spring Boot와 Redis를 사용한 데이터 저장 및 관리  (0) 2024.05.03
Spring boot 3.2.2 & Redis & GenericJackson2JsonRedisSerializer  (0) 2024.04.15
클래스 변경과 직렬화: Spring Redis 환경에서의 serialVersionUID 관리  (0) 2023.11.17
로컬에서는 Spring Session, 배포에서는 Redis: 세션 저장소 분리 전략  (0) 2023.09.20
'개발중/Spring Boot & Redis' 카테고리의 다른 글
  • Spring Boot 3.x 및 Security 6.x를 이용한 중복 로그인 관리 방법
  • Spring Boot와 Redis를 사용한 데이터 저장 및 관리
  • Spring boot 3.2.2 & Redis & GenericJackson2JsonRedisSerializer
  • 클래스 변경과 직렬화: Spring Redis 환경에서의 serialVersionUID 관리
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (932)
      • 개발중 (634)
        • 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 (87)
        • 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)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생
상단으로

티스토리툴바