강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

BestPlus님의 프로필 이미지
BestPlus

작성한 질문수

탄탄한 백엔드 NestJS, 기초부터 심화까지

DTO에 대한 질문

작성

·

19

1

안녕하세요 강의 잘 듣고 있습니다.

 

DTO에 대한 궁금증이 있어 질문 남깁니다.

 

DTO에서 Class-Validator를 통해 유효성 검사를 하는데, 섹션5까지 학습했을 때는 Schema에서 검사를 진행했습니다.

DTO에서 PickType Request로 전달되는 데이터만 명시만 하고 Schema에서 유효성검사를 하는 이유가 있는지, 아래 내용처럼 DTO에서 유효성 검사를 분리해서 하는게 이상적인 형태인지 궁금합니다.

// src/cats/dto/cats.request.dto.ts
import { PickType } from '@nestjs/swagger';
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
import { Cat } from '../cats.schema';

export class CatRequestDto extends PickType(Cat, [
  'email',
  'name',
  'password',
] as const) {
  @IsEmail()
  @IsNotEmpty()
  email: string;

  @IsString()
  @IsNotEmpty()
  name: string;

  @IsString()
  @IsNotEmpty()
  password: string;
}

 

 

 

답변 2

0

윤상석님의 프로필 이미지
윤상석
지식공유자

안녕하세요! DTO 뿐만 아니라 Schema에서도 검사 진행 하는 것을 보여드리고자 해서 보여드린 것입니다!

실제로 실무에서 엄격하고 방어적으로 코드를 짠다면 둘 다 씁니다.

  • 형식적, 표면적(validatable) 제약은 DTO

     

  • 영속성, 무결성 제약(DB 레벨)은 Schema/DB

     

이렇게 하면 중복처럼 보여도 방어적 설계(Defense in depth)가 되어 실수나 우회 입력에 안전합니다.

그래서 둘 다 검증하는게 베스트라고 생각하시면 됩니다.

 

0

안녕하세요, 인프런 AI 인턴입니다. 박민우님.

DTO와 유효성 검사에 관한 질문을 주셨네요. 우선 DTO(Data Transfer Object)는 클라이언트와 서버 간의 데이터 전송을 위한 객체로 사용되며, 데이터의 구조와 조건을 명확하게 정의하는 것이 주 목적입니다.

DTO에서 유효성 검사를 분리하여 사용하는 이유는 다음과 같습니다:

  1. 유연한 데이터 구조 정의: DTO는 엔티티와 분리되어 있기 때문에 클라이언트와의 인터페이스를 자유롭게 정의할 수 있습니다. 이를 통해 클라이언트 측 요구사항에 맞게 데이터 구조를 설계할 수 있습니다.

  2. 데이터 유효성 검사: class-validator를 DTO에 적용함으로써, 데이터가 서버 로직에 도달하기 전에 유효성을 검증할 수 있습니다. 이는 서버의 일관성을 유지하고 잠재적 오류를 방지하는 데 도움이 됩니다.

  3. 명확한 역할 구분: DTO는 주로 데이터 전송과 유효성 검증을 담당하고, Schema(혹은 엔티티)는 데이터베이스의 구조를 정의하는 데 초점을 맞춥니다. 따라서 둘의 역할을 분명히 나누어 관리할 수 있습니다.

또한, Schema에서는 데이터베이스와의 직접적인 상호작용을 위해 유효성 검사를 적용할 수도 있지만, 이는 데이터베이스 레벨에서의 제약 조건을 더 엄격히 적용하는 데 도움이 됩니다. 반면, DTO 레벨에서는 외부로부터 데이터를 받을 때의 유효성을 더 신경 쓰는 경우가 많습니다.

이를 통해 각 레이어마다 유효성 체크의 목적과 기준이 다를 수 있으며, 이런 분리 덕분에 코드의 응집성과 모듈성이 높아집니다.

자세한 예시나 다른 사용 사례가 궁금하시면 아래의 유사한 질문들을 확인해 보실 수 있습니다:
- DTO와 Schema를 작성할 때 중복 사용하게 되는 class-validator
- class-validator 살펴보기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

BestPlus님의 프로필 이미지
BestPlus

작성한 질문수

질문하기