본문 바로가기

CS 지식

데이터 직렬화(Serialization)의 정의와 용도

728x90

1. 직렬화(Serialization)란? 

public interface Serializable{

}

Serializable 인터페이스를 보시면 안에 아무것도 없는 것을 보실 수 있습니다. 그럼 이게 왜 필요할까요?

 

생성한 객체를 파일로 저장하거나, 저장한 객체를 읽거나, 다른 서버에서 생성한 객체를 받을 때가 있습니다. 이럴 경우 필요한 게 Serializable입니다. 내가 만든 클래스를 파일에 읽거나 쓸 수 있게 하고, 아니면 다른 서버로 전송하고 받게 하려면 이 인터페이스를 구현해야 합니다. Serializble 인터페이스를 구현하면 JVM에서 객체를 저장하거나 다른 서버에 저장하게끔 만듭니다. 

 

요약하자면 직렬화는 메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형태로 변환하는 것을 뜻합니다.

 

2. 데이터를 그냥 사용하면 안 되는 이유

이유를 알기 위해서는 우선 데이터의 메모리 구조에 대해서 알아야 합니다. 메모리 구조의 종류는 2가지로 구분됩니다.

 

1) 값 형식 (Value Type) : int, float, char 등 이런 형식의 데이터는 스택에 메모리가 쌓이고 직접 접근이 가능합니다.

 

2) 참조 형식(Reference Type) : Java의 Object 형식, C의 포인터가 여기에 속합니다. 이런 형식의 변수를 선언하면 힙에 메모리가 할당되고, 스택에는 이 힙 메모리 주소를 참조하는 구조입니다. 

 

이 메모리 구조 중에서 디스크에 저장하거나 네트워크 통신에 사용되는 건, 값 형식(Value type)만 가능합니다. 참조 형식은 힙에 할당된 메모리 주소를 가져서 저장, 통신에 사용할 수 없습니다. 

 

그러면 왜 참조 형식은 안 될까요? 네트워크 통신을 예로 들자면 개인의 컴퓨터마다 사용하는 메모리 주소는 다릅니다. 그러면 내가 전송한 참조 형식을 네트워크로 보내면 어떻게 될까요? 받는 사람의 컴퓨터는 그 참조 형식을 받더라도 그 주소에는 전혀 다른 값이 있기 때문에 다른 값을 받게 됩니다.

 


직렬화를 하면 각 주소 값이 가지는 데이터를 전부 끌어모아서 값 형식(Value Type)으로 변환해줍니다. 이런 이유로 파일을 저장하거나 네트워크 통신 전에 무조건 '직렬화(Serializable)'를 해야 합니다

 

직렬화가 된 데이터는 프로그래밍 언어에 따라 텍스트 또는 바이너리 등의 형태가 됩니다. 이런 데이터가 돼야 저장하거나 네트워크 전송 시, 기계어 번역이 가능한 유의미한 데이터가 됩니다. 

 

728x90