HttpSession과 직렬화

Dear·2025년 11월 20일

TIL

목록 보기
74/74

💙 직렬화(Serialization)

객체를 바이트 스트림으로 변환하는 과정

직렬화를 하면 객체를 세션, 파일, 네트워크 전송 등에 안전하게 저장하거나 전달할 수 있다.
서버가 세션을 저장하고 복원할 때 객체를 직렬화해서 저장하고, 역직렬화(Deserialization)해서 불러온다.

💙 httpSession.setAttribute("user", someObject);

세션에 저장하는 코드

WAS는 세션을 디스크나 다른 서버에 저장(세션 클러스터링) 할 수도 있다. 이때 세션에 들어있는 객체는 반드시 Serialization을 구현해야한다. 만약 직렬화가 불가능한 객체라면, 세션 저장 과정에서 NotSerializableException이 발생할 수 있다.

💙 httpSession.setAttribute("user", new SessionUser(user));

new SessionUser(user)로 감싸는 이유

직렬화 보장

SessionUserimplements Serializable을 해 세션 저장 가능
반면 JPA의 User 엔티티는 직렬화되지 않는다.

직렬화 코드 넣지 않는 이유

엔티티 클래스에는 언제 다른 엔티티와 관계가 형성될지 모른다.
@OneToMany, @ManyToMany 등 자식 엔티티를 갖고 있다면 직렬화 대상에 자식들까지 포함되어 성능 이슈, 부수 효과가 발생할 확률이 높다.
-> 직렬화 기능을 가진 세션 Dto 만드는 것이 이후 운영 및 유지보수 때 좋다.

엔티티 보호

  • 엔티티를 직접 세션에 넣으면, Lazy 로딩 프록시나 연관관계 필드까지 따라와서 직렬화 문제 발생 가능
  • 엔티티가 변경될 위험 존재 (세션 안에서 무분별하게 쓰이면 DB와 불일치 발생 가능)

필요한 데이터만 담기

  • 세션에는 인증된 사용자 정보(이름, 이메일, 사진) 정도로 충분해서 엔티티 전체를 담을 필요가 없다.
profile
친애하는 개발자

0개의 댓글