본문 바로가기
개발이야기

데이터 직렬화(serialization)는 무엇이고 왜 필요한가?

by Kim_Jack 2020. 5. 24.
반응형

우선 이 글은 구글링에서 나오는 여러 가지 직렬화에 대한 글들과 설명들을 읽고 제 나름대로 한번 더 이해하기 편하도록 정리한 글입니다.

 

데이터 직렬화(serialization), 역직렬화(deserialization)는 무엇이고 왜 필요한가?  

소프트웨어 개발에서 말하는 데이터 직렬화(serialization)는 한 마디로 간략하게 요약하자면

 

메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환하는 것을 말한다. 

 

역직렬화(desrialization)는 그 반대로 디스크에 저장한 데이터를 읽거나, 네트워크 통신으로 받은 데이터를 메모리에 쓸 수 있도록 다시 변환하는 것이다. 

 

여기서 궁금증이 해결되지 못한 사람들이 많을 텐데(내가 그랬다) 내가 아는 대로 자세히 설명해보도록 하겠다. 

 

앞서 얘기한대로 직렬화는 데이터를 저장 혹은 통신에 사용하기 위함인데 데이터를 그냥 사용하면 안 되고 직렬화라는 과정을 거쳐야 할까? 

 

직렬화는 왜 필요한가? 사용이유 

우선 메모리(힙 영역, 스택 영역등)의 대한 기본적인 지식이 있어야 이해가 가능하다. 

 

개발 언어로 무엇을 사용하던(C++, C, C#, Java 등,,) 사용하는 데이터들의 메모리 구조는 크게 2가지로 나뉜다. 

1. 값 형식 데이터(Value Type) : 우리가 흔히 선언해서 사용하는 int, float, char 등, 값 형식 데이터들은 스택에 메모리가 쌓이고 직접 접근이 가능하다.

 

2. 참조 형식 데이터(Reference Type) : C#에서 Object 타입 혹은 C++에서 포인터 변수들이 여기에 해당된다. 해당 형식의 변수를 선언하면 힙에 메모리가 할당되고 스택에서는 이 힙 메모리를 참조하는(힙에 메모리 번지 주소를 가지고 있음) 구조로 되어있다.

 

이 두가지 데이터 중에서 디스크에 저장하거나 통신에는 값 형식 데이터(Value Type)만 가능하다. 

참조 형식 데이터(Reference Type)는 실제 데이터 값이 아닌 힙에 할당되어있는 메모리 번지 주소를 가지고 있기 때문에 저장, 통신에 사용할 수 없다.

 

왜 참조 형식 데이터는 사용할 수 없을까 ? 

예를 들자면

포인터 변수 Class A 를 선언하고 객체를 만들어 그 주소 값이 0x00045523라고 가정하자. 

그리고 이 값을 파일에 포함하여 저장했다고 해보자. 

그 후 프로그램을 종료하고 다시 실행해서 주소값 0x00045523을 가져오더라도 기존 A 객체의 데이터를 가져올 수 없다.(프로그램이 종료되면 기존에 할당되었던 메모리(0x00045523)는 해제되고 없어진다)

  

네트워크 통신 또한 마찬가지이다.

각 PC마다 사용하고있는 메모리 공간 주소는 전혀 다르다. 

그렇기 때문에 내가 다른 PC로 전송한 A객체 데이터(0x00045523)은 무의미하다. 

이 데이터를 받은 PC에서의 메모리 주소 0x00045523에는 전혀 다른 값이 존재하기 때문이다.

 

직렬화를 하게 되면 각 주소값이 가지는 데이터들을 전부 끌어모아서 값 형식(Value Type)데이터로 변환해준다. 

이러한 이유 때문에 데이터를 저장, 통신전에 '데이터 직렬화(Serialization)' 작업이 필요한 것이다!! 

직렬화가 된 데이터들은 언어에 따라서 텍스트 또는 바이너리 등의 형태가 되는데, 이러한 형태가 되었을 때 저장하거나 통신 시 파싱이 가능한 유의미한 데이터가 되는 것이다.

 

한 가지 예시를 더 말하자면, 

String이 포인터로 구현되어있는 경우 int, double 등 과는 다르게 내부적으로 메모리가 연속적으로 되어있지 않다.(int*는 4byte씩 double* 8byte씩 메모리가 연속적으로 배치되어있음) 이 스트링 데이터를 무사히 저장 혹은 전송하기 위해서는 이 메모리 데이터들을 연속적으로 배치, 값 타입 변조 즉 직렬화를 해줘야 하는 것이다. 

 

마지막으로 요약해보면

직렬화를 쓰는 이유는 사용하고 있는 데이터들을 파일 저장 혹은 데이터 통신에서 파싱 할 수 있는 유의미한 데이터를 만들기 위함이다. 

 

 

 

 

 

 

 

 

반응형

댓글