는 데이터를 연속된 바이트로 변환해서 저장하거나 전송할 수 있도록 하는 방법이에요. 이 개념 자체는 파일 시스템이나 네트워크 통신의 필요성에 의해 생겨난 기본 원리입니다.
컴퓨터 과학의 초창기부터 데이터를 저장하거나 네트워크로 전송하기 위한 다양한 방식들이 발전했고, 그 과정에서 직렬화라는 개념이 자연스럽게 등장했어요.
는 이 직렬화된 데이터를 다시 원래의 구조나 객체로 복원하는 과정이에요. 직렬화된 데이터를 해독해서 다시 복원하는 과정도 필수적인 기술로, 직렬화와 함께 발전해온 것이죠.
기본 개념은 이렇지만 재미있게 이해하기 쉽게 말을 해보자면
직렬화라는 건, 우리가 가지고 있는 복잡한 데이터나 객체를 줄줄이 하나의 긴 문자열로 "펼치는" 과정이에요. 데이터를 네트워크로 보내거나 저장하려면 컴퓨터가 그걸 한 줄로 만들어서 다룰 수 있게 해야 하죠. 마치 누군가에게 복잡한 그림을 설명할 때, 그 그림의 모든 디테일을 단순한 단어로 풀어서 말하는 것과 비슷해요.
예를 들어, 우리가 "책상"이라는 객체가 있다고 해봅시다. 이 책상은 나무 재질, 높이, 색상 같은 다양한 특성이 있어요. 직렬화는 이 책상을 데이터로 만들어서 컴퓨터가 처리할 수 있게 하나의 길고 긴 문자열로 펼치는 거예요. 책상의 높이, 색상, 재질을 하나하나 풀어서 "책상(나무, 갈색, 75cm)" 이렇게 줄을 세우는 겁니다.
이제, 이 데이터를 다른 컴퓨터로 보냈다고 생각해보죠. 그 컴퓨터는 이 데이터를 다시 원래대로 복원해야 할 거예요. 이 과정이 역직렬화예요. 직렬화된 데이터를 받아서 다시 원래의 책상으로 복원하는 거죠. 방금 받은 그 "책상(나무, 갈색, 75cm)"라는 데이터를 보고, "아, 이건 책상이구나" 하면서 다시 실제 책상의 형태로 변환하는 과정이죠.
"직렬화는 복잡한 물건들을 줄줄이 풀어서 보내는 과정이고, 역직렬화는 그걸 다시 원래 상태로 재조립하는 과정이야. 그게 전부야. 복잡한 걸 단순하게 만들어서 주고받고, 다시 원래대로 되돌리는 거지!"
1960년대부터 이미 이런 개념들이 사용되기 시작했어요. 예를 들어, LISP라는 프로그래밍 언어에서는 'print'와 'read' 함수를 통해 데이터 구조를 문자열로 변환하고 다시 복원하는 기능을 제공했죠.
1970년대에는 객체 지향 프로그래밍이 발전하면서, 객체를 저장하고 전송하는 방법에 대한 연구가 활발해졌어요. 이때 '마샬링(marshalling)'이라는 용어도 등장했는데, 이는 직렬화와 비슷한 개념이에요.
1980년대와 1990년대를 거치면서, 다양한 프로그래밍 언어와 시스템에서 각자의 방식으로 직렬화와 역직렬화를 구현했어요.
Java에서는 1996년에 객체 직렬화 기능을 도입했고, 이는 많은 개발자들에게 직렬화 개념을 널리 알리는 데 기여했죠.
2000년대에 들어서면서 XML, JSON 같은 데이터 교환 형식이 등장하면서 직렬화와 역직렬화는 더욱 중요해졌어요. 특히 웹 개발이 활발해지면서 이 개념들은 거의 모든 프로그래머들이 알아야 하는 기본 지식이 되었죠.
이제 직렬화 역직렬화를 하는 방법을 nodejs 기준으로 말해볼려고 합니다.
다들 한번씩 써본걸 알수 있어요.
위에 처럼 하는방법일단 예시를 정확하게 알려주자면
JSON.stringify(): 직렬화 (Serialization)
JavaScript 객체를 JSON 문자열로 변환.
예: {name: "Kim"} → '{"name":"Kim"}'
JSON.parse(): 역직렬화 (Deserialization)
JSON 문자열을 JavaScript 객체로 변환.
예: '{"name":"Kim"}' → {name: "Kim"}
근데 여기서 JSON 으로 직렬화는 데이터 크기가 커지고 많은양에 데이터를 통신은 JSON은 적합하지 않는다. 그래서 다른 성능적으로 좋은 직렬화 방식이 있다.
컴퓨터가 읽기 쉽게 이진으로 바꾸는것이다.
{name: "Kim", age: 30} → [2, 75, 105, 109, 30]
이런식으로 바이트 형태로 바꿔주면 컴퓨터의 최적의 데이터 형태가 된다.
특히 성능이나 크기 최적화가 필요한 경우 이진 형식의 직렬화가 자주 사용됩니다.
우리가 대부분 JSON 직렬화 방식밖에 모른다.
하는 방법을 알려드리겠습니다.
많은 방법이 있지만 제가아는 3가지 방법을 알려드리겠습니다.
// 직렬화
const obj = { name: "Kim", age: 30 };
const binary = Buffer.from(JSON.stringify(obj));
// 역직렬화
const deserialized = JSON.parse(binary.toString());
const v8 = require('node:v8');
// 직렬화
const obj = { name: "Kim", age: 30 };
const binary = v8.serialize(obj);
// 역직렬화
const deserialized = v8.deserialize(binary);
이 방법은 효율적이지만, Node.js 특화 방식이라 다른 환경과의 호환성이 낮습니다.
Google의 Protocol Buffers는 효율적인 이진 직렬화 방식을 제공합니다
const protobuf = require('protobufjs');
// 스키마 정의
const Root = protobuf.Root;
const Type = protobuf.Type;
const Field = protobuf.Field;
const root = new Root();
const Person = new Type("Person");
Person.add(new Field("name", 1, "string"));
Person.add(new Field("age", 2, "int32"));
root.add(Person);
// 직렬화
const obj = { name: "Kim", age: 30 };
const binary = Person.encode(obj).finish();
// 역직렬화
const deserialized = Person.decode(binary);
이 방법은 복잡하지만 매우 효율적이고 다른 언어와의 호환성도 좋습니다.
npm 을 보면 알겠습니다 엄청 인기가 많은이유가 구글이 만든것도 있고 방식으로 직렬화 속도 빨라서 많이들 사용합니다

이렇게 직렬화랑 역직렬화에 대해서 배워 봤습니다.모르고 사용하는 것과 알고 사용하는 것은 완전히 달라요