Spring JPA Entity Serializable

Serializable(직렬화)은 객체를 byte stream으로 변환하는 메커니즘

역직렬화는 byte를 객체로 변환하는 메커니즘

serialVersionUID는 JVM에서 고유하게 식별하는 상수 입니다. 저장 및 로드 된 오브젝트가 동일한 속성을가지고 호환되는지 확인하는데에 사용합니다. serialVersionUID를 선언하지 않으면 JVM에서 자동으로 생성해 줍니다. 그러나 명시하는 것을 권장사항으로 하고 있습니다. 그 이유는 Class가 update될 경우 serialVersionUID가 변경될 수 있습니다.

경우 저장되어있는 UID와 객체의 UID가 다르기 때문에 InvalidClassException을 발생시킵니다.

  • 클래스가 Serializable 인터페이스를 implements하고 있는 경우 모든 하위 클래스도 직렬화가 가능합니다.(여기서 하위 클래스는 상속 받고 있는 클래스를 말합니다.)
  • 반대로 클래스에서 다른 객체를 참조하고 있는 경우 그 객체에서 별도로 Serializable 인터페이스를 implements해줘야 합니다.
  • static 변수는 객체 자체의 일부가 아니므로 직렬화 되지 않습니다.
  • Collection이나 Array를 직렬화 하는 경우 모든 요소가 직렬화 가능해야 합니다.(아닌 경우 NotSrializableException 발생)
  • 직렬화 가능 클래스 : 기본 Wrapper클래스(Integer, Long, Double…등), String, Date, collection 클래스 등 가능

단지 persistence가 목적이라면 Serializable은 필요하지 않습니다. 그러나 Entity에 Serializable을 구현(implements) 하는 것이 권장 사항 입니다.

JPA spec Entity는 객체와 분리되어 값에 의해 전달된다. 때문에 Entity class는 반드시 Serializable interface를 implments 해야한다.

Presentation layer에 domain(entity) 객체를 DTO나 VO대신 보낼 때 우리는 값으로써 전달합니다. 이 경우 Serializable을 implements해야 합니다. 그 이유는 HTTPSession에 값을 저장할 수도 있기 때문입니다.(caching/optimization 목적으로서). 또한 SerialVersionUID를 사용하기 위함도 있습니다.

JPA 구현체에 따라 엔티티를 분산 환경에서 사용할 수 있거나, 직열화해서 다른 곳에 전송할 수 있는 가능성을 열어준거지요. 반드시 적용해야되지는 않지만 표준 스펙이니 적용해두는게 더 나은 선택입니다.