강의

멘토링

로드맵

Inflearn brand logo image

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

ssavengers님의 프로필 이미지
ssavengers

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Exception Filter 적용하기

create_chat에서 빈 객체 보낼 때 ValidationPipe 예외 안 던지는 현상이 있습니다.

작성

·

79

0

코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다!

[코드팩토리 디스코드]https://bit.ly/3HzRzUM

 

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.


 

안녕하세요. 강의 중 WebSocket에서 create_chat 이벤트에 빈 객체 {}를 보냈을 때,

ValidationPipe가 예외를 잘 던져서 클라이언트(Postman)에서 exception 이벤트가 잘 발생하는 걸 확인했습니다.

그런데 제가 강의 코드와 동일하게 다음과 같이 작성했는데요

그런데 제가 Postman에서 {}만 보냈을 때는 ValidationPipe가 예외를 던지지 않고,

exception 이벤트도 발생하지 않아서 디버깅에 꽤 시간이 걸렸습니다.

CreateChatDto에 @IsDefined()를 추가하니까 그제서야 예외가 발생해서 Postman에서 exception이 감지됐습니다.

 

왜 강의에선 @IsDefined() 없이도 {}만 보내면 예외가 잘 발생하던데, 현재는 왜 @IsDefined()를 추가해야만 예외가 던져지는 걸까요?

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

혹시 저와 기본 ValidationOption 상태가 다른거 아닌가요?
https://github.com/codefactory-co/nestjs-lv1/blob/main/src/main.ts

확인 부탁드립니다.

감사합니다!

ssavengers님의 프로필 이미지
ssavengers
질문자

제코드는 이런게 큰 차이는 없는거 같은데 혹시 확인 가능하신가요?

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useGlobalPipes(
    new ValidationPipe({
      // MoraThan과 Order로 필터링하기에서 추가
      transform: true,

      // 제너레이터 기준으로 타입 변환 해줌 예시) IsNumber()
      transformOptions: {
        enableImplicitConversion: true,
      },
      whitelist: true,
      forbidNonWhitelisted: true,
    }),
  );

  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

어딘가는 차이가 있을 것 같습니다.

제가 테스트를 해보기 위해서 그냥 새로 프로젝트를 만들어서 @IsDefined() 없이 그냥 요청을 보내봤는데 에러는 잘 발생하는걸로 확인됩니다. 새 프로젝트에 ValidationPipe만 적용 했습니다.

Screenshot 2025-04-29 at 11.22.08 AM.png.webp

 

Screenshot 2025-04-29 at 11.22.12 AM.png.webp

위 스크린샷 확인 해주세요!

감사합니다!

0

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

이 문제는 ValidationPipe와 관련된 특성 때문에 발생할 수 있습니다. ValidationPipe는 기본적으로 객체의 속성에 유효성 검사 데코레이터가 있어야 예외를 발생시킵니다. 강의에서 예외가 발생했던 이유는 CreateChatDto에 정의된 속성에 대해 필수적으로 값이 제공되지 않을 경우 기본적으로 예외를 던지도록 설정되어 있거나, @IsDefined()와 같은 검사가 이루어졌기 때문일 수 있습니다.

일반적으로 괄호 {}로 빈 객체를 보낼 경우, 객체 내부의 필드가 체크되지 않는다면 오류가 발생하지 않을 수 있습니다. 이때 @IsDefined() 데코레이터를 사용하면 특정 필드가 반드시 제공되어야 하는지 검사합니다.

따라서, 현재 상황에서는 CreateChatDto에서 모든 필요한 필드에 @IsDefined()데코레이터를 추가하여 필드가 반드시 포함되어야 한다고 명시하는 것이 중요합니다. 이렇게 설정하면 빈 객체를 보낼 경우에도 예외가 발생합니다.

관련 자료

  • NestJS ValidationPipe: ValidationPipe의 사용법과 설정에 관한 공식 문서를 참고하세요.

이 문제에 대한 해결로 @IsDefined()를 추가하신 것은 매우 적절한 방법이고, 이를 통해 보다 견고한 데이터 검증을 구현할 수 있습니다.

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

ssavengers님의 프로필 이미지
ssavengers

작성한 질문수

질문하기