NestJS에서 DTO는 왜 클래스(class)로 작성해야 할까?

2025. 4. 8. 15:34·Category/NestJs
728x90

NestJS 실습을 하다 보면 DTO(Data Transfer Object)를 클래스(class)로 작성하는 것을 자주 보게 됩니다. 그런데 TypeScript에서는 interface도 타입 정의가 가능한데, 왜 하필 클래스를 쓰는 걸까요?

그 이유는 바로 런타임(Runtime)에 있습니다.

interface는 컴파일 타임에만 존재

TypeScript의 interface는 오직 컴파일 타임에만 존재합니다. 즉, TypeScript가 JavaScript로 변환될 때 인터페이스는 전부 사라집니다. 런타임에는 아무 정보도 남아있지 않기 때문에, 실행 중에 이 타입을 활용할 수 없습니다.

interface CreateUserDto {
  name: string;
}

이렇게 작성된 인터페이스는 JS로 컴파일되면 완전히 없어집니다. 따라서 이 타입을 기반으로 실행 중에 유효성 검사를 하거나, 메타데이터를 읽는 작업은 불가능합니다.

class는 런타임에 남는다

반면 class는 런타임에도 객체 형태로 남아있습니다. 즉, 데코레이터를 통한 메타데이터 수집이나 NestJS의 ValidationPipe 같은 기능을 사용할 수 있게 됩니다.

import { IsString } from 'class-validator';

export class CreateUserDto {
  @IsString()
  name: string;
}

이렇게 클래스에 @IsString() 같은 데코레이터를 붙여놓으면, NestJS는 ValidationPipe를 통해 자동으로 유효성 검사를 수행할 수 있습니다.

예: ValidationPipe와 함께 쓰기

@Post()
@UsePipes(new ValidationPipe())
create(@Body() createUserDto: CreateUserDto) {
  return this.userService.create(createUserDto);
}

 

728x90

'Category > NestJs' 카테고리의 다른 글

NestJs에 Swagger 적용하는 법  (0) 2025.04.23
NestJS에서의 테스트 작성 예시  (1) 2024.10.30
NestJS에서의 테스트: 기본 개념부터 실제 사용까지  (0) 2024.10.30
'Category/NestJs' 카테고리의 다른 글
  • NestJs에 Swagger 적용하는 법
  • NestJS에서의 테스트 작성 예시
  • NestJS에서의 테스트: 기본 개념부터 실제 사용까지
Corinee
Corinee
  • Corinee
    Coding Note
    Corinee
  • 전체
    오늘
    어제
    • 분류 전체보기 (361) N
      • Category (354)
        • Algorithm (7)
        • SQL (2)
        • Java (4)
        • C (9)
        • React (7)
        • JavaScript (9)
        • CSS (2)
        • Node (1)
        • SpringBoot (26)
        • Database (3)
        • Network (1)
        • Django (6)
        • Python (22)
        • Flask (4)
        • iOS (25)
        • Swift (4)
        • Flutter (11)
        • Dart (3)
        • Git (1)
        • Firebase (1)
        • Gof (1)
        • 정보처리기사 (112)
        • AI (5)
        • NestJs (4)
        • Docker (1)
        • 사이드 프로젝트 (1)
        • Note (80)
        • Socket (1)
        • 개인 정보 처리 방침 (1)
        • 면접 (0)
        • Vue.js (0)
      • Archive (2) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    chrome extension 자동 배포
    Collections
    stdlib.h
    시맨틱 버전(semantic versioning
    json.parse(json.stringify())
    styled-components
    math.h
    core web vitals
    x.y.z (메이저.마이너.패치)
    중첩 함수(nested function)
    counter
    named export vs default export
    쉽게 풀어쓴 C언어 Express
    프로세스 강제 종료
    소프트웨어 버전 관리
    structuredclone()
    react
    원시값(primitive)
    semver)
    mermaid-cli
    useEffect
    public vs assets
    inp
    jackson 라이브러리
    ajax (asynchronous javascript and xml)
    Jest
    react router
    mcp server
    defaultdict
    intellij 콘솔 한글 깨짐
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Corinee
NestJS에서 DTO는 왜 클래스(class)로 작성해야 할까?
상단으로

티스토리툴바