Java - 직렬화(Serialization)란? (implement serializable)
들어가며
보통 도메인 객체에 Serializable 인터페이스를 구현한 것을 볼 수 있다. 직렬화라는 것이 자바 시스템 내부에서 사용되는 객체나 데이터들을 외부의 자바 시스템에서도 사용하기 위해 바이트 형태로 변환하는 기술이고 자바에서 직렬화를 사용하기 위해서는 Serializable 인터페이스를 구현한다 정도로만 알고 있었는데 직렬화에 찾다보니 내용이 생각보다 방대해서 이번 기회에 직렬화에 대한 이론적인 부분과 사용법에 대해서 정리해보려고 한다.
자바 직렬화란?
자바 시스템 내부에서 사용되는 객체 또는 데이터들을 외부의 자바 시스템에서도 사용할 수 있도록 바이트형태로 데이터를 변환하는 기술이다. (바이트 데이터 -> 객체로 변환하는 역변환의 과정을 역직렬화라고 함)
자바에서는 기본 타입과 java.io.Serializable 인터페이스를 상속받은 객체는 직렬화를 할 수 있는 기본 조건을 가진다.
직렬화 데이터
다음은 직렬화 데이터에 예시이다. 일직선의 연속적인 값들의 집합인 형태를 띄고 있다. 그래서 이렇게 전송/저장 가능한 데이터를 만드는 행위에 대해서 '직렬화'라는 이름이 붙게 되었다.
rO0ABXNyABp3b293YWhhbi5ibG9nLmV4YW0xLk1lbWJlcgAAAAAAAAABAgAESQADYWdlSQAEYWdlMkwABWVtYWlsdAASTGphdmEvbGFuZy9TdHJpbmc
자바 직렬화 왜 쓰는가?
자바 직렬화말고도 문자열 형태의 직렬화 방법인 CSV, XML, JSON이 존재한다. 표 형태의 다량의 데이터를 직렬화 시킬때는 CSV가 많이 쓰이고 구조적인 데이터는 예전에 XML을 많이 사용했었지만 최근에는 JSON형태를 많이 사용한다. 자바에서 CSV는 opencsv, JSON은 Jackson, GSON 라이브러리를 사용하여 변환이 가능하다.
이 글을 보면 이러한 의문점이 생긴다. '그럼 이런 방법을 사용하면 되지 왜 자바 직렬화를 쓰는거지?'라는 의문점이다.
자바 직렬화라는 이름에서도 알 수 있듯이 자바 시스템에 특화되어 있을 것이라는 내용정도는 유추가 가능하다. 자바 직렬화는 자바 개발자 입장에서 상당히 쉽고 빠르게 사용할 수 있도록 만든 기술로 JSON과 CSV와 같이 특정 라이브러리를 이용하거나 구조에 따른 매핑 작업 없이 Serializable 인터페이스만 구현해주면 기본 자바 라이브러리만으로 직렬화와 역직렬화를 사용할 수 있다.
자바 직렬화 언제 쓰이나?
개발을 하다보면 다음과 같은 경우가 있다.
1. 생성한 객체를 파일로 저장해야 하는 경우
2. 저장한 객체를 읽을 일이 생긴 경우
3. 다른 서버에서 생성한 객체를 받아와야 되는 경우 등..
이럴때 자바 직렬화를 사용한다면 객체 정보를 파일에 읽거나 쓸 수 있고 다른 서버와 주고 받을수도 있게 된다. JVM의 메모리에서만 상수되어 있는 객체 데이터를 그대로 영속화하여 시스템이 종료되더라도 없이지지 않는 장점이 있고 이렇게 영속화가 되어 있기에 네트워크로 전송도 가능하게 된다.
자바 직렬화 어디에 사용되나?
서블릿 세션
서블릿 기반의 WAS들을 대부분 세션의 자바 직렬화를 지원한다. 파일로 저장하거나 세션 클러스터링, DB를 저장하는 옵션 등을 선택하여 세션 자체가 직렬화 되어 저장 및 전달이 가능하다. 그러므로 세션에 필요한 객체는 Serializable 인터페이스를 implements 해둔다. (도메인 객체가 세션에 저장하지 않는 단순한 데이터 집합이고 컨트롤러에서 생성되어 뷰에서 소멸하는 데이터라면 직렬화는 고려하지 않아도 되는 부분.)
캐시
캐시란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 그래서 나중에 요청할 결과를 미리 저장해두어 추후 요청에 대하여 빠르게 서비스를 해주어 성능을 높일 수 있다. 예를 들어 모든 요청에 대하여 직접 DB에 접근하여 응답을 해준다면 퍼포먼스는 현저히 떨어질 것이다. DB 조회 후 가져온 데이터에 대하여 실시간 형태로 요구하는 데이터가 아니라면 메모리, 외부 저장소, 파일 등을 이용하여 데이터를 저장한 후 동일 요청에 대하여 캐시를 이용하여 응답해준다. 이렇게 캐시할 데이터에 대해서 자바 직렬화된 데이터를 저장해서 사용된다. (모든 캐시 데이터에 대하여 자바 직렬화를 사용하는 것은 아님.)