백엔드

직렬화(Serialization)란 무엇일까?

do_hyuk 2024. 3. 1. 11:01

직렬화라는 용어에 대해서 들어만 보고 공부해본 적이 없기에 이번 기회에 정리하게 되었다.

public interface Serializable {
}

Serializable의 인터페이스를 보면 메소드가 하나도 없는 것을 볼 수 있다. 아무런 구현해야 할 메소드도 없는 이 인터페이스가

왜 있는걸까

 

개발을 하다보면 아래와 같은 경우가 존재한다.

  • 생성한 객체를 파일로 저장할 일이 있을 수도 있다.
  • 저장한 객체를 읽을 일이 생길 수 있다.
  • 다른 서버에서 생성한 객체를 받을 일도 생길 수 있다.

이럴 때 꼭 필요한 것이 Serialization 이다. 우리가 만든 클래스가 파일을 읽거나 쓸 수 있도록 하거나, 다른 서버로 보내거나

받을 수 있도록 하려면 반드시 이 인터페이스를 구현해야 한다.

Serializable 인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다.

직렬화가 무엇인가?

자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로

데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기 한다.

 

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

바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기 한다.

 

Serializable 인터페이스를 구현한 클래스들을 보면 serialVersionUID라는 값을 지정해주는 것을 본 적이 있을 것이다.

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {

    private static final long serialVersionUID = 362498820763181265L;
}

예를 들어, HashMap 클래스를 보면 위와 같은 변수를 볼 수 있다. 이렇게 Serializable 인터페이스를 구현한 후에는 위와 같이 

serialVersionUID라는 값을 지정해 주는 것ㅇ르 권장한다.

(만약 별도로 지정하지 않으면, 자바 소스가 컴파일 될 때 자동으로 생긴다.)

static final long serialVersionUID = 1L;

위와 같이 반드시 static final long으로 선언해야 하며, 변수명도 serialVersionUID로 선언해 주어야 자바에서 인식을 할 수 있다.


UID 값은 어디에 사용되고 어떤 값을 넣어야 하나?

값은 아무런 값이나 지정해주면 된다.

값의 의미는 해당 객체의 버전을 명시하는데 사용한다.