엔티티 구성요소 - 1 Serialize 왜 붙이는걸까?
JPA의 기본 사항을 정리한다.
Serialize 왜 붙이는걸까?
평소에 JPA를 사용하면서 Serializable
인터페이스를 구현하는 것을 본 적이 있을 것이다.
그런데 왜 Serializable
을 구현해야 하는지 궁금했던 적이 있었다.
//file: `Serializable을 구현한 Entity`
@Entity
public class Book implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
}
Java 14부터 @Serial 어노테이션을 사용할 수 있다. 이는 직렬화 관련 선언을 ‘컴파일’ 시점에 잡아내기 위해 설계되었다.
Serializable
인터페이스는 객체를 직렬화, 역직렬화 가능 여부에 대한 ‘가능성’ 여부라고 보면 된다.
자바의 직렬화, 역직렬화란?
객체의 상태를 바이트로 변환하여 파일에 저장하거나, 네트워킹을 통해 다른 JVM으로 전송하거나, db에 저장할 때도 쓰인다.
이 직렬화 역직렬화시에 버전 호환성을 식별하기 위해 SerialVersionUID를 사용한다.
Entity마다 Serializable을 필수적으로 선언해줘야 할까?
JPA 표준 스펙은 Entity에 Serializable을 구현하도록 되어있다.
BUT, 실무적 관점에서 필수라고 볼 순 없다. 직접 Entity를 통신하는 경우도 드물고, DTO를 통해 데이터를 주고 받는 경우가 많기 때문이다.
Json을 쓰면 Jackson 라이브러리가 자동으로 직렬, 역직렬화에 대한 책임을 가져가준다.
그러나 내 생각으로는 무조건 안할 필요는 딱히 없어보인다. 나는 혹시 모를 상황에 대한 대비로 표준 스펙을 지켜주려고 한다.
세션, 캐시, 메세지큐 등의 사용시에도 직렬화를 사용하기 때문이다.