마샬링(Marshalling)은 컴퓨터 과학에서 객체(object)나 데이터 구조(data structure)를 한 환경에서 다른 환경으로 전송하거나 저장하기에 적합한 형식으로 변환하는 과정을 의미한다. 일반적으로 객체의 메모리 내 표현(in-memory representation)을 선형화(linearize)하거나 직렬화(serialize)하여, 이를 파일이나 네트워크를 통해 쉽게 전송하거나 보존할 수 있는 형태로 만드는 것을 말한다.
개요 객체는 종종 복잡한 내부 구조를 가지며, 메모리 주소나 포인터 등을 포함할 수 있다. 이러한 객체를 다른 프로세스, 다른 컴퓨터 또는 다른 프로그래밍 언어로 작성된 시스템으로 전달하거나 영구적으로 저장하기 위해서는, 해당 객체의 모든 정보를 손실 없이 표현할 수 있는 표준화된 형태로 변환해야 한다. 마샬링은 이러한 변환 작업을 수행하며, 변환된 데이터는 바이트 스트림(byte stream) 형태가 되는 경우가 많다.
목적 및 필요성 마샬링은 주로 다음과 같은 상황에서 필요하다.
- 데이터 전송 (Communication): 서로 다른 프로세스 간(Inter-Process Communication, IPC), 또는 네트워크를 통해 서로 다른 컴퓨터 간에 객체를 주고받을 때 사용된다. 예를 들어, 원격 프로시저 호출(Remote Procedure Call, RPC)이나 원격 메서드 호출(Remote Method Invocation, RMI) 시스템에서 한 시스템의 객체를 다른 시스템으로 전달하기 위해 마샬링이 필수적이다.
- 데이터 저장 (Persistence): 객체의 상태를 디스크 파일이나 데이터베이스에 영구적으로 저장해야 할 때 사용된다. 프로그램이 종료된 후에도 객체의 상태를 보존하고, 나중에 다시 로드할 수 있도록 한다.
- 상호 운용성 (Interoperability): 서로 다른 프로그래밍 언어나 운영 체제 환경 간에 데이터를 교환해야 할 때, 각 환경에 독립적인 표준 형식으로 변환하기 위해 마샬링이 사용된다. 웹 서비스(Web Services)에서 SOAP(Simple Object Access Protocol)나 REST(Representational State Transfer)를 통해 객체를 XML이나 JSON 형식으로 변환하여 주고받는 것이 대표적인 예이다.
작동 방식 마샬링 과정에서는 객체의 모든 필드(field)나 속성(attribute)의 값을 추출하고, 이들을 특정 규칙에 따라 바이트 스트림으로 변환한다. 이 과정에서 객체의 타입 정보, 필드의 이름, 데이터 타입 등을 함께 포함시켜, 나중에 객체를 원래대로 재구성(unmarshal 또는 deserialize)할 때 필요한 정보를 제공하기도 한다. 포인터나 참조와 같이 메모리 주소에 의존하는 정보는 마샬링 시 논리적인 참조 형태로 변환되거나 값이 직접 포함된다.
언마샬링 (Unmarshalling) 마샬링의 반대 과정은 언마샬링(Unmarshalling) 또는 역직렬화(Deserialization)라고 불린다. 이는 마샬링된 바이트 스트림이나 데이터를 원래의 객체 또는 데이터 구조로 재구성하는 과정이다. 언마샬링은 마샬링 시 포함된 메타데이터(metadata)와 규칙을 사용하여 데이터를 해석하고, 메모리에 새로운 객체를 생성하여 값을 할당한다.
관련 기술 및 예시
- 직렬화 (Serialization): 마샬링은 직렬화 개념과 매우 밀접하게 관련되어 있으며, 종종 동의어처럼 사용되기도 한다. 특히 Java의
Serializable인터페이스나 Python의pickle모듈, C#의BinaryFormatter등은 객체 직렬화를 구현하는 대표적인 예시이다. - RPC/RMI: Java RMI, CORBA(Common Object Request Broker Architecture), .NET Remoting과 같은 분산 객체 시스템에서 객체를 원격으로 호출하고 전달할 때 내부적으로 마샬링/언마샬링을 사용한다.
- 웹 서비스: SOAP 기반 웹 서비스는 XML을 사용하여 객체를 마샬링하고 전송하며, RESTful 웹 서비스는 JSON이나 XML을 사용하여 데이터를 표현하고 교환한다.
- 데이터 포맷: 프로토콜 버퍼(Protocol Buffers), 아파치 스리프트(Apache Thrift)와 같은 이진 직렬화 포맷들도 효율적인 마샬링을 제공한다.
마샬링은 분산 시스템, 영구 데이터 저장, 시스템 간의 상호 운용성을 구현하는 데 있어 핵심적인 기술 중 하나이다.