마샬링(Marshalling)은 객체나 데이터 구조를 전송 및 저장에 적합한 표준 형식으로 변환하는 과정이다. 이 개념은 분산 시스템과 네트워크 통신에서 필수적인 핵심 기술이다. 마샬링과 직렬화의 내용이 혼용되기 쉬워서 정리하려고 한다. 거기에 더해 언마샬링에 대해서도 간단하게 적어보았다.
마샬링(Marshalling)
마샬링은 프로그램 내부 메모리에 존재하는 객체를 외부로 전달 가능한 형태로 바꾸는 과정이다. 메모리 구조는 프로세스마다 다르기 때문에 그대로는 다른 시스템이나 프로세스가 이해할 수 없다. 이 문제를 해결하기 위해 객체의 구조와 값을 JSON, XML, 바이너리 스트림과 같은 표준 포맷으로 변환하는 작업이 마샬링이다.
마샬링이 필요한 대표적인 이유 3가지를 간단하게 다음과 같이 정리할 수 있다.
- 프로세스 간 통신: 서로 다른 메모리 공간을 사용하는 프로세스는 객체를 직접 공유할 수 없다. 마샬링을 통해 데이터 형태로 변환해야 한다.
- 분산 시스템 통신: 서로 다른 서버, 서로 다른 언어 환경(Java, Python, C++)에서도 동일한 데이터 구조를 이해하게 하다.
- 네트워크 전송: 네트워크는 객체를 전송하지 못하고 바이트 단위 데이터만 전송할 수 있다. 이를 해결하는 과정이 마샬링이다.
언마샬링(Unmarshalling)
언마샬링은 마샬링의 반대 과정으로 전송되거나 저장된 데이터를 다시 원래의 객체 구조로 복원하는 과정이다.
- 전송 측: 객체 → 마샬링 → 데이터 스트림
- 수신 측: 데이터 스트림 → 언마샬링 → 객체
이 두 과정이 한 쌍으로 동작한다.
직렬화(Serialization)
직렬화(Serialization)는 데이터 구조나 객체 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다. 객체를 직렬화하는 과정은 오브젝트를 마샬링 한다고도 한다. 반대로, 일련의 바이트로부터 데이터 구조를 추출하는 일은 역직렬화(Deserialization)이라고 한다.
직렬화와 마샬링의 차이는 다음과 같다.
| Serialization | Marshalling | |
| 정의 | 객체를 바이트 스트림으로 변환하다 | 객체를 전송·상호운용 목적의 포맷으로 변환하다 |
| 목적 | 저장 또는 전송 가능하게 만들다 | 분산 환경에서 통신 가능하게 만들다 |
| 관점 | 데이터 표현 중심이다 | 데이터 + 전송 맥락 중심이다 |
참고 자료
https://ko.wikipedia.org/wiki/%EC%A7%81%EB%A0%AC%ED%99%94
https://velog.io/@wlsrhkd4023/CS-%EB%A7%88%EC%83%AC%EB%A7%81Marshalling