데이터 전송 객체(Data Transfer Object, DTO)는 소프트웨어 공학에서 프로세스 간에 데이터를 전달하는 목적으로 사용되는 객체이다. 이 개념은 소프트웨어 디자인 패턴의 하나로, 특히 분산 시스템과 계층 구조를 가진 애플리케이션에서 널리 활용된다.
정의와 목적
데이터 전송 객체는 프로세스 간 통신, 특히 원격 인터페이스(예: 웹 서비스)를 통한 호출에서 발생하는 비용을 줄이기 위해 도입되었다. 프로세스 간의 각 호출은 클라이언트와 서버 간의 왕복 시간(round-trip time)과 관련되어 상대적으로 높은 비용이 발생하는데, 여러 번의 호출로 전송될 데이터를 하나의 객체에 축적하여 단일 호출로 처리함으로써 호출 횟수를 줄이는 것이 주된 목적이다.
특징
데이터 전송 객체는 비즈니스 객체(business object)나 데이터 접근 객체(data access object, DAO)와 구별되는 특징을 가진다. DTO는 자체 데이터의 저장, 조회, 직렬화(serialization), 역직렬화(deserialization)와 같은 동작을 제외하고는 어떠한 비즈니스 로직도 포함하지 않는 단순한 객체이다. 즉, DTO는 데이터 전달만을 목적으로 하며, 유선(wire)상의 데이터 전송을 위해 직렬화와 역직렬화 메커니즘을 포함할 수 있다.
용어상의 구분
값 객체(value object)는 DTO와 다른 개념이다. 두 용어는 과거 자바 개발자 커뮤니티에서 혼용된 적이 있으나, 엄밀히 구분되어야 하는 개념으로 알려져 있다. 또한 모델-뷰-뷰모델(Model-View-ViewModel, MVVM) 패턴에서 데이터 전송 객체는 뷰모델(viewmodel)로 지칭되기도 한다.
활용 분야
데이터 전송 객체는 주로 웹 애플리케이션의 계층 간(예: 컨트롤러-서비스-리포지토리) 데이터 전달, 마이크로서비스 아키텍처에서의 서비스 간 통신, REST API의 요청·응답 데이터 구조화 등에 사용된다. DTO는 서버와 클라이언트 사이의 데이터 교환을 구조화하고, 필요한 데이터만 선택적으로 전달함으로써 보안과 효율성 측면에서 이점을 제공하는 것으로 알려져 있다.
기원
이 패턴은 마틴 파울러(Martin Fowler)의 저서 《엔터프라이즈 애플리케이션 아키텍처 패턴》(Patterns of Enterprise Application Architecture, 2002)에서 체계적으로 정리·소개되었으며, 이후 마이크로소프트 MSDN 라이브러리 등에서도 관련 문서가 제공되고 있다. 다만 이 패턴이 원격 인터페이스가 아닌 환경에서 잘못 사용되는 사례도 지적되었으며, 패턴의 창시자는 DTO의 본래 목적이 비용이 큰 원격 호출에서 데이터를 이동시키는 것에 있음을 반복적으로 강조한 바 있다.