직렬화

CHEESE·2022년 6월 2일
0

직렬화(Serialize)

  • 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
  • JVM의 메모리(힙 / 스택)에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
  • java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 할 수 있다.

역직렬화(Deserialize)

  • byte로 변환된 Data를 원래대로 Object 또는 Data로 변환하는 기술
  • 직렬화된 byte 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태

🙄 어디다 쓰죠?

서블릿 세션

  • 세션을 파일 또는 DB에 저장하거나 세션 클러스터링 등을 선택하게 되면 세션 자체가 직렬화되어 전달된다.

캐시

  • Ehcache, Redis, Memcached 라이브러리 시스템

자바 RMI(Remote Method Invocation)

  • 원격 시스템 간의 메시지 교환을 위해서 사용하는 기술

직렬화 방법

java.io.ObjectOutputStream을 사용하여 직렬화 진행

public static void main(String[] args){
	Member member = new Member("Cheese", 20);
    byte[] serializeMember;
 	try(ByeArrayOutputStream baos = new ByteArrayOutputStream()){
    	try(ObjectOutputStream oos = new ObjectOutputStream(baos)){
      		oos.writeObject(member);
      		// serializedMember == 직렬화된 member 객체
      		serializedMember = baos.toByteArray();
    	}
  	}
  	// byte 배열로 생성된 직렬화 데이터를 base64로 변환
  	System.out.println(Base64.getEncoder().encodeToString(serializedMember));
}

역직렬화 방법

역직렬화 조건

  • 직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야 한다.
  • 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 고려해야 한다.
  • 자바 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 한다.
	private static final long serialVersionUID = 1L;

역직렬화 방법

java.io.ObjectInputStream을 사용하여 역직렬화 진행

public static void main(String[] args){
	String base64Member = "...";
  	byte[] serializedMember = Base64.getDecoder().decode(base64Member);
  	try(ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)){
    	try(ObjecInputStream ois = new ObjectInputStream(bais)){
      		// 역직렬화된 member 객체 읽기
      		Object objectMember = ois.readObject();
      		Member member = (Member)objectMember;
      		System.out.println(member);
    	}
  	}
}

정리

  • 자바 직렬화는 타입에 엄격하다.
  • 외부 저장소로 저장되는 데이터는 자바 직렬화 사용을 지양한다.
  • 역직렬화시 반드시 예외가 생긴다는 것을 생각하고 개발한다.
  • 자주 변경되는 비즈니스 데이터는 자바 직렬화를 사용하지 않는다.
  • 긴 만료 시간을 가지는 데이터는 JSON 등 포맷을 사용하여 경량화된 형태로 저장한다.

0개의 댓글