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

๋ฐ˜์‘ํ˜•

๐ŸŒ NestJS Execution Context – ๋‹ค์ค‘ ํ”„๋กœํ† ์ฝœ ์ง€์›์„ ์œ„ํ•œ ํ•ต์‹ฌ ๊ฐœ๋…


NestJS์—์„œ **Execution Context(์‹คํ–‰ ์ปจํ…์ŠคํŠธ)**๋Š” HTTP, WebSocket, GraphQL ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์— ๊ฑธ์ณ ๊ณตํ†ต์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์€ NestJS ๊ณต์‹ ๋ฌธ์„œ Execution Context๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ,
์‹ค๋ฌด์—์„œ Execution Context๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์š”์ฒญ ์œ ํ˜•์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก "๋‹ค์–‘ํ•œ ์š”์ฒญ ์œ ํ˜•์„ ํ•˜๋‚˜์˜ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด, ์œ ์—ฐํ•œ API ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค."


โœ… Execution Context๋ž€?

  • NestJS์—์„œ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • HTTP, WebSocket, GraphQL ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Guard, Interceptor, Pipe ๋“ฑ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿง  Context์˜ ํ•ต์‹ฌ ๊ตฌ์กฐ

ExecutionContext {
  getType(): string;
  getClass<T = any>(): Type<T>;
  getHandler(): Function;
  switchToHttp(): HttpArgumentsHost;
  switchToRpc(): RpcArgumentsHost;
  switchToWs(): WsArgumentsHost;
}

๐Ÿช“ ์ฃผ์š” ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์„ค๋ช…

getType() ์ปจํ…์ŠคํŠธ ์œ ํ˜• ๋ฐ˜ํ™˜ (http, rpc, ws)
getClass() ํ˜„์žฌ ์ปจํŠธ๋กค๋Ÿฌ ๋ฐ˜ํ™˜
getHandler() ํ˜„์žฌ ๋ฉ”์„œ๋“œ ํ•ธ๋“ค๋Ÿฌ ๋ฐ˜ํ™˜
switchToHttp() HTTP ์š”์ฒญ ๊ฐ์ฒด๋กœ ์ „ํ™˜
switchToRpc() RPC ์š”์ฒญ ๊ฐ์ฒด๋กœ ์ „ํ™˜
switchToWs() WebSocket ์š”์ฒญ ๊ฐ์ฒด๋กœ ์ „ํ™˜

๐Ÿ“ฆ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• – HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ

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

@Injectable()
export class LoggingGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    console.log(`HTTP ์š”์ฒญ ๊ฒฝ๋กœ: ${request.url}`);
    return true;
  }
}

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

@UseGuards(LoggingGuard)
@Get('users')
getUsers() {
  return ['user1', 'user2'];
}

๐Ÿ’ก switchToHttp().getRequest()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“บ ๊ด‘๊ณ 

Execution Context์˜ ์‹ค์‚ฌ์šฉ ์˜ˆ์ œ๊ฐ€ ๋‚˜์˜ค๋Š” ์ค‘์š”ํ•œ ์ง€์ ์ž…๋‹ˆ๋‹ค.
์• ๋“œ์„ผ์Šค ๊ด‘๊ณ ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด 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>

๐ŸŒ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ ์ง€์› – WebSocket ์˜ˆ์ œ

โœ… WebSocket ์ „ํ™˜

@Injectable()
export class WsGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const client = context.switchToWs().getClient();
    console.log(`WebSocket Client: ${client.id}`);
    return true;
  }
}

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

@WebSocketGateway()
export class ChatGateway {
  @UseGuards(WsGuard)
  @SubscribeMessage('message')
  handleMessage(client: any, payload: any): string {
    return 'Message received';
  }
}

๐Ÿ’ก switchToWs().getClient()๋กœ WebSocket ํด๋ผ์ด์–ธํŠธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.


๐Ÿ“ง RPC (Remote Procedure Call) ์ง€์›

๋ฐ˜์‘ํ˜•

โœ… RPC ์ „ํ™˜

@Injectable()
export class RpcGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const data = context.switchToRpc().getData();
    console.log(`RPC ๋ฐ์ดํ„ฐ: ${JSON.stringify(data)}`);
    return true;
  }
}

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

