클래스 변경과 직렬화: Spring Redis 환경에서의 serialVersionUID 관리

2023. 11. 17. 09:29·개발중/Spring Boot & Redis
728x90
반응형

 

k8s depolyment 의 이미지 버전을 업그레이드 시키니 이런 에러가 발생했습니다.

 

org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: com.rsn.lucy.api.db.company.domain.Company; local class incompatible: stream classdesc serialVersionUID = 6590452854062395951, local class serialVersionUID = 2663707115855654317

 

해석

SerializationException은 객체를 직렬화하거나 역직렬화하는 과정에서 문제가 발생했음을 나타냅니다. 여기서는 역직렬화 과정에서 오류가 발생했습니다.
SerializationFailedException은 주어진 바이트 배열을 역직렬화하는 데 실패했음을 나타냅니다. 이는 해당 바이트 배열이 DefaultDeserializer를 사용하여 생성된 것인지 질문하고 있습니다.
InvalidClassException은 com.rsn.lucy.api.db.company.domain.Company 클래스를 역직렬화하는 데 실패했다는 것을 의미합니다. 이는 저장된 데이터의 serialVersionUID와 현재 클래스의 serialVersionUID가 일치하지 않기 때문입니다. 여기서 스트림의 serialVersionUID는 6590452854062395951이고, 로컬 클래스의 serialVersionUID는 2663707115855654317입니다.

 

원인과 해결책

이 오류는 주로 클래스가 변경되었지만 Redis에 저장된 직렬화된 데이터가 이전 버전의 클래스를 기반으로 할 때 발생합니다. 클래스가 업데이트되면 serialVersionUID도 변경될 수 있으며, 이는 역직렬화 과정에서의 호환성 문제를 일으킵니다.
해결책으로는, Redis에 저장된 데이터를 삭제하고 새로운 형식으로 다시 저장하거나, serialVersionUID를 일치시켜주어야 합니다. 클래스 정의에서 serialVersionUID 값을 수동으로 설정하여 이전 버전과 일치시키는 방법도 있습니다.
이런 문제는 클래스의 변경이 자주 발생하는 개발 환경에서 자주 발생할 수 있으므로, 개발 과정에서는 Redis 데이터를 주기적으로 정리하거나 업데이트하는 것이 좋습니다.

 

 

해결과정

 

( Company 가 Serializable 를 상속 받았다고 가정 )

 

업그레이드 되기전의 Company 객체와 업그레이드 된 후의 Company 는 분명히 같은 객체지만 serialVersionUID 의 재정의는 필수가 아니기 때문에 하지 않았었습니다.

 

예를 들어서 Company 의 객체의 속성중에 타입 변경 or 변수 추가가 일어날 경우에는 serialVersionUID 가 변경 되기 때문에 이런 에러가 발생했습니다. ( serialVersionUID 가 다르므로 class 의 일관성을 보장 못함 )

 

그래서 아래와 같이 serialVersionUID 를 재정의 해줬습니다.

serialVersionUID  를 재정의 함으로써 Company Class 의 버전을 정의 할 수 있게 되었습니다.

 

 

 

만약 클래스의 구조가 변경되었지만 serialVersionUID를 변경하지 않는다면, 역직렬화 과정에서 InvalidClassException 같은 오류가 발생할 수 있습니다. 따라서 클래스를 수정하면 serialVersionUID도 적절히 업데이트하는 것이 좋습니다.

 

 

참고블로그

 

자바 직렬화, 그것이 알고싶다. 실무편 | 우아한형제들 기술블로그

{{item.name}} 자바의 직렬화 기술에 대한 대한 두 번째 이야기입니다. 실제 자바 직렬화를 실무에 적용해보면서 주의해야 할 부분에 대해 이야기해보려고합니다. 자바 직렬화 실제 업무에서 사용

techblog.woowahan.com

 

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

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

Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생  (0) 2024.04.16
Spring boot 3.2.2 & Redis & GenericJackson2JsonRedisSerializer  (0) 2024.04.15
로컬에서는 Spring Session, 배포에서는 Redis: 세션 저장소 분리 전략  (0) 2023.09.20
Spring Security에서 Redis를 사용하면서 겪은 SessionRegistry 문제  (0) 2023.09.20
[Spring - Redis] RedisReadOnlyException: READONLY You can't write against a read only replica. Master kill 시 에러 ( master / slave 구조임 )  (0) 2023.09.15
'개발중/Spring Boot & Redis' 카테고리의 다른 글
  • Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생
  • Spring boot 3.2.2 & Redis & GenericJackson2JsonRedisSerializer
  • 로컬에서는 Spring Session, 배포에서는 Redis: 세션 저장소 분리 전략
  • Spring Security에서 Redis를 사용하면서 겪은 SessionRegistry 문제
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)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
클래스 변경과 직렬화: Spring Redis 환경에서의 serialVersionUID 관리
상단으로

티스토리툴바