JAVA / / 2021. 4. 12. 17:45

[Java] 자바 직렬화(Serialization)

반응형
Serialize를 언제 쓰는건지 파악하고자 정리를 해보았다.
직렬화(Serialization)
Java 내부 시스템에서 사용되는(또는 JVM 메모리에 올려진) 객체나 데이터를
외부에서 사용할 수 있도록 Byte 형태로 변환하는 것 (byte stream 형태)

→ 역직렬화 : 직렬화된 바이트 형태의 데이터를 객체로 변환하는 것.

직렬화를 쓰는 경우

  • VM의 메모리에서 상주하는 객체 데이터를 그대로 영속화(Persistence)할 때 사용된다.
    • 시스템이 종료되더라도 사라지지 않으며, 영속화된 데이터이기 때문에 네트워크로 전송도 가능하다.
  • Servlet Session
    • Servlet 기반의 WAS들은 대부분 세션의 Java 직렬화를 지원한다.
    • 파일로 저장, 세션 클러스터링, DB를 저장하는 옵션 등을 선택하면 세션 자체가 직렬화되어 저장 및 전달된다.
  • Cache
    • 캐시할 부분을 직렬화된 데이터를 저장해서 사용
  • Java RMI(Remote Method Invocation)
    • 원격 시스템의 메서드를 호출할 때 전달하는 메세지(객체)를 직렬화하여 사용
    • 메세지(객체)를 전달받은 원격 시스템에서는 메세지(객체)를 역직렬화하여 사용
    • 최근에는 많이 사용되지 않음

 

사용 이유

“자바 직렬화 형태의 데이터 교환은 자바 시스템 간의 데이터 교환을 위해서 존재한다.”

 

다른 직렬화

1. 문자열 형태의 직렬화

  김민건,machine.kmg@gamil.com
  • CSV : 콤마(,)를 기준으로 데이터를 구분하는 방법.
 { 
    name: "김민건",
    email: "machine.kmg@gmail.com",
    age: 28 
  }
  • JSON : key-value 형식으로 자바스크립트에서 쉽게 사용 가능하며, 오베헤드가 적다.

 

2. 이진 직렬화

message Person {
    required string user_name        = 1;
    optional int64  favourite_number = 2;
    repeated string interests        = 3;
}
  • Protocol Buffer : 구글에서 제안한 플랫폼 독립적인 데이터 직렬화 플랫폼
    (위는 프로토콜 버퍼의 스키마, 이외에는 JSON으로 기술한다.)
  • Apache Avro :  데이터를 binary형식으로 받아서, binary로 보낸다.(에이브로 스키마는 JSON 포맷과 IDL을 지원)

 

자바에서도 CSV, JSON을 사용하면 되지 자바 직렬화를 써야 되는 이유?

  • 목적에 따라 적절하게 써야한다.
  • 자바 직렬화의 장점
    1. 자바 직렬화는 자바 시스템에서 개발에 최적화.
    2. 복잡한 데이터 구조의 클래스의 객체라도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화 가능.
    3. 데이터 타입이 자동으로 맞춰지기 때문에 역직렬화가 되면 기존 객체처럼 바로 사용 가능.

 

serialVersionUID를 직접 관리하는 이유?

  • Java 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 한다.
  • 그런데 serialVersionUID를 직접 선언하지 않아도, 내부적으로 클래스의 구조 정보를 이용해 자동으로 생성된 해쉬값이 할당된다.
  • 때문에 클래스의 멤버 변수가 추가되거나 삭제되면 serialVersionUID가 달라지는데,
  • 역직렬화 할 때 기존의 serialVersionUID와 변경된 serialVersionUID가 다르면 java.io.InvalidClassException 예외가 발생한다.
  • 그러므로 위의 코드(private static final long serialVersionUID = 1L;) 처럼 직접 serialVersionUID 값을 관리해야 클래스가 변경되어도 문제없이 직렬화/역직렬화를 할 수 있다.
  • 하지만 serialVersionUID가 같다고 무조건 문제없이 직렬화/역직렬화 할 수 있는 것은 아니다.
    • 클래스의 멤버 변수 타입이 다르면 타입 예외가 발생한다.
    • 멤버 변수를 제거하거나 변수명을 바꾸면 예외는 발생하지 않지만 데이터는 누락된다.

 

 

참고

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유