자바 직렬화
카테고리: Java
태그: Collection Java
자바 직렬화
객체 직렬화란 자바가 객체를 바이트 스트림으로 인코딩하고(직렬화) 그 바이트 스트림으로부터 다시 객체를 재구성하는(역직렬화) 메커니즘이다.
시스템적으로 이야기하자면 JVM의 메모리에 상주(힙 또는 스택)되어 있는 개체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기 한다.
간단하게 말해서, 객체에 대한 정보를 하나의 바이트 배열로 변환하거나, 그 반대의 변환을 하는 기술이다.
직렬화의 종류
- 문자열 형태의 직렬화 방법 : 직접 데이터를 문자열 형태로 확인 가능한 직렬화 방법입니다. 범용적인 API나 데이터를 변환하여 추출할 때 많이 사용된다.
- Ex) CSV, JSON
- 이진 직렬화 방법 : 데이터 변환 및 전송 속도에 최적화하여 별도의 직렬화 방법을 제시하는 구조이다.
- Ex) Protocol Buffer
자바 직렬화
CSV, JSON, Protocol Buffer 등은 시스템의 고유 특성과 상관없는 대부분의 시스템에서의 데이터 교환 시 많이 사용된다.
하지만 자바 직렬화 형태의 데이터 교환은 자바 시스템간의 데이터 교환을 위해서 존재한다.
자바 직렬화를 사용하는 이유
CSV, JSON등과 같은 직렬화를 사용하여, 자바 시스템간의 데이터 교환이 가능하다.
그럼에도 불구하고 자바 직렬화를 사용하는 이유는 자바 시스템에서 개발에 최적화 되어 있기 때문이다.
- 직렬화 기본 조건만 지키면, 바로 직렬화가 가능하다.
- 역직렬화가 되면 기존 객체처럼 바로 사용가능하다.
- 데이터 타입이 자동으로 맞춰지기 때문
자바 직렬화 조건
자바 기본(primitive) 타입과 java.io.Serializable
인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건을 가진다.
자바 역직렬화 조건
- 직렬화 대상이 된 객체의 클래스가 캘래스 패스에 존재해야 하며,
import
되어 있어야 한다.import
되어 있지 않다고 해서 에러가 발생하지는 않는다.- 다만 다운 캐스팅을 하지 못해서, 저장된 원본 객체의 메서드를 사용하지 못 할 뿐이다.
- 자바 직렬화 대상 객체는 동일한
serialVersionUID
를 가지고 있어야 한다.serialVersionUID
의 기본 값은 클래스의해시값
이다.
직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 고려해야한다.
자바 직렬화은 언제 어디서 사용될까?
JVM의 메모리에서만 상주되어 있는 객체 데이터르 그대로 영속화가 필요할 때 사용된다. 영속화된 데이터이기 때문에 네트워크로 전송도 가능하다.
- 서블릿 세션 : 서블릿 기반의 WAS들은 대부분 세션의 자바 직렬화를 지원하고 있다.
- 캐시 : 자바 시스템에서 퍼포먼스를 위해 캐시(Ehcache, Redis, Memcached, …) 라이브러리를 시스템을 많이 이용하게 된다.
자바 직렬화를 사용할 때, 주의해야 할 점
- 역직렬화시 클래스 구조 변경 : 자바 직렬화는 타입에 엄격하다. 또한 여러가지 의미로, 예외가 발생할 수 있음을 주의해야 한다.
- 용량 : 자바 직렬화시 타입에 대한 정보 등 클래스의 메타 정보도 가지고 있기 때문에, 상대적으로 다른 포멧에 비해서 용량이 크다는 단점이 존재한다.
- 호환성 : 자바 직렬화를 이용하여 외부 데이터를 저장히게 되면, 자바에서만 읽을 수 있다. 다른 언어를 통해 데이터를 읽기가 상당히 어렵다.
우아한 개발자가 말하는 직렬화를 사용 시점
- 외부 저장소로 저장되는 데이터는 짧은 만료시간의 데이터를 제외하고 자바 직렬화를 사용을 지양합니다.
- 역직렬화시 반드시 예외가 생긴다는 것을 생각하고 개발합니다.
- 자주 변경되는 비즈니스적인 데이터를 자바 직렬화을 사용하지 않습니다.
- 긴 만료 시간을 가지는 데이터는 JSON 등 다른 포맷을 사용하여 저장합니다.
출처
이펙티브자바 우아한 기술 블로그 오라클 공식 문서
댓글 남기기