[NestJS] DTO

minsu·2025년 1월 9일

DTO (Data Trasnfer Object)

데이터 전송 객체로, 계층 간 데이터를 교환하기 위해 사용하는 객체

주로 Database에서 가져온 데이터를 Service 또는 Controller 계층으로 전달하거나,
반대로 클라이언트로부터 받은 데이터를 처리하기 위해 사용된다.

쉽게 말해서 데이터를 주고받을 객체의 타입을 체크해주기 위한 구조라고 하면 될 것이다.

NestJS와 같은 프레임워크에서 데이터를 처리할 때 필수적인 역할을 한다.
데이터 구조를 명확히 정의하고, 유지보수성과 안정성을 높이는 데 유용하다.

DTO에는 Validator라는 것을 붙일 수 있어서 데이터에 대한 검증까지 진행할 수 있다.

추가적으로, Nest.js의 경우 DTO에 Swagger 관련 작업을 할 수 있어서 자동적으로 Swagger가 만들어지도록 하는 것도 가능하다.

DTO는 class와 interface 두 가지를 사용하여 정의할 수 있다. 무슨 차이일까 ?


Interface & class

Interface

데이터의 구조와 타입만 정의하는 데 사용된다.

컴파일 시점에만 존재하기 때문에 TypeScript가 JavaScript로 변환되면 interface는 사라지고,
런타임에서는 어떤 형태로도 작동하지 않는다.

다중 상속이 가능하여 여러 interface를 조합하여 새로운 구조를 정의할 수 있다.

class

데이터의 구조뿐만 아니라 메서드와 기능도 포함할 수 있는 객체를 정의한다.

런타임에서도 존재하기 때문에 Javascript로 변환되어 런타임에서도 사용이 가능하다.
@nestjs/common의 데코레이터(@Body, @Param 등)와 함께 사용할 수 있음.

데이터를 초기화하거나 기본값을 설정할 수 있으며 다른 클래스를 확장해서 사용 가능하다.

NestJs 에서는 ? Interface vs. class

공식문서에서는 Class를 이용해서 DTO를 구성하는 것을 추천하고 있다.

Class는 런타임에서도 존재하므로,
NestJS 데코레이터 및 유효성 검증 라이브러리(class-validator)와 함께 사용이 가능하다.
반면, Interface는 컴파일 시 제거되어 DTO 정의용으로 부적합하다는 것이다.

하지만 단순하게 데이터 구조만 정의하고 추가 로직이 필요 없을 시 interface를 사용해도 된다.

profile
3년차 백엔드 개발자

0개의 댓글