serialVersionUID 이해하기
serialVersionUID 은 무엇일까
Java의 직렬화(serialization) 프로세스와 관련된 고유 식별자이다. 따로 명시되어 있지 않은 이상 객체를 직렬화할 때, JVM 이 자동생성하여 이 식별자 값을 직렬화 스트림에 같이 실어서 보낸다. 즉, 직렬화된 파일 안에 자동 생성된 고유 키값인 serialVersionUID 이 들어가 있다.
그리고 이를 꺼낼때 serialVersionUID 의 일치 여부를 확인해서 같지 않으면 에러를 낸다. 정해주지 않았는데 직렬화/역직렬화가 잘 되는 이유는 생성 되는 값이 똑같기 때문이다.
왜 이런 것이 필요한 것일까(왜 직렬화/역직렬화 매커니즘에 이런 것이 장치가 되어 있는 걸까)
직렬화 역직렬화시 안정성을 위해서이다. 안정성이라 함은 직렬화 시점의 Class A 가 역직렬화 시점에 없던 필드가 새로 생기거나 있던 필드가 없어지는 등 변경이 발생했을 때 의도적으로 역직렬화가 되지 않도록 함으로써 직렬화 하던 시점과 역직렬화 하는 시점의 클래스 일치 여부를 보장해주기 위함이다.
그래서 선언해주면 어떻게 되는데? 선언해 주는 것이 좋은 걸까, 선언하지 않는 것이 좋을까?
직렬화시 선언해준 serialVersionUID 을 가지고 출력 스트림에 실어 보낸다. 그래서 역직렬화시 클래스 정보가 바뀌었더라고 해도 (필드의 추가 혹은 삭제) 일치한 필드에만 보관중이던 직렬화된 데이터가 역직렬화 되어 다시 들어간다.
그래서 의도를 분명하게 해야한다. 직렬화/역직렬화 시점에 클래스가 무조건 동일하길 원한다면 오히려 선언해주지 않고 JVM 내부 매커니즘에 맡기는 것이 클래스 일치성을 잘 보장해주는 방법일 것이다.
하지만 유연하게 역직렬화 시점에 클래스가 직렬화 시점 대비 바뀌었더라도 역직렬화를 하고 싶다면 명시적으로 선언해주는 것이 맞다.
Last updated