우선 Post를 통해 요청되는 값 자체를 콘솔로 찍어보자.
값을 이렇게 보내면, 위의 부분이 Header이고 아래부분이 Body이다.
다음과 같은 핸들러로 요청을 출력해보니
@Post()
async createMessage(@Body() body: any, @Headers() headers: Record<string, string>) {
console.log('📌 Headers:');
for (const [key, value] of Object.entries(headers)) {
console.log(` ${key}: ${value}`);
}
console.log('📌 Body:');
console.log(JSON.stringify(body, null, 2));
}
그냥 그대로 나오는 것을 볼 수 있다.
그럼 우리는 이제 사용자의 요청에 대하여, 이 헤더와 바디를 통해서 처리를 하도록 할 것이다.
그럼 일단 body부터 원하는 데이터로 가져올 수 있도록 하자.
해당 데이터를 이렇게 any 타입이 아닌, 우리가 원하는 값으로 가져오기 위해 DTO를 작성한다.
export class CreateMessageDto {
content: string
}
현재는 가져오는 값이 content 밖에 존재하지 않기 때문에, content 필드 하나만 가지고 있는 DTO를 생성한다.
@Post()
async createMessage(@Body() body: CreateMessageDto) {
console.log(`This is content: ${body.content}`);
}
그리고 body의 타입을 CreateMessageDto로 직접 지정해준 후에 재요청해보자.
그러면 이렇게 타입이 적절하게 지정된 것을 볼 수 있다.
하지만 이렇게 정상적인 값이 아니라
POST http://localhost:3000/messages
Content-Type: application/json
{
}
이렇게 본문이 비어있거나,
POST http://localhost:3000/messages
Content-Type: application/json
{
"content": null
}
null인 값이 있어도
위와 같이 정상 응답을 주게 된다.
우리는 이렇게 잘못된 요청에 대하 BadRequest인 400 응답을 주어야 한다.
이렇게 자동으로 체크를 해서 응답을 해줄 수 있도록, validation pipe를 사용해보자.
사용자의 요청과 응답이 서버에서 위와 같은 순서로 처리가 되는데, 이 중 가장 먼저 이루어지는 데이터의 유효성 체크이다.
현재 CreateMessageDto는 content를 string 타입으로 받고 있다.
그렇기에 content가 string인 것을 확인하고 나서야 요청 처리를 시작해야 한다.
class-validator를 사용해보자.
우선 이런 타입에 대한 체크는 모든 핸들러에서 이루어지기 때문에, 전역으로 validation pipe를 추가한다.
main.ts에서 app에 다음 속성을 추가하자.
app.useGlobalPipes(new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true
}));
이러면 모든 request에 대하여 dto에 타입체크가 시작된다.
이제 dto에도 데코레이터를 추가하자.
export class CreateMessageDto {
@IsString()
content: string
}
이렇게 string 타입이기 때문에 @IsString() 데코레이터를 추가해준다.
그렇게해서 잘못된 요청을 보내보자.
그렇게 요청해보니, 잘못된 요청이라며 400에러가 나오는 것을 볼 수 있었다.
근데 여기서 궁금한 부분이 있다.
우리가 만든 TypeScript는 JavaScript로 변환되어 동작하게 되는데, 그럼 이 validation pipe는 어떻게 동작하는 것인가.
tsconfig.json을 보면 다음과 같은 부분이 있다.
이 설정을 통해서 데코레이터의 정보가 자바스크립트에도 포함이 되게 된다.
변환된 자바스크립트의 dto를 보면 다음과 같이 나와있다.
__decorate([
(0, class_validator_1.IsString)(),
__metadata("design:type", String)
], CreateMessageDto.prototype, "content", void 0);
데코레이터로 파라미터가 string 타입임을 알리고 있는 것이다.
이렇게 자바스크립트에서도 타입에 관하여 동작할 수 있도록 한다.
'Node > Nest' 카테고리의 다른 글
Nest에서의 IOC/DI 알아보기 (0) | 2025.07.06 |
---|---|
Nest에서 Service layer 구현하기 (0) | 2025.07.05 |
Nest에서 파일 시스템을 통해 repository layer 구현하기 (0) | 2025.07.05 |
Nest 모듈과 컨트롤러 만들어보기 (0) | 2025.07.03 |
Nest 살짝 맛보기 (2) | 2025.07.01 |