반응형
Pipe
NestJS에서 Pipe는 요청 데이터의 변환, 검증, 또는 가공을 수행하는 클래스이다.
Pipe는 컨트롤러의 핸들러 메서드로 전달되는 데이터가 사용되기 전에 실행되며, 요청 데이터를 처리하거나 필터링하는 데 유용하다.
Pipe의 주요 역할
- 데이터 변환 (Transformation)
- 입력 데이터를 컨트롤러에서 사용할 수 있는 형식으로 변환
- 예: 문자열을 숫자로 변환
- 데이터 검증 (Validation)
- 요청 데이터가 유효한지 확인하고, 유효하지 않은 경우 예외를 던짐.
- 예: 필수 필드가 누락되었거나, 형식이 올바르지 않을 때 에러 반환.
Pipe의 종류
1. Built-in Pipes (내장 Pipe)
- ValidationPipe
- 데이터 유효성을 검사
- 주로 DTO와 함께 사용되며, class-validator와 통합된다.
- 예: 요청 데이터가 DTO에 정의된 조건을 충족하지 않으면 에러 발생.
- ParseIntPipe
- 입력 값을 정수로 변환
- 변환에 실패하면 예외를 발생.
- ParseBoolPipe
- 요청 값을 불리언으로 변환.
- ParseUUIDPipe
- 입력 값을 UUID 형식으로 확인.
- DefaultValuePipe
- 요청 데이터가 없는 경우 기본값을 설정.
- ParseArrayPipe
- 입력 데이터를 배열로 변환.
2. Custom Pipes (사용자 정의 Pipe)
요청 데이터의 특정 형식을 강제하거나 커스텀 로직을 추가해서 사용자 요구에 따라 직접 Pipe를 구현가능
모든 파이프는 'PipeTransform' 의 'transform' 메서드를 구현해야한다.
1. PasswordPipe
- 기능:
- 입력된 비밀번호(value)의 길이가 8자 이하인지 확인.
- 길이가 8자 초과인 경우, BadRequestException을 발생시킴.
- 사용 목적:
비밀번호의 길이를 유효성 검사할 때 사용.
@Injectable()
export class PasswordPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
if (value.toString().length > 8) {
throw new BadRequestException('Password must be at least 8 characters');
}
return value.toString();
}
}
2. MaxLengthPipe
- 기능:
- 입력 데이터의 길이가 지정된 최대 길이(length)를 초과하는지 확인.
- 초과 시, BadRequestException을 발생시키며 커스텀 메시지를 반환.
- 사용 목적:
문자열의 최대 길이를 제한할 때 사용.
@Injectable()
export class MaxLengthPipe implements PipeTransform {
constructor(
private readonly length: number,
private readonly subject: string,
) {}
transform(value: any, metadata: ArgumentMetadata) {
if (value.toString().length > this.length) {
throw new BadRequestException(`${this.subject} 최대 길이는 ${this.length} 입니다.`);
}
return value.toString();
}
}
3. MinLengthPipe
- 기능:
- 입력 데이터의 길이가 지정된 최소 길이(length)보다 짧은지 확인.
- 짧을 경우, BadRequestException을 발생시키며 커스텀 메시지를 반환.
- 사용 목적:
문자열의 최소 길이를 제한할 때 사용.
@Injectable()
export class MinLengthPipe implements PipeTransform {
constructor(private readonly length: number) {}
transform(value: any, metadata: ArgumentMetadata) {
if (value.toString().length < this.length) {
throw new BadRequestException(`최초 길이는 ${this.length} 입니다.`);
}
return value.toString();
}
}
- 사용 예
@Post('register/email')
postRegisterEmail(
@Body('nickname') nickname: string,
@Body('email') email: string,
@Body('password', new MaxLengthPipe(8, '비밀번호'), new MinLengthPipe(3)) password: string,
) {
return this.authService.registerWithEmail({
nickname,
email,
password,
});
}
- MaxLength, MinLength Pipe 는 생성자를 넣어줌으로서 동적인 값을 받아 재사용성을 높힐 수 있다.
반응형
'nestJS' 카테고리의 다른 글
NestJS | Class Validator, Transformer (1) | 2024.11.20 |
---|---|
NestJS | Guard (0) | 2024.11.20 |
NestJS | TypeORM Table Inheritance (0) | 2024.11.12 |
NestJS | TypeORM Entity Embedding (2) | 2024.11.12 |
NestJS | TypeORM Column Annotation (1) | 2024.11.12 |