Java Serialization은 왜 만들어졌는가?
•
JVM의 메모리에서만 상주되어있는 객체 데이터를 그대로 영속화(Persistence)가 필요할 때 사용
•
시스템이 종료되더라도 없어지지 않는 장점을 가지며 영속화된 데이터이기 때문에 네트워크로 전송 가능
•
필요할 때 직렬화된 객체 데이터를 가져와서 역직렬화하여 객체를 바로 사용 가능
•
디스크에 저장하거나 통신할 때 참조 형식 데이터를 사용할 수 없다.
◦
값 형식 데이터 : int, float, char 등 스택에 메모리가 쌓이고 직접 접근이 가능하다.
◦
참조 형식 데이터 : 객체와 같은 참조 형식 변수를 선언하면 힙에 메모리가 할당되고, 스택에서는 이 힙 메모리를 참조하는 구조로 되어 있다.
Java Serialization의 단점
•
직렬화한 객체의 구조와 역직렬화 할 현재 객체의 구조가 다르면 에러가 발생한다.
•
타입 체크가 매우 엄격하다.
•
타 직렬화에 비해 직렬화 된 데이터의 용량이 크다.
Java Serialization은 어디서 사용되는가?
•
서블릿 세션
◦
세션을 서블릿 메모리 위에서 운용한다면 직렬화를 필요로 하지 않지만, 파일로 저장하거나 세션 클러스터링, DB를 저장하는 옵션 등을 선택하게 되면 세션 자체가 직렬화가 되어 전달된다. 그래서 세션에 필요한 객체는 java.io.Serializable 인터페이스를 구현하는 것이 좋다.
•
캐시
◦
Encache, Redis, memcached 등의 라이브러리 시스템에서 캐시 할 부분을 자바 직렬화된 데이터를 저장해서 사용한다. 다른 직렬화 방식도 사용되지만, 자바 직렬화가 가장 간편해서 많이 사용된다.
•
자바 RMI
◦
원격 시스템 간의 메시지 교환을 위해서 사용하는 자바에서 지원하는 기술이다. 원격 시스템의 메소드를 호출 시에 전달하는 메시지를 작동으로 직렬화하고, 전달 받는 원격 시스템에서는 메시지를 역직렬화하여 사용한다.
Java Serialization 사용 시 주의할 점
•
외부 저장소로 저장되는 데이터는 짧은 만료 시간이 아니라면 자바 직렬화 사용을 지양한다.
•
역직렬화 시 반드시 예외가 생길 수 있다는 점을 인지하고 개발한다.
•
자주 변경되는 비즈니스적인 데이터에 대해 자바 직렬화 사용을 지양한다.
•
긴 만료 시간을 가지는 데이터는 JSON 등 다른 포맷을 사용하여 저장한다.