파이프(Pipes)?
NestJS에서 파이프는 요청의 데이터 처리 과정에서 핵심적인 역할을 담당합니다.
파이프는 요청 처리 파이프라인의 일환으로 작동하며, 주로 데이터 변환(transform)과 유효성 검사(validation) 이 두 가지 주요 작업에 사용되는데요. 데이터 변환은 입력 데이터를 애플리케이션이 요구하는 특정 형식으로 변환하는 과정을 의미합니다.
반면, 유효성 검사는 입력 데이터가 설정된 조건이나 규칙을 만족하는지 확인하는 절차이죠.
파이프(Pipes)는 어떤상황에 쓰면 좋은가?
그래서 파이프는 NestJS 개발 과정에서 매우 유용한 도구로, 여러 상황에서 그 가치를 발휘하는데요.
개발자가 입력 데이터를 효과적으로 관리하고, 데이터의 무결성을 유지하며, 잠재적인 오류를 사전에 방지할 수 있게 돕습니다.
특히, 파이프를 사용하는 것은 애플리케이션의 안정성과 신뢰성을 높이는 데 중요한 역할을 합니다.
각각의 부분을 짚어보며 설명하자면 데이터 유효성 검사의 경우, 클라이언트로부터 받은 입력 데이터가 API의 요구 사항을 만족하는지 검증할 때 파이프를 사용하는 것이 좋습니다. 이는 API가 예상치 못한 데이터로 인해 발생할 수 있는 오류를 방지하고, 올바른 데이터만을 처리하게 하죠.
데이터 타입 변환에 있어서는, 예를 들어 클라이언트로부터 받은 문자열을 숫자나 날짜와 같은 특정 타입으로 변환해야 할 때 파이프가 유용한데 이 변환 과정은 데이터를 적절히 처리하고 응답하기 위해 필수적일 수 있어요.
마지막으로, 데이터 가공에서도 파이프의 사용이 권장됩니다. 입력 데이터를 API 처리를 위한 형식으로 맞추거나, 데이터를 사전 처리하는 데 파이프를 활용할 수 있는데 이를 통해 데이터를 더 효율적으로 관리하고, 처리 과정을 최적화할 수 있죠.
파이프(Pipes)의 장점
위에 어떤 상황에 쓰면 좋은가? 부분과 연결되는 부분이기도 합니다.
데이터 유효성 검사를 하기 때문에 입력 데이터의 유효성을 검증이 되고, 검증이 되면 오류가 발생할 가능성을 줄이게 되고, 데이터의 오류가 줄기 때문에 데이터 무결성을 유지할 수 있게 됩니다.
그리고 공통의 데이터 처리 로직을 파이프로 구현하고, 분리함으로써 여러 컨트롤러나 서비스에 해당 로직을 재사용할 수 있고, 코드의 가독성과 유지보수성도 챙길 수 있어요.
예제 코드
입력받은 문자열을 정수로 변환하기
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';
@Injectable()
export class ParseIntPipe implements PipeTransform<string, number> {
transform(value: string, metadata: ArgumentMetadata): number {
const val = parseInt(value, 10);
if (isNaN(val)) {
throw new BadRequestException('Validation failed');
}
return val;
}
}
변환 과정에서 문자열이 유효한 정수가 아닌 경우 BadRequestException을 발생시키게 되는데 이 파이프를 라우트 핸들러의 특정 파라미터에 적용함으로써, 해당 파라미터가 유효한 정수로만 구성되었는지 자동으로 검증할 수 있어요.
클래스 유효성 검사 파이프 사용 예시
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';
@Injectable()
export class ValidationPipe implements PipeTransform<any> {
async transform(value: any, { metatype }: ArgumentMetadata) {
if (!metatype || !this.toValidate(metatype)) {
return value;
}
const object = plainToClass(metatype, value);
const errors = await validate(object);
if (errors.length > 0) {
throw new BadRequestException('Validation failed');
}
return value;
}
private toValidate(metatype: Function): boolean {
const types: Function[] = [String, Boolean, Number, Array, Object];
return !types.includes(metatype);
}
}
입력된 데이터를 해당 데이터 타입의 클래스 인스턴스로 변환하고, class-validator 라이브러리를 사용하여 해당 인스턴스의 유효성을 검사하는 예시인데 유효성 검사를 통과하지 못한 경우 BadRequestException을 발생시켜, 클라이언트에 유효성 검사 실패를 알리는 형태로 동작하는 예시입니다.
객체가 여러 필드를 가지고 있고, 각 필드가 특정 조건(예: 문자열 길이, 정규식, 최소값, 최대값 등)을 만족해야 할 때 유용한 방법입니다.
파이프 사용 시 주의할 점
파이프에서 발생하는 예외는 적절히 처리되어야 하는데 특히 유효성 검사를 수행하는 파이프에서는, 유효하지 않은 입력에 대해 사용자에게 명확한 에러 메시지를 반환해야 해요.
그리고 복잡한 데이터 처리 로직을 파이프에서 수행할 경우, 요청 처리 시간에 영향을 줄 수 있어 파이프의 로직은 가능한 한 효율적이어야 해요.
오늘은 Nest의 파이프 에 대해 알아보았습니다. 파이프는 NestJS에서 요청 데이터의 전처리를 위한 강력한 메커니즘을 제공합니다.
데이터 유효성 검사와 변환을 통해 애플리케이션의 데이터 무결성을 보장하고, 코드의 재사용성 및 유지보수성과 안정성을 높이는데 도움을 줍니다
'프로그래밍(Basic) > NestJS' 카테고리의 다른 글
[바미] Nest - Websocket 구현 (0) | 2024.03.14 |
---|---|
[바미] Nest - 마이크로서비스(Microservices) (0) | 2024.03.11 |
[바미] NestJS - 예외 필터(Exception Filters) (0) | 2024.03.07 |
[바미] NestJS - 가드(Guards) (0) | 2024.03.06 |
[바미] NestJS - 인터셉터(Interceptors) (0) | 2024.03.05 |