[Java] serialVersionUID 에 대해
Java에서 serialVersionUID
는 직렬화(serialization)와 관련된 필드이다.
직렬화는 객체를 바이트 스트림으로 변환해서 저장하거나 네트워크를 통해 전송하는 과정을 말한다.
이렇게 직렬화된 객체는 나중에 역직렬화(deserialization)해서 원래 객체로 복원할 수 있다.
하지만 클래스의 구조가 변경되거나 버전이 업데이트된 경우에 문제가 발생할 수 있다.
이 때 serialVersionUID
를 사용해서 객체 버전을 명시적으로 관리하는 것이다.
serialVersionUID의 목적
serialVersionUID
는 직렬화된 객체의 버전 번호를 나타낸다.
객체가 직렬화되면 버전 번호가 함께 저장되며, 역직렬화될 때 같은 버전 번호를 가진 클래스로만 역직렬화가 가능하다.
이는 클래스의 구조가 변경되더라도 버전 번호가 같다면 문제없이 역직렬화가 가능하도록 보장해준다.
생성 방법
serialVersionUID
는 클래스에 직접 선언될 수도 있고, 선언되지 않았을 경우 자동으로 생성된다.
자동 생성되는 경우는 클래스의 내용이나 구조가 변경될 때마다 달라진다. 그렇기 때문에 명시적으로 관리하기 위해 serialVersionUID
를 선언하는 것이 일반적이다.
private static final long serialVersionUID = 123456789L;
선언할 때는 위와 같이 static final long 타입의 변수로 선언되어야 한다.
여기서 123456789L
은 임의의 값을 지정할 수 있으며, 실제로 사용할 때는 클래스가 변경될 때마다 값을 업데이트 해야 한다.
언제 serialVersionUID를 사용하면 될까?
-
- 클래스 버전을 관리할 때
- 클래스의 구조가 변경되는 경우에도 역직렬화를 가능하게 하려면,
serialVersionUID
를 명시적으로 선언해서 버전 관리를 해야 한다.
-
- 호환성 유지
- 직렬화된 객체를 다른 시스템으로 전송하거나 파일에 저장한 후, 나중에 해당 객체를 역직렬화해야 할 때,
serialVersionUID
가 같다면 호환성을 유지해서 정상적으로 역직렬화를 할 수 있다.
주의해야 할 점
-
serialVersionUID
를 명시적으로 선언할 때는 개발자가 수동으로 값을 관리해야 한다. 예를 들어, 클래스 구조가 변경되면 해당 값을 업데이트 해줘야 한다. -
serialVersionUID
를 생략하면 자동으로 생성되지만, 이 경우에는 클래스를 변경할 때마다 값이 달라지므로 주의해야 한다.
Leave a comment