ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿงผ NestJS Pipes ์™„๋ฒฝ ๊ฐ€์ด๋“œ – ์œ ํšจ์„ฑ ๊ฒ€์ฆ๊ณผ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์˜ ํ•ต์‹ฌ


NestJS์—์„œ **Pipe(ํŒŒ์ดํ”„)**๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณต, ๊ฒ€์ฆ, ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
์ด ๊ธ€์€ NestJS ๊ณต์‹ ๋ฌธ์„œ Pipes๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๊ธ€ ๋ฒˆ์—ญ + ์‹ค๋ฌด ์ค‘์‹ฌ ํ•ด์„ค๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

"๋ฐฑ์—”๋“œ์˜ ํ’ˆ์งˆ์€ ์ž…๋ ฅ ๊ฒ€์ฆ์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค."
NestJS์˜ Pipe๋ฅผ ์ž˜ ์“ฐ๋ฉด DTO + Validation + Type ๋ณ€ํ™˜๊นŒ์ง€ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค!


โœ… Pipe๋ž€?

  • ์š”์ฒญ(Request)์—์„œ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜(transform) ํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ฆ(validate) ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • NestJS์—์„œ๋Š” @Body(), @Param(), @Query() ๋“ฑ์—์„œ ์ž๋™์œผ๋กœ ํŒŒ์ดํ”„๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Express์˜ middleware์™€ ๋‹ฌ๋ฆฌ, ๋ฐ์ดํ„ฐ ๋ ˆ๋ฒจ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ ๊ธฐ๋ณธ Pipe ๊ตฌํ˜„ ์˜ˆ์ œ

import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class UppercasePipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    return typeof value === 'string' ? value.toUpperCase() : value;
  }
}

2๏ธโƒฃ Pipe ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๋ฐ˜์‘ํ˜•
@Get(':name')
getUser(@Param('name', UppercasePipe) name: string) {
  return `์‚ฌ์šฉ์ž ์ด๋ฆ„: ${name}`;
}
  • @Param()์— Pipe๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ณ€ํ™˜๋œ ๊ฐ’์œผ๋กœ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค.
  • ์ด ์˜ˆ์ œ์—์„œ๋Š” GET /users/john → ์‚ฌ์šฉ์ž ์ด๋ฆ„: JOHN ์ด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“บ ๊ด‘๊ณ 

์ด ์ง€์ ์€ ์‹ค๋ฌด ํŒŒ์ดํ”„ ์ ์šฉ ์˜ˆ์‹œ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ตฌ๊ฐ„์œผ๋กœ, ์• ๋“œ์„ผ์Šค ํด๋ฆญ๋ฅ ์ด ๋†’์€ ์˜์—ญ์ž…๋‹ˆ๋‹ค.

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-XXXXXXX"
     data-ad-slot="YYYYYYY"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>

3๏ธโƒฃ ValidationPipe – NestJS์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ํ•ต์‹ฌ

class-validator์™€ class-transformer ํŒจํ‚ค์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ DTO ๊ธฐ๋ฐ˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜

npm install class-validator class-transformer

DTO ์˜ˆ์‹œ

import { IsString, IsInt, MinLength } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @MinLength(2)
  name: string;

  @IsInt()
  age: number;
}

Controller์— ์ ์šฉ

@Post()
create(@Body(new ValidationPipe()) body: CreateUserDto) {
  return body;
}
  • ์š”์ฒญ Body๊ฐ€ DTO ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด 400 ์—๋Ÿฌ ๋ฐ˜ํ™˜
  • ์ž๋™์œผ๋กœ ํƒ€์ž… ๋ณ€ํ™˜๋„ ์ˆ˜ํ–‰ (transform: true ์˜ต์…˜ ์‹œ)

๊ธ€๋กœ๋ฒŒ ํŒŒ์ดํ”„ ์ ์šฉ (์ „์—ญ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ)

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      whitelist: true, // DTO์— ์ •์˜๋œ ๊ฐ’๋งŒ ํ—ˆ์šฉ
      forbidNonWhitelisted: true, // ์ •์˜๋˜์ง€ ์•Š์€ ํ•„๋“œ๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ
    }),
  );
  await app.listen(3000);
}

์‹ค๋ฌด์—์„œ๋Š” global-pipe + DTO + class-validator ์กฐํ•ฉ์ด ๊ฑฐ์˜ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.


4๏ธโƒฃ Built-in Pipes (NestJS ๊ธฐ๋ณธ ์ œ๊ณต ํŒŒ์ดํ”„๋“ค)

Pipe ์„ค๋ช…

ParseIntPipe ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜
ParseBoolPipe ๋ฌธ์ž์—ด์„ boolean์œผ๋กœ ๋ณ€ํ™˜
ParseArrayPipe ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
DefaultValuePipe ๊ฐ’์ด undefined์ผ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
ValidationPipe DTO ๊ธฐ๋ฐ˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ

5๏ธโƒฃ ์ปค์Šคํ…€ Pipe ์‹ค๋ฌด ์˜ˆ์‹œ – ํ•œ๊ตญ ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹ ํ•„ํ„ฐ

@Injectable()
export class PhoneNumberPipe implements PipeTransform {
  transform(value: string): string {
    if (!/^01[0-9]-\d{3,4}-\d{4}$/.test(value)) {
      throw new BadRequestException('์ž˜๋ชป๋œ ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹์ž…๋‹ˆ๋‹ค');
    }
    return value;
  }
}

๐Ÿง  ์‹ค๋ฌด ์š”์•ฝ ์ „๋žต

์œ„์น˜ Pipe ์ ์šฉ ์„ค๋ช…

@Param() ParseIntPipe ๋“ฑ์œผ๋กœ ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ  
@Query() ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์˜ ํƒ€์ž… ๋ณ€ํ™˜  
@Body() DTO + ValidationPipe → ์™„์ „ํ•œ ์ž…๋ ฅ ๊ฒ€์ฆ ์‹œ์Šคํ…œ  
Global app.useGlobalPipes(...)๋กœ ์ „์—ญ ์ ์šฉ  

๐Ÿ”š ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

  • Pipe๋Š” NestJS์˜ ๊ฐ•๋ ฅํ•œ ์ „์ฒ˜๋ฆฌ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋„๊ตฌ
  • DTO + class-validator๋กœ ํƒ€์ž… ๊ฒ€์ฆ ๊ฐ€๋Šฅ
  • ์ปค์Šคํ…€ Pipe๋กœ ์œ ์—ฐํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ ์šฉ
  • ๊ธ€๋กœ๋ฒŒ Pipe ์„ค์ •์„ ํ†ตํ•œ ์ „์—ญ ์ผ๊ด€์„ฑ ์œ ์ง€

 

NestJS Pipe,NestJS ValidationPipe,NestJS ์œ ํšจ์„ฑ๊ฒ€์‚ฌ,NestJS DTO ๊ฒ€์ฆ,NestJS class-validator,NestJS ๊ธ€๋กœ๋ฒŒ ํŒŒ์ดํ”„,NestJS Pipe ์‹ค๋ฌด ์˜ˆ์ œ,NestJS ํƒ€์ž… ๋ณ€ํ™˜,NestJS ์š”์ฒญ ๊ฒ€์ฆ,NestJS ๋ฐฑ์—”๋“œ ๋ณด์•ˆ


 

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•