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

๋ฐ˜์‘ํ˜•

๐ŸŽฏ NestJS Custom Decorators – ๋‚˜๋งŒ์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ ์™„์ „ ๊ฐ€์ด๋“œ


NestJS๋Š” Express ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ์ง€๋งŒ, ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์„ ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜๋กœ ์‚ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” NestJS ๊ณต์‹ ๋ฌธ์„œ Custom Decorators๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ,
**๋‚˜๋งŒ์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Custom Decorator)**๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ค๋ฌด์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•œ๊ธ€๋กœ ํ•ด์„คํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ž˜ ๋‹ค๋ฃจ๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ๊ฐ€๋…์„ฑ, ๊ตฌ์กฐํ™”๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.


โœ… Custom Decorator๋ž€?

NestJS์—์„œ @Body(), @Query() ๊ฐ™์€ ๊ธฐ๋ณธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์™ธ์—๋„,
๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋‚˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1๏ธโƒฃ ์˜ˆ์ œ 1 – ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ (@User())

โœ… ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);
  • createParamDecorator()๋ฅผ ํ†ตํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ƒ์„ฑ
  • ctx.switchToHttp().getRequest()๋กœ Express ์š”์ฒญ ๊ฐ์ฒด ์ ‘๊ทผ

โœ… ์‚ฌ์šฉ ์˜ˆ์‹œ

@Get('profile')
getProfile(@User() user: any) {
  return user; // request.user ๊ฐ’
}

Passport ๋“ฑ์„ ํ†ตํ•ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์š”์ฒญ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ถ”์ถœ ๊ฐ€๋Šฅ


๋ฐ˜์‘ํ˜•

์ด ๊ตฌ๊ฐ„์€ ์ปค์Šคํ…€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์‹ค์‚ฌ์šฉ ์˜ˆ์ œ๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ์ค‘์š”ํ•œ ์ง€์ ์ž…๋‹ˆ๋‹ค.
์• ๋“œ์„ผ์Šค ๊ด‘๊ณ ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด CTR์ด ๋†’๊ฒŒ ๋‚˜์˜ค๋Š” ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค.

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

2๏ธโƒฃ ์˜ˆ์ œ 2 – @Roles() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ + Guard ์—ฐ๋™

โœ… Roles ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ •์˜

import { SetMetadata } from '@nestjs/common';

export const Roles = (...roles: string[]) => SetMetadata('roles', roles);
  • NestJS์—์„œ๋Š” SetMetadata()๋ฅผ ์ด์šฉํ•ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

โœ… Guard์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    return roles?.includes(user.role);
  }
}

โœ… ์ ์šฉ ์˜ˆ์‹œ

@UseGuards(RolesGuard)
@Roles('admin')
@Get('admin')
getAdminPanel() {
  return '๊ด€๋ฆฌ์ž ์ „์šฉ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.';
}

3๏ธโƒฃ ์˜ˆ์ œ 3 – Header์—์„œ ํŠน์ • ๊ฐ’ ์ถ”์ถœํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

export const Device = createParamDecorator(
  (data: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.headers[data.toLowerCase()];
  },
);

// ์‚ฌ์šฉ ์˜ˆ์‹œ
@Get()
handleRequest(@Device('User-Agent') userAgent: string) {
  return `๋‹น์‹ ์˜ ๋ธŒ๋ผ์šฐ์ €๋Š”: ${userAgent}`;
}

๐Ÿง  ์‹ค๋ฌด ํŒ

์ƒํ™ฉ ์ถ”์ฒœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ @User()
์š”์ฒญ ํ—ค๋” ์ •๋ณด ์ถ”์ถœ @Header('x-...')
์—ญํ• /๊ถŒํ•œ ์„ค์ • @Roles('admin')
๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ @SetMetadata() + Reflector

โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

๊ธฐ๋Šฅ ์„ค๋ช…

createParamDecorator() ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ๊ฐ’ ์ถ”์ถœ
SetMetadata() ์ปค์Šคํ…€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •์˜
Reflector Guard, Interceptor ๋“ฑ์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
์žฌ์‚ฌ์šฉ์„ฑ ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ ๋ฐ ๊ตฌ์กฐํ™” ๊ฐ€๋Šฅ
ํ™•์žฅ์„ฑ Guard, Interceptor, Pipe์™€ ์กฐํ•ฉ ์‹œ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

NestJS Custom Decorator,NestJS createParamDecorator,NestJS SetMetadata,NestJS Roles Decorator,NestJS Reflector ์‚ฌ์šฉ๋ฒ•,NestJS ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ™•์žฅ,NestJS ์‚ฌ์šฉ์ž ์ถ”์ถœ,NestJS Request ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ,NestJS ๊ถŒํ•œ ์„ค์ •,NestJS ์‹ค๋ฌด ๊ตฌ์กฐ ์„ค๊ณ„


 

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/04   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•