본문 바로가기

Web Dev/Javascript

Nest.js 백엔드 Pipe 사용법에 대해

반응형

Nest.js에서 Pipe는 요청(request)의 입력 데이터를 변환하거나 검증하는 데 사용되는 클래스입니다. Pipe는 @Injectable() 데코레이터로 주석이 달린 클래스로 정의되며, PipeTransform 인터페이스를 구현합니다.

Pipe의 주요 목적은 다음과 같습니다:

변환 (Transformation): 입력 데이터를 원하는 형식으로 변환합니다. 예를 들어, 문자열을 숫자로 변환하거나 객체의 형태를 변경할 수 있습니다.
검증 (Validation): 입력 데이터가 유효한지 확인합니다. 데이터의 유효성을 검사하고, 유효하지 않은 경우 예외를 throw하여 요청을 중단시킬 수 있습니다.
sanitization: 입력 데이터에서 잠재적으로 위험한 문자를 제거하거나 이스케이프 처리하여 보안을 강화할 수 있습니다.
Pipe는 @UsePipes() 데코레이터를 사용하여 컨트롤러 메서드, 컨트롤러 클래스 또는 전역적으로 적용할 수 있습니다. Nest.js에서 제공하는 내장 Pipe도 있고, 사용자 정의 Pipe를 만들 수도 있습니다.

내장 Pipe의 예시로는 ValidationPipe, ParseIntPipe, ParseBoolPipe 등이 있습니다. ValidationPipe는 클래스 기반 검증을 수행하며, class-validator 라이브러리와 함께 사용됩니다.

사용자 정의 Pipe를 만들 때는 PipeTransform 인터페이스의 transform 메서드를 구현해야 합니다. transform 메서드는 value(입력 데이터), metadata(선택적으로 사용 가능한 인수에 대한 메타데이터)를 매개변수로 받고, 변환된 값을 반환하거나 예외를 throw합니다.

Pipe를 사용하면 컨트롤러 메서드의 로직을 깔끔하게 유지하면서 입력 데이터의 유효성 검사와 변환을 별도로 처리할 수 있습니다. 이를 통해 코드의 재사용성과 모듈화가 향상됩니다.

데이터 변환(Data Transformation)은 데이터를 한 형식에서 다른 형식으로 변환하는 프로세스입니다. Nest.js에서 Pipe를 사용하여 데이터 변환을 수행할 수 있습니다. 데이터 변환의 목적은 들어오는 요청 데이터를 애플리케이션에서 기대하는 형태로 만드는 것입니다.
Pipe를 사용한 데이터 변환의 몇 가지 일반적인 예시는 다음과 같습니다:

문자열을 숫자로 변환:

클라이언트에서 전송된 데이터는 종종 문자열 형태입니다. 하지만 애플리케이션에서는 숫자 형태로 처리해야 할 수 있습니다.
ParseIntPipe, ParseFloatPipe 등을 사용하여 문자열을 해당하는 숫자 타입으로 변환할 수 있습니다.


문자열을 불리언으로 변환:

클라이언트에서 전송된 데이터가 "true" 또는 "false"와 같은 문자열일 수 있습니다.
ParseBoolPipe를 사용하여 이러한 문자열을 실제 불리언 값으로 변환할 수 있습니다.


객체 형태 변환:

클라이언트에서 전송된 데이터의 구조가 애플리케이션에서 기대하는 객체 형태와 다를 수 있습니다.
사용자 정의 Pipe를 만들어 데이터를 원하는 객체 형태로 변환할 수 있습니다.
예를 들어, 클라이언트에서 전송한 flat한 객체를 nested된 객체 형태로 변환할 수 있습니다.


데이터 포맷 변환:

클라이언트에서 전송된 데이터의 포맷이 애플리케이션에서 기대하는 포맷과 다를 수 있습니다.
사용자 정의 Pipe를 만들어 데이터를 원하는 포맷으로 변환할 수 있습니다.
예를 들어, 날짜 문자열을 Date 객체로 변환하거나, 특정 형식의 문자열을 다른 형식으로 변환할 수 있습니다.



데이터 변환 시 주의할 점:

변환 과정에서 데이터 손실이 발생하지 않도록 주의해야 합니다.
변환할 수 없는 데이터에 대한 적절한 예외 처리를 해야 합니다.
변환된 데이터의 유효성을 검사하는 것이 좋습니다.
필요한 경우 데이터 sanitization도 함께 수행하는 것이 좋습니다.

데이터 변환은 애플리케이션의 입력 데이터를 일관되고 예측 가능한 형태로 만들어주어 코드의 가독성과 유지보수성을 향상시킵니다. 또한, 컨트롤러 메서드에서 데이터 변환 로직을 분리하여 코드의 책임을 명확히 할 수 있습니다.
Nest.js의 Pipe를 활용하면 선언적이고 재사용 가능한 방식으로 데이터 변환을 수행할 수 있습니다. 다양한 내장 Pipe를 사용하거나 사용자 정의 Pipe를 만들어 프로젝트의 요구사항에 맞게 데이터 변환을 처리할 수 있습니다.

 

