객체를 바이트 스트림으로 변환하는 과정
직렬화를 하면 객체를 세션, 파일, 네트워크 전송 등에 안전하게 저장하거나 전달할 수 있다.
서버가 세션을 저장하고 복원할 때 객체를 직렬화해서 저장하고, 역직렬화(Deserialization)해서 불러온다.
httpSession.setAttribute("user", someObject);세션에 저장하는 코드
WAS는 세션을 디스크나 다른 서버에 저장(세션 클러스터링) 할 수도 있다. 이때 세션에 들어있는 객체는 반드시 Serialization을 구현해야한다. 만약 직렬화가 불가능한 객체라면, 세션 저장 과정에서 NotSerializableException이 발생할 수 있다.
httpSession.setAttribute("user", new SessionUser(user));
new SessionUser(user)로 감싸는 이유
SessionUser 는 implements Serializable을 해 세션 저장 가능
반면 JPA의 User 엔티티는 직렬화되지 않는다.
엔티티 클래스에는 언제 다른 엔티티와 관계가 형성될지 모른다.
@OneToMany, @ManyToMany 등 자식 엔티티를 갖고 있다면 직렬화 대상에 자식들까지 포함되어 성능 이슈, 부수 효과가 발생할 확률이 높다.
-> 직렬화 기능을 가진 세션 Dto 만드는 것이 이후 운영 및 유지보수 때 좋다.