직렬화 핸드북

핵심 요약 직렬화(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, BinaryFormatter5.
  • 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 폴백 고려

결론 직렬화는 분산·영속화·네트워크 전송을 위한 필수 기술로, 텍스트·이진 포맷 간 트레이드오프를 이해하고 사용 사례에 맞춰 최적의 방식을 선택하는 것이 중요하다. 공통 표준을 활용하면 유지보수성과 호환성을 높일 수 있다.

Footnotes

  1. https://en.wikipedia.org/wiki/Serialization 2 3

  2. https://beeceptor.com/docs/concepts/data-exchange-formats/ 2 3 4 5 6 7 8

  3. https://www.baeldung.com/cs/serialization-deserialization 2

  4. https://zenn.dev/kazu098/articles/a0e120ffbf8093 2

  5. https://learn.microsoft.com/en-us/dotnet/standard/serialization/

  6. https://www.confluent.io/learn/data-serialization/ 2

  7. https://hazelcast.com/foundations/distributed-computing/serialization/