마샬링 레이어
마샬링 레이어(Marshaling Layer)는 소프트웨어 아키텍처에서 데이터의 형태를 변환하고 포장하는 역할을 전담하는 계층을 뜻합니다.
쉽게 말해, 프로그램 내부에서 사용하는 ‘데이터 객체’를 네트워크를 통해 전송하거나 파일로 저장하기 적합한 형태(JSON, XML, 바이트 스트림 등)로 바꾸고, 반대로 외부에서 들어온 데이터를 다시 프로그램 내부의 ‘데이터 객체’로 복원해 주는 통역사 역할을 하는 구간입니다.
1. 마샬링과 언마샬링의 개념
마샬링 레이어에서는 기본적으로 두 가지 작업이 일어납니다.
- 마샬링 (Marshaling): 메모리에 있는 객체(Object)나 데이터 구조를 전송, 저장, 혹은 다른 프로그램 언어가 이해할 수 있는 형식(Byte Stream, JSON 등)으로 변환하는 과정입니다. (포장하기)
- 언마샬링 (Unmarshaling): 전송받거나 읽어 들인 데이터 형식(Byte Stream, JSON 등)을 다시 프로그램에서 사용할 수 있는 원래의 객체나 데이터 구조로 복원하는 과정입니다. (포장 뜯기)
(※ 참고: ‘직렬화(Serialization)‘와 거의 같은 의미로 쓰이지만, 마샬링은 단순히 데이터를 나열하는 것을 넘어, 다른 환경(예: 다른 언어, 다른 프로세스)으로 넘어갈 때 포인터나 메모리 구조의 차이까지 조정해준다는 점에서 조금 더 광의의 개념으로 사용되기도 합니다.)
2. 왜 별도의 ‘레이어(Layer)‘로 분리할까? (필요성)
마샬링 작업을 비즈니스 로직(핵심 기능 코드)과 섞지 않고 하나의 계층(Layer)으로 분리하는 이유는 관심사 분리(Separation of Concerns) 때문입니다.
- 핵심 로직 보호: 개발자는 데이터가 JSON으로 통신하는지, XML로 통신하는지 신경 쓰지 않고 오직 ‘기능’개발에만 집중할 수 있습니다.
- 유연한 스왑(Swap): 만약 시스템이 성장하여 통신 환경을 JSON에서 더 빠른 Protocol Buffers(gRPC)로 변경해야 한다고 가정해 봅시다. 마샬링 레이어가 잘 분리되어 있다면 핵심 비즈니스 코드는 단 한 줄도 건드릴 필요 없이 마샬링 레이어만 교체하면 됩니다.
- 보안 및 검증: 외부에서 들어오는 데이터가 올바른지, 혹시 악의적인 데이터는 아닌지 언마샬링 과정에서 검열하고 필터링할 수 있습니다.
3. 마샬링 레이어가 주로 사용되는 곳
- 웹 API (REST, GraphQL 등):
- 서버(Java, Python 등)의 내부 도메인 객체 데이터를 사용자의 브라우저나 모바일 앱에 보낼 때, 마샬링 레이어가 이를 JSON 형태로 변환합니다. (예: Spring 프레임워크의
HttpMessageConverter)
- 서버(Java, Python 등)의 내부 도메인 객체 데이터를 사용자의 브라우저나 모바일 앱에 보낼 때, 마샬링 레이어가 이를 JSON 형태로 변환합니다. (예: Spring 프레임워크의
- RPC (Remote Procedure Call) 및 gRPC:
- 서로 다른 서버 간에 함수를 호출할 때, 호출 인자(매개변수)들을 바이트 코드로 묶어(마샬링) 전송하고, 받는 쪽에서 다시 객체로 풉니다(언마샬링).
- 서로 다른 프로그래밍 언어 간 통신 (JNI, P/Invoke):
- Java에서 C++ 코드를 호출하거나, C#에서 C 라이브러리를 사용할 때, 두 언어는 메모리를 다루는 방식이 완전히 다릅니다. 이때 중간에 위치한 마샬링 레이어가 C++의 포인터를 Java가 이해할 수 있는 형태로, 혹은 그 반대로 변환해 줍니다.
💡 일상생활 비유
한국인(자바 프로그램)과 미국인(파이썬 프로그램)이 통화를 한다고 가정해 봅시다.
- 한국인이 한국어로 말을 합니다. (내부 객체)
- 동시통역사(마샬링 레이어)가 이 말을 세계 공용어인 영어(JSON/바이트 스트림)로 번역하여 전화선을 통해 보냅니다. (마샬링)
- 미국 쪽의 동시통역사(마샬링 레이어)가 전화기로 들려온 영어를 다시 미국인이 이해하기 편하게 상황에 맞춘 영어(또는 파이썬 내부 객체)로 다듬어 전달합니다. (언마샬링)
즉, 마샬링 레이어는 “소통을 위해 데이터를 규격에 맞게 포장하고 해체하는 전용 작업장”이라고 이해하시면 됩니다.