@GrpcMethod('HeroService', 'FindOne')
findOne(data: { id: number }): string {
  return `Hero with ID: ${data.id}`;
}

๐Ÿš€ ์‹ค๋ฌด ํ™œ์šฉ – ๋‹ค์ค‘ ํ”„๋กœํ† ์ฝœ ์ฒ˜๋ฆฌ Guard

@Injectable()
export class MultiGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const type = context.getType();
    if (type === 'http') {
      const request = context.switchToHttp().getRequest();
      console.log(`HTTP ์š”์ฒญ: ${request.url}`);
    } else if (type === 'ws') {
      const client = context.switchToWs().getClient();
      console.log(`WebSocket ํด๋ผ์ด์–ธํŠธ: ${client.id}`);
    } else if (type === 'rpc') {
      const data = context.switchToRpc().getData();
      console.log(`RPC ๋ฐ์ดํ„ฐ: ${JSON.stringify(data)}`);
    }
    return true;
  }
}

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

@UseGuards(MultiGuard)
@Controller('multi')
export class MultiController {
  @Get()
  getData() {
    return 'HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ';
  }

  @MessagePattern('chat')
  chatHandler(data: any) {
    return 'WebSocket ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ';
  }
}

๐Ÿงฉ Context ํ™œ์šฉ ์ „๋žต

์ƒํ™ฉ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ context.switchToHttp().getRequest()
WebSocket ํด๋ผ์ด์–ธํŠธ ํ™•์ธ context.switchToWs().getClient()
RPC ๋ฐ์ดํ„ฐ ์ˆ˜์‹  context.switchToRpc().getData()
๋‹ค์ค‘ ํ”„๋กœํ† ์ฝœ ์ฒ˜๋ฆฌ context.getType()์œผ๋กœ ๊ตฌ๋ถ„
๊ณตํ†ต ๋กœ์ง ์ฒ˜๋ฆฌ MultiGuard๋กœ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ

โš ๏ธ ์ฃผ์˜ ์‚ฌํ•ญ

  1. ํ”„๋กœํ† ์ฝœ ํ˜ผ์šฉ ์ฃผ์˜:
    • ๋™์ผ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปจํ…์ŠคํŠธ ๋ณ€ํ™˜์ด ์ž˜๋ชป๋  ์ˆ˜ ์žˆ์Œ.
  2. ์ปจํ…์ŠคํŠธ ํƒ€์ž… ํ™•์ธ ํ•„์ˆ˜:
    • getType()์œผ๋กœ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ™•์ธ ํ›„ ์ฒ˜๋ฆฌํ•ด์•ผ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ”„๋กœํ† ์ฝœ๋งˆ๋‹ค ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฆ„:
    • HTTP์˜ request, WebSocket์˜ client, RPC์˜ data๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

ํŠน์ง• ์„ค๋ช…

๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ ์ง€์› HTTP, WebSocket, RPC ๋“ฑ ๋‹ค์ค‘ ํ”„๋กœํ† ์ฝœ ์ง€์›
์œ ์—ฐํ•œ ์ปจํ…์ŠคํŠธ ์ „ํ™˜ switchToHttp, switchToWs, switchToRpc ์ œ๊ณต
์‹ค์‹œ๊ฐ„ ์š”์ฒญ ์ฒ˜๋ฆฌ ์š”์ฒญ ์œ ํ˜•์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ๊ฐ€๋Šฅ
์‹ค๋ฌด ํ™œ์šฉ์„ฑ ๊ทน๋Œ€ํ™” ๋‹ค์ค‘ ํ”„๋กœํ† ์ฝœ ์„œ๋น„์Šค ๊ตฌ์ถ• ์‹œ ํ•„์ˆ˜ ์š”์†Œ

 

NestJS Execution Context,NestJS ๋‹ค์ค‘ ํ”„๋กœํ† ์ฝœ,NestJS HTTP ์ปจํ…์ŠคํŠธ,NestJS WebSocket ์ปจํ…์ŠคํŠธ,NestJS RPC ์ปจํ…์ŠคํŠธ,NestJS Context ์ „ํ™˜,NestJS Guard ์‹ค๋ฌด,NestJS ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ,NestJS ํ”„๋กœํ† ์ฝœ ์ฒ˜๋ฆฌ,NestJS ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ


 

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