JS직렬화에 대해서 알아보자 + 다른 사람도 알아듣게 말하기
공부를 하다가, 직렬화라는 개념에 대해 알 필요가 있었다.
단어부터 어려운 이 직렬화란 무엇이고 또 왜 필요한걸까?
구글에 검색해보니 직렬화는 다음과 같은 의미를 가지고 있었다.
Serialization은 개체를 저장하거나 메모리, 데이터베이스 또는 파일로 전송하기 위해 개체를 바이트 스트림으로 변환하는 프로세스다. 주 목적은 필요할 때 다시 개체로 만들 수 있도록 개체의 상태를 저장하는 것.
역 프로세스를 deserialization이라 한다.
이해가 안 될 수 있다.
왜 데이터를 변환시켜서 저장하고 전송하는 걸까? 데이터를 있는 그대로 보내면 사용할 수 없는걸까?
그건 바로 데이터의 특성때문이라고 한다.
일단 아래 사례로 빗대어서 이해해보자.
친구와 전화를 하던 중, 내가 키우는 아주 귀여운 강아지를 설명하고 싶다고 해보자.
어떤 자료나 사진 없이 말로만 내 강아지를 설명하기는 너무 어려운 일이다.
그렇게 얘기해봤자 상대방에겐 또 제대로 전달이 안될 수 있다.
여기서 중요한 건 '상대방이 알아들을 수 있도록 전달해야한다는 것'이다.
그래서 선택한 방법이 아래와 같은 사진을 한장 보내는 것이다. (비유적으로...)
실제 원리는 다르지만, 여기서 말하고 싶은건 다른 도메인이나 서버에 데이터를 전달할때,
형태를 바꿔서 전달해야하는 것을 말해주고 싶었다.
위에서 직렬화를 빗대어 설명했다.
여기에 직렬화를 왜 해야하는지 조금 더 알아보자.
우선 메모리에 대한 기본적인 지식이 필요한데, 어떤 언어로 개발을 하건 데이터는 두 가지 형태로 메모리를 사용하게 된다.
1. primitve data
흔히 사용하는 number, string, boolean 과 같은 원시 데이터는 메모리에 직접 할당되고 접근이 가능하다.
2. Reference data
object, arr와 같은 데이터들이 해당한다. 해당 형식의 데이터를 만들면 힙에 메모리가 할당되고, 스택에서 이 힙 메모리를 참조하는 구조다.
즉, 참조 형식 데이터는 실제 데이터를 들고 있는게 아니라, 데이터가 있는 번지 주소를 가지고 있는 셈이다.
그래서 독립적으로 쓰일 수 없고, 저장, 통신에 사용될 수 없는 것이다.
같은 프로그램이라 할지라도, 프로그램을 종료하고 다시 실행할 경우 참조형 데이터의 주소는 새롭게 할당받기 때문에, 이전의 주소를 가지고 있어도 해당 데이터를 찾아갈 수 없다.
즉, 프로그램이 실행될때마다, 새롭게 주소가 매겨지는 셈이다.
또한, 컴퓨터마다 사용하고 있는 메모리의 주소는 모두 다르기때문에, A라는 컴퓨터에서 0x0001이라는 주소를 전달해도 B컴퓨터에서 0x0001이란 주소는 아무것도 없을 수 있다는 것이다.
여기서 직렬화를 적용한다면 어떻게 될까?
직렬화를 한다면 데이터를 모두 모아서 primitve 형식으로 변환해준다.
이러한 이유 어디서 데이터를 열어보던 그 값에 직접 접근할 수 있게 된다. 그래서 저장, 통신전에 직렬화를 하는 작업이 필요하다.
이번에는 직렬화에 대해 조금 알아보았다.
직렬화는 내가 사용하고 있는 데이터들을 다른 컴퓨터, 서버 , 도메인에서도 유의미하게 사용될 수 있도록 변환해주는 작업인 셈이다.
일이나 대화를 할때도 마찬가지인 것 같다.
내 머릿속에 온전히 있는 지식을 누군가에게 전달하기 위해선
이런 직렬화의 과정이 필요하지 않을까?