studyLog/CS

JS직렬화에 대해서 알아보자 + 다른 사람도 알아듣게 말하기

willy4202 2022. 10. 28. 00:29

공부를 하다가, 직렬화라는 개념에 대해 알 필요가 있었다.

단어부터 어려운 이 직렬화란 무엇이고 또 왜 필요한걸까?

구글에 검색해보니 직렬화는 다음과 같은 의미를 가지고 있었다.

Serialization은 개체를 저장하거나 메모리, 데이터베이스 또는 파일로 전송하기 위해 개체를 바이트 스트림으로 변환하는 프로세스다. 주 목적은 필요할 때 다시 개체로 만들 수 있도록 개체의 상태를 저장하는 것.
역 프로세스를 deserialization이라 한다.


이해가 안 될 수 있다.

왜 데이터를 변환시켜서 저장하고 전송하는 걸까? 데이터를 있는 그대로 보내면 사용할 수 없는걸까?

그건 바로 데이터의 특성때문이라고 한다.

일단 아래 사례로 빗대어서 이해해보자.


친구와 전화를 하던 중, 내가 키우는 아주 귀여운 강아지를 설명하고 싶다고 해보자.

어떤 자료나 사진 없이 말로만 내 강아지를 설명하기는 너무 어려운 일이다. 

그렇게 얘기해봤자 상대방에겐 또 제대로 전달이 안될 수 있다.

여기서 중요한 건 '상대방이 알아들을 수 있도록 전달해야한다는 것'이다.

그래서 선택한 방법이 아래와 같은 사진을 한장 보내는 것이다. (비유적으로...)

너무 귀여운 강아지 똘

실제 원리는 다르지만, 여기서 말하고 싶은건 다른 도메인이나 서버에 데이터를 전달할때,

형태를 바꿔서 전달해야하는 것을 말해주고 싶었다.


위에서 직렬화를 빗대어 설명했다. 

여기에 직렬화를 왜 해야하는지 조금 더 알아보자.

우선 메모리에 대한 기본적인 지식이 필요한데, 어떤 언어로 개발을 하건 데이터는 두 가지 형태로 메모리를 사용하게 된다.

1. primitve data

흔히 사용하는 number, string, boolean 과 같은 원시 데이터는 메모리에 직접 할당되고 접근이 가능하다.

2. Reference data

object, arr와 같은 데이터들이 해당한다. 해당 형식의 데이터를 만들면 힙에 메모리가 할당되고, 스택에서 이 힙 메모리를 참조하는 구조다. 

즉, 참조 형식 데이터는 실제 데이터를 들고 있는게 아니라, 데이터가 있는 번지 주소를 가지고 있는 셈이다.

그래서 독립적으로 쓰일 수 없고, 저장, 통신에 사용될 수 없는 것이다.

 

같은 프로그램이라 할지라도, 프로그램을 종료하고 다시 실행할 경우 참조형 데이터의 주소는 새롭게 할당받기 때문에, 이전의 주소를 가지고 있어도 해당 데이터를 찾아갈 수 없다.

즉, 프로그램이 실행될때마다, 새롭게 주소가 매겨지는 셈이다.

또한, 컴퓨터마다 사용하고 있는 메모리의 주소는 모두 다르기때문에, A라는 컴퓨터에서 0x0001이라는 주소를 전달해도 B컴퓨터에서 0x0001이란 주소는 아무것도 없을 수 있다는 것이다.

여기서 직렬화를 적용한다면 어떻게 될까?

직렬화를 한다면 데이터를 모두 모아서 primitve 형식으로 변환해준다. 

이러한 이유 어디서 데이터를 열어보던 그 값에 직접 접근할 수 있게 된다. 그래서 저장, 통신전에 직렬화를 하는 작업이 필요하다.


이번에는 직렬화에 대해 조금 알아보았다.

직렬화는 내가 사용하고 있는 데이터들을 다른 컴퓨터, 서버 , 도메인에서도 유의미하게 사용될 수 있도록 변환해주는 작업인 셈이다.

일이나 대화를 할때도 마찬가지인 것 같다.

내 머릿속에 온전히 있는 지식을 누군가에게 전달하기 위해선

이런 직렬화의 과정이 필요하지 않을까?