[Java] 직렬화

PADO·2021년 1월 11일
1

Java

목록 보기
1/6
post-thumbnail

👾 자바 직렬화란?

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

시스템적으로 보자면, JVM의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태

 

👾 자바 직렬화는 어떻게 사용하나?

자바 직렬화 조건

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

직렬화할 회원 클래스
public class Member implements Serializable {
	private String name;
	private String email;
	private int age;
    
	public Member(String name, String email, int age) {
		this.name = name;
		this.email = email;
		this.age = age;
	}
    
	// Getter 생략
    
	@Override
	public String toString() {
		return String.format("Member{name='%s', email='%s', age='%s'}", name, email, age);
	}
}

직렬화 방법

자바 직렬화는 java.io.ObjectOutputStream객체를 이용한다.

Member member = new Member("이정원", "gardenia@ewhain.net", "24");
byte[] serializedMember;

try (ByteArrayOutputStream byteStream = new ByteArrayOutputStream()) {
	try (ObjectOutputStream objectStream = new ObjectOutputStream(byteStream)) {
		objectStream.writeObject(member);
		serializedMember = byteStream.toByteArray(); // 직렬화된 member 객체
	}
}

// 바이트 배열로 생성된 직렬화 데이터를 base64로 변환
Base64.getEncoder().encodeToString(serializedMember);

역직렬화 조건

  • 직렬화 대상이 된 객체의 클래스가 classpath에 존재해야 하며 import 되어 있어야 한다.

  • 중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 한다.

  • 자바 직렬화 대상 객체는 동일한 serialVersionUID 를 가지고 있어야 한다.

    private static final long serialVersionUID = 1L;
역직렬화 예제
// 직렬화 예제에서 생성된 base64 데이터 
String base64Member = "...생략";
byte[] serializedMember = Base64.getDecoder().decode(base64Member);
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)) {
	try (ObjectInputStream ois = new ObjectInputStream(bais)) {
		// 역직렬화된 Member 객체를 읽어온다.
		Object objectMember = ois.readObject();
		Member member = (Member) objectMember;
		System.out.println(member);
	}
}

 

👾 다양한 자바 직렬화 방법

CSV

콤마(,) 기준으로 데이터를 구분하는 방법

Member member = new Member("이정원", "gardenia@ewhain.net", 24);
// member객체를 csv로 변환 
String csv = String.format("%s,%s,%d",member.getName(), member.getEmail(), member.getAge()); 
System.out.println(csv);

JSON

가장 많이 사용하는 포맷, 다른 데이터 포맷에 비해 오버헤드가 적어 인기가 많음

Member member = new Member("이정원", "gardenia@ewhain.net", 24);
  // member객체를 json으로 변환 
  String json = String.format(
          "{\"name\":\"%s\",\"email\":\"%s\",\"age\":%d}",
          member.getName(), member.getEmail(), member.getAge());
  System.out.println(json);

자바에서는 Jackson, GSON 등의 라이브러리를 이용해서 변환할 수 있다.

자바에서 CSV, JSON을 사용하지 않고 직렬화를 사용하는 이유

목적에 따라 적절하게 써야 한다.

👾 자바 직렬화의 장점

  • 자바 시스템에서 개발에 최적화 되어 있다.
    복잡한 데이터 구조의 클래스 객체라도 직렬화 기본 조건만 지키면 바로 직렬화 가능.
  • 데이터 타입이 자동으로 맞춰지기 때문에 관련 부분을 신경쓰지 않아도 됨.

 

👾 자바 직렬화 왜 사용하나?

자바 시스템 간 데이터 교환을 위해 존재

 

👾 자바 직렬화 언제 사용하나?

JVM의 메모리에서만 상주하는 객체 데이터를 그대로 영속화(Persistence) 시킬 때 사용.
→ 시스템이 종료되더라도 없어지지 않음

영속화된 데이터이기 때문에 네트워크로 전송도 가능
→ 필요할 때 직렬화된 객체 데이터를 가져와 역직렬화하여 바로 사용할 수 있음.

0개의 댓글