직렬화와 역직렬화 (Serialization & Deserialization)

이경환·2023년 7월 17일
0

JAVA

목록 보기
4/6

직렬화와 역직렬화

데이터 직렬화란 데이터를 직렬화 한다고 한다면 메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하기 위해 사용한다고 보면됩니다. 다시 이것을 디스크에 저장한 데이터를 읽거나, 네트워크 통시능로 부터 받은 데이터를 메모리에 쓸수 있도록 변환 하는 것을 데이터 역질렬화
라고 합니다.

그렇다면 직렬화가 필요한 이유는?

데이터의 구조를 크게 값 형식의 데이터(int,char,float) 참조 형식 데이터(객체,힙 메모리에 할당되는 데이터)로 구분 해보겠습니다.

위 데이터중 참조 형식의 데이터는 실제 데이터의 값이 아닌 힙에 할당된 메모리 주소를 가지고 있기 때문에 실제 디스크에 저장하거나 통신할 때는 값 형식의 데이터만 사용합니다.

  • 네트워크 통신을 한다거나 객체를 만들었다고 가정했을 때. 처음 저장된 메모리 위치가 다시 프로그램을 실행했을 때 일치하지 않고, 다른 PC에서도 저장된 객체의 메모리 주소가 전혀 다른 주소를 가리킨다.

즉 디스크에 저장하거나 네트워크 통신을 할 때 값 형식의 데이터만 사용 가능하고, 직렬화(
객체를 다른 환경에 저장했다가 나중에 재구성 할 수 있게 만드는 과정)를 통해 각 객체들의 주소 값이 가지는 데이터를 전부 값 형식의 데이터(int,char,float)로 변환 해 주어 사용하게됩니다.
직렬화를 하는 이유는 데이터를 디스크에 저장하거나 네트워크를 사용한 데이터 통신에서 파싱할 수있는 유의미한 데이터를 만들기 위한다고 보면 되겠습니다.

JSON 직렬화, 역직렬화

Json,XML과 같은 포맷을 이용한 직렬화도 가능합니다. 이로 인해 다른환경 , 다른언어로 만들어진 어플리케이션과도 통신이 가능해집니다. JSON 파싱,처리를 위해 JAVA는 Jackson이라는 라이브러리를 사용합니다.

그렇다면 JAVA의 직렬화란

자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.

자바 직렬화 조건

자바 기본(primitive) 타입과 java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건을 가집니다.

역직렬화 조건

직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야 하며 import 되어 있어야합니다.
중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 합니다.

ObjectInputStream과 ObjectOutputStream

자바에서는 객체의 직렬화, 역직렬화를 위해 ObjectInputStream과 ObjectOutputStream을 사용합니다.

ObjectOutputStream extends OutputStream

  • 직렬화 : 스트림에 객체를 출력하기 위해 사용
  • writeObject()

ObjectInputStream extends InputStream

  • 역직렬화 : 스트림으로부터 객체를 입력받기 위해 사용

  • readObject() : Object로 리턴되므로 형변환 필요

  • 다른 데이터 직렬화 종류
    - CSV

    • JSON

자바 직렬화의 예시

JVM의 메모리에서만 상주되어있는 객체 데이터를 그대로 영속화(Persistence)가 필요할 때 사용됩니다. 즉 시스템이 종료되더라도 없어지지 않는 영속화된 데이터로 다른 네트워크로도 전송이 가능해집니다. 다음이 대표적인 예시입니다.

  • 서블릿 세션 (Servlet Session)
  • 캐쉬(Cache)
  • 자바 RMI : 자바 RMI를 간단하게 이야기하자면 원격 시스템 간의 메시지 교환을 위해서 사용하는 자바에서 지원하는 기술입니다

하지만 사실은 많이 쓰지않는다.

(이팩티브 java 아이템 85. 자바 직렬화의 대안을 찾으라) 자바에서 직렬화는 권장되지 않는 경우가 습니다다. 너무 엄격한 타입 체크, 공격 범위가 넓어 악의적으로 공격할 수 있는 요소가 많습니다.
그렇기 때문에 직렬화를 구현할지는 신중히 결정해야 합니다.

정리

CSV, JSON 같은 형태의 직렬화는 대부분의 시스템에서 데이터교환 시 많이 사용됩니다.
자바 직렬화 형태의 데이터 교환은 자바 시스템 간의 데이터 교환을 위해서 존재한다고 보면 될 것 같습니다.

profile
개선하는 개발자, 이경환입니다

1개의 댓글

comment-user-thumbnail
2023년 7월 17일

저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!

답글 달기