프로그래밍에서 Serialization과 Deserialization이란 무엇인가?
Source: Dev.to
If you’re learning programming, you’ve probably seen phrases like:
- “Serialize this object”
- “Deserialize the JSON”
- “Convert object to string”
…and it can feel confusing.
Why do we need to convert objects at all?
Why can’t we just use them directly?
Don’t worry – by the end of this article you’ll understand serialization and deserialization in the simplest way possible.
1️⃣ 혼란 (왜 이렇게 어려운가)
프로그램에서 객체를 생성합니다. 모든 것이 완벽하게 동작합니다.
그런데 누군가가 말합니다:
- “이 데이터를 프론트엔드에 보내세요.”
- “이 객체를 파일에 저장하세요.”
- “데이터베이스에 저장하세요.”
- “다른 서버에 보내세요.”
그러자 갑자기 이렇게 말합니다: “먼저 직렬화하세요.”
이제 무섭게 느껴집니다. 그게 도대체 무슨 뜻인가요?
2️⃣ 직렬화가 존재하는 이유 (실제 문제)
프로그램 내부에서 데이터는 **메모리(RAM)**에 존재합니다.
원시 메모리의 문제점
- 프로그램이 종료되면 메모리가 사라집니다.
- 원시 메모리를 다른 컴퓨터에 보낼 수 없습니다.
- 메모리 구조를 파일에 직접 저장할 수 없습니다.
- 다른 프로그래밍 언어가 여러분의 내부 객체 형식을 이해하지 못합니다.
컴퓨터가 이해할 수 있는 것은:
- 텍스트
- 원시 바이트 (0과 1)
그래서 개발자들은 객체를 저장하거나 전송할 수 있는 형태로 변환하는 방법이 필요했습니다.
그 해결책이 직렬화(serialization) 입니다.
다시 원래 형태로 되돌리는 것을 역직렬화(deserialization) 라고 합니다.
3️⃣ Real‑Life Analogy (Super Simple)
레고 자동차를 만든다고 상상해 보세요. 방 안에서는 완전히 조립된 상태입니다.
이제 다른 도시에 사는 사촌에게 보내고 싶습니다. 완전 조립된 상태로는 배송할 수 없으니:
- 부품으로 분해합니다.
- 부품을 상자에 넣습니다.
- 상자를 보냅니다.
사촌은 상자를 받고, 열어서 레고 자동차를 다시 조립합니다.
- 분해 및 포장 → 직렬화
- 재조립 → 역직렬화
그게 전부입니다. 마법 같은 건 없습니다.
4️⃣ 간단한 설명 (복잡한 단어 없이)
- Serialization = 객체를 텍스트나 바이트로 변환하여 저장하거나 전송할 수 있게 함.
- Deserialization = 그 텍스트나 바이트를 다시 원래 객체로 변환.
간단히:
Object → Text/Bytes → Object
5️⃣ 직렬화 작동 방식 (단계별)
Python에서 다음과 같은 학생 데이터를 가지고 있다고 가정해 보겠습니다:
student = {
"name": "Rahul",
"age": 15
}
🔹 Step 1: Serialize
JSON(텍스트 형식)으로 변환합니다:
{"name": "Rahul", "age": 15}
이제 순수한 텍스트가 되었습니다. 이 텍스트는 다음과 같이 사용할 수 있습니다:
- 파일에 저장하기
- 데이터베이스에 보관하기
- API를 통해 전송하기
- 서로 다른 프로그래밍 언어 간에 공유하기
🔹 Step 2: Deserialize
누군가 이 텍스트를 받으면 다시 객체로 변환합니다:
student = {"name": "Rahul", "age": 15}
이제 다시 일반 객체처럼 동작합니다.
6️⃣ 매우 작은 코드 예제 (Python)
직렬화 예제
import json # Library to work with JSON
student = {
"name": "Rahul",
"age": 15
}
# Convert dictionary to JSON string
serialized_data = json.dumps(student)
print(serialized_data)
Output
{"name": "Rahul", "age": 15}
역직렬화 예제
# Convert JSON string back to dictionary
original_data = json.loads(serialized_data)
print(original_data["name"])
Output
Rahul
7️⃣ 드라이 런 (가장 중요한 부분)
과정을 천천히 살펴보겠습니다.
-
객체 생성
student = {"name": "Rahul", "age": 15}이것은 메모리에 저장된 딕셔너리입니다.
-
직렬화
serialized_data = json.dumps(student)결과:
serialized_data = '{"name": "Rahul", "age": 15}'중요:
serialized_data는 이제 딕셔너리가 아니라 문자열입니다.
serialized_data["name"]와 같이 접근하면 텍스트일 뿐이므로 오류가 발생합니다. -
역직렬화
original_data = json.loads(serialized_data)이제
original_data는 다시 딕셔너리가 되므로original_data["name"]를 사용할 수 있습니다.
전체 흐름
Object → JSON String → Object
8️⃣ 실생활에서 직렬화가 사용되는 곳
직렬화는 어디에나 존재합니다:
- 🌐 프론트‑엔드가 백‑엔드에 데이터 전송
- 📱 모바일 앱이 서버 호출
- 💾 파일에 데이터 저장
- 🗄️ 데이터베이스에 객체 저장
- 🔐 마이크로서비스 간 데이터 전송
- 🎮 게임 진행 상황 저장
- 📨 네트워크를 통한 데이터 전송
API를 사용할 때마다 직렬화가 백그라운드에서 이루어집니다. 인스타그램이 프로필을 로드할 때… 직렬화와 역직렬화가 조용히 작동합니다.
9️⃣ 초보자 흔히 하는 실수
- ❌ JSON을 객체와 동일하게 생각하기 – JSON은 텍스트이며, 객체는 메모리에 존재합니다.
- ❌ 직렬화가 객체를 문자열로 변환한다는 것을 잊어버리기 – 문자열에서 직접 속성에 접근할 수 없습니다.
- ❌ 역직렬화 없이 JSON을 사전처럼 접근하려 하기.
- ❌ 직렬화가 JSON만을 의미한다고 가정하기 – XML, 바이너리 포맷, Protocol Buffers 등도 포함될 수 있습니다.
🔟 직렬화 vs. 역직렬화 (빠른 비교)
| 직렬화 | 역직렬화 | |
|---|---|---|
| 방향 | 객체 → 텍스트/바이트 | 텍스트/바이트 → 객체 |
| 발생 시점 | 전송하거나 저장하기 전 | 수신하거나 읽은 후 |
| 발생 위치 | 송신 측 | 수신 측 |
1️⃣1️⃣ 언제 직렬화를 사용해야 할까요?
- 데이터를 영구 저장해야 할 때(파일, 데이터베이스, 캐시).
- 프로세스, 서비스, 혹은 머신 간에 통신이 필요할 때.
- 서로 다른 프로그래밍 언어나 플랫폼 간에 데이터를 공유하고 싶을 때.
요약하면, 데이터가 현재 프로그램의 메모리를 떠나야 할 때마다 직렬화가 필요하고(반대쪽에서는 역직렬화가 필요합니다).
직렬화를 사용해야 할 때
- 데이터를 다른 시스템에 보내고 싶을 때
- 객체를 영구적으로 저장하고 싶을 때
- 서로 다른 언어가 데이터를 이해하도록 하고 싶을 때
- API를 구축하고 있을 때
- 데이터베이스를 다룰 때
데이터가 프로그램 외부로 이동하면 직렬화가 관여합니다.
1️⃣2️⃣ 빠른 복습 요약
- Serialization = Object → Text/Bytes
- Deserialization = Text/Bytes → Object
- 데이터를 전송하거나 저장하기 위해 필요합니다
- JSON은 가장 일반적인 포맷입니다
- 직렬화 후, 데이터는 문자열이 됩니다
- 객체로 사용하기 전에 반드시 역직렬화해야 합니다
- API, 데이터베이스, 모바일 앱, 그리고 서버에서 사용됩니다
Now, if someone says:
“이 객체를 전송하기 전에 직렬화하세요.”
You won’t panic.
You’ll just think:
“오… 우리는 그것을 상자에 포장하고 있어요.”
And that’s it.