Controller 진입 전에 입력을 변환하고 잘못된 값을 거절합니다.
PipeTransform은 route argument를 변환하거나 검증합니다. 재사용되는 형식 규칙을 Pipe로 두면 Controller가 이미 정제된 값을 받습니다.
BadRequestException으로 안정적인 공개 메시지를 제공하고 원본 민감 입력을 로그에 남기지 않습니다.
업무상 존재 여부와 권한 검사는 Service 책임으로 남기고 문자열 형식 검증과 구분합니다.
Pipe에서 DB 변경 같은 부수 효과를 수행하지 마세요.
로컬 프로젝트에서 확인해보세요소문자 slug를 강제하는 SlugPipe를 추가하세요.
import "reflect-metadata";
import {
BadRequestException,
Controller,
Get,
Module,
Param,
PipeTransform,
} from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
class PositiveIdPipe implements PipeTransform<string, number> {
transform(value: string) {
const id = Number(value);
if (!Number.isInteger(id) || id < 1)
throw new BadRequestException("id는 양의 정수여야 합니다.");
return id;
}
}
@Controller()
class AppController {
@Get() home() {
return `<main><a href="/courses/3">올바른 ID</a></main>`;
}
@Get("courses/:id") find(@Param("id", PositiveIdPipe) id: number) {
return { id, title: "Pipe 실습" };
}
}
@Module({ controllers: [AppController] })
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(4173, "0.0.0.0");
}
bootstrap();