본문 바로가기

개발중/Spring Boot & Redis

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

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
반응형