개발 일지/Java

[Java] serialVersionUID

미숫가루설탕많이 2023. 7. 29. 14:06

Java에서 serialVersionUID는 직렬화(serialization)와 관련된 필드이다. 직렬화는 객체를 바이트 스트림으로 변환해서 저장하거나 네트워크를 통해 전송하는 과정을 말한다.

 

이렇게 직렬화된 객체는 나중에 역질렬화(deserialization)해서 원래 객체로 복원할 수 있다. 하지만 클래스의 구조가 변경되거나 버전이 업데이트된 경우에 문제가 발생할 수 있다.

 

이 때 'serialVersionUID'를 사용해서 객체 버전을 명시적으로 관리하는 것이다.

 

 

 

 

serialVersionUID의 목적

 

serialVersionUID는 직렬화된 객체의 버전 번호를 나타낸다.

 

객체가 직렬화되면 버전 번호가 함께 저장되며, 역직렬화될 때 같은 버전 번호를 가진 클래스로만 역직렬화가 가능하다.

 

이는 클래스의 구조가 변경되더라도 버전 번호가 같다면 문제없이 역직렬화가 가능하도록 보장해준다.

 

 

 

 

생성 방법

 

serialVersionUID는 클래스에 직접 선언될 수도 있고, 선언되지 않았을 경우 자동으로 생성된다.

 

자동 생성되는 경우는 클래스의 내용이나 구조가 변경될 때마다 달라진다. 그렇기 때문에 명시적으로 관리하기 위해 'serialVersionUID'를 선언하는 것이 일반적이다.

 

private static final long serialVersionUID = 123456789L;

선언할 때는 다음과 같이 static final long 타입의 변수로 선언되어야 한다.

여기서 '123456789L'은 임의의 값을 지정할 수 있으며, 실제로 사용할 때는 클래스가 변경될 때마다 값을 업데이트 해야 한다.

 

 

 

 

언제 serialVersionUID를 사용하면 될까?

 

  1. 클래스 버전을 관리할 때
    : 클래스의 구조가 변경되는 경우에도 역직렬화를 가능하게 하려면, serialVersionUID를 명시적으로 선언해서 버전 관리를 해야 한다.

  2. 호환성 유지
    : 직렬화된 객체를 다른 시스템으로 전송하거나 파일에 저장한 후, 나중에 해당 객체를 역직렬화해야 할 때, 'serialVersionUID'가 같다면 호환성을 유지해서 정상적으로 역직렬화를 할 수 있다.

 

 

 

 

주의해야 할 점

 

  • 'serialVersionUID'를 명시적으로 선언할 때는 개발자가 수동으로 값을 관리해야 한다. 예를 들어, 클래스 구조가 변경되면 해당 값을 업데이트 해줘야 한다.
  • 'serialVersionUID'를 생략하면 자동으로 생성되지만, 이 경우에는 클래스를 변경할 때마다 값이 달라지므로 주의해야 한다.