[자바 / JAVA] implements Serializable | 직렬화란 | 사용 이유

직렬화

자바에서 직렬화란 객체 데이터를 바이트(Byte) 형태로 변환하는 것이다. '직렬'이라는 말대로, 한 줄로 쭉 늘어놓은 바이트 데이터를 생각하면 된다. 객체에 마구 쌓여있는 데이터들이 바이트 단위로 정렬되는 형태라고 볼 수 있다. 직렬화는 java.io 패키지의 Serializable 인터페이스를 implements하면 가능하다. 단 직렬화 대상은 필드(멤버변수)들이다. 생성자와 메서드는 대상에 포함되지 않는다.

사용하는 이유

객체를 왜 바이트 단위로 변환해야할까. 데이터를 외부 서버로 전송하기 위해서다. 자체 메모리 위에서만 데이터를 운용한다면 굳이 직렬화하지 않아도 객체를 주고받을 수 있다. 그러나 객체를 DB에 저장하거나 파일로 저장한 객체를 전송하는 등의 상황에선 스트림을 통해 데이터를 보내는데 이때 바이트 단위로 보내야 한다. 반대로 다른 서버로부터 객체를 받아올 때 바이트 단위로 가져와서 다시 객체화하는 역직렬화도 사용된다. 이런 이유로 서블릿 기반의 WAS는 대부분 세션의 자바 직렬화를 지원한다.

Spring JPA Entity

조금은 내용에서 벗어나는 이야기지만 공부한 내용을 기록해 둔다. 스프링 JPA에서 Dto 클래스(Entity)는 Serializable를 구현한다. JPA Entity를 생성하면 기본값으로 implements Serializable이 코딩돼 있는 게 확인된다. 그러나 조금 의아하다. 통상 Dto 클래스는 DB 테이블을 매핑하는 용도로 활용되고 하이버네이트에서 객체를 외부 서버로 전송할 일은 거의 없다. 즉, 직렬화 없이도 기능상 문제가 없다. 그럼에도 분산 환경에서 사용하거나 다른 곳으로 전송할 수 있는 가능성을 열어두기 위해 문제가 없다면 그대로 사용하는 것이 권장된다.


참고

When and why JPA entities should implement the Serializable interface? - stackoverflow

자바 직렬화, 그것이 알고싶다. 훑어보기편 - 우아한형제들 기술 블로그

Serializable 질문 드립니다 - 인프런

JDK11 API

반응형

댓글

Designed by JB FACTORY