데이터 검증(Data Validation)은 애플리케이션에 들어오는 데이터가 특정 기준을 충족하는지 확인하는 프로세스입니다. 데이터 검증의 목적은 잘못되거나 악의적인 데이터로부터 애플리케이션을 보호하고, 데이터의 무결성을 유지하는 것입니다. Nest.js에서는 Pipe를 사용하여 데이터 검증을 수행할 수 있습니다.

Pipe를 사용한 데이터 검증의 몇 가지 일반적인 예시는 다음과 같습니다:

  1. 필수 필드 검증:
    • 특정 필드가 필수로 존재해야 하는 경우, 해당 필드의 존재 여부를 검증합니다.
    • 예를 들어, 사용자 등록 시 이메일과 비밀번호 필드가 필수로 요구될 수 있습니다.
  2. 데이터 타입 검증:
    • 들어오는 데이터의 타입이 예상한 타입과 일치하는지 검증합니다.
    • 예를 들어, 숫자 필드에 문자열이 전달되면 검증 오류로 처리할 수 있습니다.
  3. 데이터 범위 검증:
    • 데이터가 특정 범위 내에 있는지 검증합니다.
    • 예를 들어, 나이 필드는 0보다 크고 120보다 작아야 할 수 있습니다.
  4. 데이터 패턴 검증:
    • 데이터가 특정 패턴과 일치하는지 검증합니다.
    • 예를 들어, 이메일 주소가 유효한 형식인지 검증할 수 있습니다.
  5. 비즈니스 규칙 검증:
    • 애플리케이션의 비즈니스 규칙에 따라 데이터를 검증합니다.
    • 예를 들어, 특정 조건에 따라 데이터의 유효성을 검사할 수 있습니다.

Nest.js에서는 다양한 방법으로 데이터 검증을 수행할 수 있습니다:

  1. 내장된 ValidationPipe 사용:
    • Nest.js는 기본적으로 ValidationPipe를 제공합니다.
    • ValidationPipe는 class-validator 라이브러리와 함께 사용되며, 데코레이터를 사용하여 검증 규칙을 정의할 수 있습니다.
    • 예를 들어, @IsString(), @IsEmail(), @Min(), @Max() 등의 데코레이터를 사용하여 필드의 유효성을 검사할 수 있습니다.
  2. 사용자 정의 Pipe 만들기:
    • 특정 검증 로직이 필요한 경우, 사용자 정의 Pipe를 만들 수 있습니다.
    • PipeTransform 인터페이스를 구현하고, transform 메서드 내에서 검증 로직을 구현합니다.
    • 검증 실패 시 throw new BadRequestException()과 같은 예외를 발생시켜 요청을 중단시킬 수 있습니다.

데이터 검증 시 주의할 점:

  • 검증 규칙을 명확하고 일관되게 정의해야 합니다.
  • 검증 실패 시 적절한 오류 메시지를 반환하여 클라이언트에게 정보를 제공해야 합니다.
  • 민감한 데이터(예: 비밀번호)는 검증 후에도 안전하게 처리해야 합니다.
  • 데이터 검증은 애플리케이션의 성능에 영향을 줄 수 있으므로, 필요한 검증만 수행하는 것이 좋습니다.

데이터 검증은 애플리케이션의 보안과 데이터 무결성을 유지하는 데 중요한 역할을 합니다. Nest.js의 Pipe를 활용하면 선언적이고 재사용 가능한 방식으로 데이터 검증을 수행할 수 있습니다. ValidationPipe와 사용자 정의 Pipe를 적절히 사용하여 들어오는 데이터를 효과적으로 검증할 수 있습니다.

 

 

Handler-level Pipes

 

  • 특정 핸들러(컨트롤러의 메서드)에 적용되는 Pipe입니다.
  • @UsePipes() 데코레이터를 사용하여 적용합니다. 예시:
@Post()
@UsePipes(ValidationPipe)
createUser(@Body() userData: CreateUserDto) {
  // ...
}

 

Parameter-level Pipes

 

  • 핸들러 메서드의 특정 매개변수에 적용되는 Pipe입니다.
  • 매개변수 데코레이터와 함께 사용됩니다. 예시:
  •  
@Post()
createUser(@Body(ValidationPipe) userData: CreateUserDto) {
  // ...
}

 

Global Pipes

 

  • 애플리케이션 전체에 적용되는 Pipe입니다.
  • 모든 요청에 대해 실행됩니다. 예시:
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  // ...
}

 

Built-in Pipes 

 

  • Nest.js에서 기본적으로 제공하는 Pipe입니다.
  • 6개의 내장 Pipe: ValidationPipe, ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe, DefaultValuePipe
  • ValidationPipe:
    • 요청 데이터의 유효성을 검사하는 Pipe입니다.

 - class-validator 라이브러리와 함께 사용됩니다. 예시:

@Post()
@UsePipes(ValidationPipe)
createUser(@Body() userData: CreateUserDto) {
  // ...
}

 

 -  ParseIntPipe:

  • 문자열을 정수로 변환하는 Pipe입니다. 예시:
@Get(':id')
getUser(@Param('id', ParseIntPipe) id: number) {
  // ...
}
반응형