
직렬화 핸드북
핵심 요약 직렬화(Serialization)는 객체나 데이터 구조의 상태를 일련의 바이트나 텍스트로 변환하여 저장·전송하고, 필요 시 동일한 상태로 복원하는 기법이다. 이를 통해 이기종 시스템 간 데이터 교환, 네트워크 전송, 영속화, 원격 호출 등이 효율적이고 안전하게 이루어진다1.
1. 직렬화의 개념 및 목적
직렬화란 객체의 상태(필드 값, 참조 정보 등)를 플랫폼 독립적이며 선형화된 형식으로 변환하는 과정이다.
- 역직렬화(Deserialization): 직렬화된 데이터를 원래의 객체 구조로 복원
- 마샬링(Marshalling)/언마샬링(Unmarshalling): 직렬화/역직렬화를 가리키는 동의어
주요 목적
- 데이터 교환: 서로 다른 언어·플랫폼 간 객체 전송
- 영속화(Persistence): 객체 상태를 파일·DB 등에 저장
- 원격 호출(RPC): 원격 서버에 객체 전달, 반환값 복원
- 분산 시스템: 클러스터 노드 간 데이터 전파와 캐시 동기화
2. 직렬화의 주요 이유 및 장점
직렬화 도입 시 얻게 되는 핵심 이점은 다음과 같다:
이점 | 설명 |
---|---|
플랫폼 독립성 | 바이트 순서, 메모리 레이아웃 차이를 해결하여 이기종 시스템 간 호환성 보장1 |
효율적 전송 | 이진 포맷(Protobuf, MessagePack 등) 사용 시 텍스트 대비 크기·속도 최적화2 |
데이터 무결성 | 스키마 기반 검증으로 필드 누락·타입 오류 방지 (Avro, Protobuf) |
유연한 확장성 | 스키마 진화 지원(필드 추가·삭제 시 호환성 유지) |
간단한 개발 | 표준 라이브러리로 구현 가능 (Java Serializable, Python pickle 등)3 |
3. 직렬화 구조와 대표 포맷
3.1 텍스트 기반 형식
- JSON: 경량, 가독성 우수, 대부분 언어 기본 지원. 하지만 자료형 제한2.
- XML: 계층적 태그, 확장성·자기 기술성(self-descriptive) 뛰어나나 장황2.
- YAML: 사람이 읽기 쉬운 구성 파일에 적합, 들여쓰기 민감2.
- CSV: 단순 테이블 데이터에 특화, 계층 구조 미지원2.
3.2 이진 기반 형식
- Protocol Buffers (Protobuf): 구글 개발, 스키마 필요. 매우 컴팩트하며 Varint 인코딩으로 사이즈 최적화4.
- MessagePack: JSON과 호환되는 이진 포맷, 속도·크기 효율 우수2.
- Avro: 스키마 내장 또는 외부 관리, 빅데이터 처리에 강점.
4. 직렬화 사용법 및 구현 예
4.1 주요 언어별 예시
- Java:
implements Serializable
+ObjectOutputStream
→ 바이트 스트림 저장3. - Python:
pickle
모듈 이용 pickling/unpickling, 또는json
모듈 사용1. - C#/.NET:
DataContractSerializer
,BinaryFormatter
등5. - JavaScript:
JSON.stringify()
/JSON.parse()
2.
4.2 프로토콜 버퍼(.proto) 예
syntax = "proto3";
message Person {
string name = 1;
int32 id = 2;
bool has_pet = 3;
}
- 컴파일 후
person.toByteArray()
로 이진 직렬화, 수신 측에서Person.parseFrom(bytes)
로 역직렬화4.
5. 활용 사례
- 웹 API: 클라이언트·서버 간 REST/GraphQL 데이터 교환 (주로 JSON)6.
- 분산 캐시: Hazelcast, Redis 등 In-Memory 플랫폼의 객체 전파7.
- 메시징 시스템: Kafka·RabbitMQ 토픽에 메시지 전송 시 Avro·Protobuf 사용6.
- 게임 개발: 위치·상태 동기화 위해 UDP 패킷에 MessagePack 활용2.
- IoT 기기: 대역폭 제한 환경에서 Protobuf/CBOR 등 경량 포맷 선호.
6. 주의 사항 및 팁
- 버전 관리: 스키마 필드 번호 변경 시 기존 데이터 파싱 오류 유발
- 보안: 역직렬화 시 임의 코드 실행 취약점(CVE) 주의
- 성능 최적화: 대용량/실시간 시스템에서는 이진 포맷 권장
- 디버깅: 이진 포맷은 가독성 낮으므로 로깅 시 JSON/XML 폴백 고려
결론 직렬화는 분산·영속화·네트워크 전송을 위한 필수 기술로, 텍스트·이진 포맷 간 트레이드오프를 이해하고 사용 사례에 맞춰 최적의 방식을 선택하는 것이 중요하다. 공통 표준을 활용하면 유지보수성과 호환성을 높일 수 있다.
⁂