@Injectable() 데코레이터가 붙은 클래스로, 들어오는 데이터를 변환(transformation)하거나 유효성을 검사(validation)하는 역할을 합니다.@Body, @Param 등)를 가로채 처리합니다.ValidationPipe: 유효성 검사를 수행.ParseIntPipe: 문자열을 숫자로 변환.ParseBoolPipe: 문자열을 불리언으로 변환.class-validator와 class-transformerclass-validator와 class-transformer라는 매우 강력한 라이브러리를 함께 사용합니다.class-validator:
@IsString(), @IsNumber(), @IsNotEmpty(), @MinLength(), @IsEmail() 등.class-transformer:
class-validator가 동작할 수 있습니다.ValidationPipe 적용하기필요한 패키지 설치:
npm install class-validator class-transformer
DTO에 유효성 검증 데코레이터 추가:
// create-movie.dto.ts
import { IsString, IsNumber, IsNotEmpty } from 'class-validator';
export class CreateMovieDto {
@IsString()
@IsNotEmpty()
readonly title: string;
@IsNumber()
readonly year: number;
}
main.ts에 전역 파이프(Global Pipe)로 등록:
ValidationPipe를 전역으로 등록하면, 모든 컨트롤러의 모든 라우트 핸들러에 들어오는 데이터에 대해 자동으로 유효성 검사가 적용됩니다.// main.ts
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true, // DTO에 정의되지 않은 속성은 자동으로 제거
forbidNonWhitelisted: true, // DTO에 정의되지 않은 속성이 있으면 요청 자체를 거부
transform: true, // 요청 데이터를 DTO의 타입으로 자동 변환 (e.g., string -> number)
}),
);
await app.listen(3000);
}
bootstrap();
CreateMovieDto를 사용하는 컨트롤러에 잘못된 데이터(e.g., year에 문자열)가 들어오면, NestJS는 비즈니스 로직이 실행되기 전에 자동으로 400 Bad Request 에러를 응답합니다.@nestjs/config)문제점: 데이터베이스 비밀번호, API 키, 포트 번호 등 환경에 따라 달라지는 설정 값들을 소스 코드에 직접 하드코딩하는 것은 매우 나쁜 관행입니다. (보안 취약, 유연성 저하)
@nestjs/config: NestJS의 공식 설정 관리 모듈로, .env 파일을 사용하여 환경 변수를 손쉽게 관리하고, 이를 애플리케이션 전반에서 안전하게 사용할 수 있도록 도와줍니다.
@nestjs/config 설정 및 사용법필요한 패키지 설치:
npm install @nestjs/config
.env 파일 생성: 프로젝트 루트 디렉토리에 .env 파일을 만들고, 환경 변수를 KEY=VALUE 형식으로 저장합니다.
# .env
PORT=4000
DB_HOST=localhost
DB_PASSWORD=mysecretpassword
.env 파일은 민감한 정보를 포함하므로, .gitignore 파일에 반드시 추가하여 Git에 커밋되지 않도록 해야 합니다.루트 모듈(app.module.ts)에 ConfigModule 등록:
ConfigModule.forRoot()를 사용하여 모듈을 등록합니다. isGlobal: true 옵션을 주면, 다른 모듈에서 별도로 ConfigModule을 import할 필요 없이 어디서든 ConfigService를 주입받아 사용할 수 있습니다.// app.module.ts
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // 전역 모듈로 설정
envFilePath: '.env', // 사용할 .env 파일 경로
}),
// ...
],
})
export class AppModule {}
ConfigService 주입 및 사용:
ConfigService를 주입받습니다.configService.get('KEY') 메서드를 사용하여 .env 파일에 정의된 값을 안전하게 가져올 수 있습니다.// app.module.ts (TypeORM 설정 예시)
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get<string>('DB_HOST'),
password: configService.get<string>('DB_PASSWORD'),
// ...
}),
}),
class-validator와 ValidationPipe를 함께 사용하면, DTO 클래스에 데코레이터를 붙이는 것만으로 선언적이고 강력한 유효성 검증을 전역적으로 적용할 수 있습니다.@nestjs/config 모듈은 .env 파일을 통해 환경 변수를 관리하는 표준적인 방법을 제공합니다.ConfigService를 주입받아 get() 메서드를 사용하면, 코드에서 민감한 설정 값을 분리하여 애플리케이션의 보안과 유연성을 크게 향상시킬 수 있습니다.