ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ NestJS Execution Context – ๋ค์ค ํ๋กํ ์ฝ ์ง์์ ์ํ ํต์ฌ ๊ฐ๋
octo54 2025. 5. 14. 11:02๐ 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๋ก ํ ๋ฒ์ ์ฒ๋ฆฌ |
โ ๏ธ ์ฃผ์ ์ฌํญ
- ํ๋กํ ์ฝ ํผ์ฉ ์ฃผ์:
- ๋์ผ ํธ๋ค๋ฌ์์ ์๋ก ๋ค๋ฅธ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปจํ ์คํธ ๋ณํ์ด ์๋ชป๋ ์ ์์.
- ์ปจํ
์คํธ ํ์
ํ์ธ ํ์:
- getType()์ผ๋ก ํ์ฌ ์ปจํ ์คํธ๋ฅผ ๋ฐ๋์ ํ์ธ ํ ์ฒ๋ฆฌํด์ผ ์์ ํฉ๋๋ค.
- ํ๋กํ ์ฝ๋ง๋ค ๊ฐ์ฒด๊ฐ ๋ค๋ฆ:
- 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 ๊ณ ๊ธ ๊ฐ์ด๋
'framework > NestJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- JAX
- gatsbyjs
- PostgreSQL
- ์น๊ฐ๋ฐ
- nextJS
- nodejs
- kotlin
- flax
- Next.js
- rag
- ๋ฅ๋ฌ๋
- CI/CD
- Python
- App Router
- NestJS
- Docker
- AI์ฑ๋ด
- SEO ์ต์ ํ
- fastapi
- ํ๋ก ํธ์๋๋ฉด์
- llm
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์๋๊ฐ๋ฐ
- ํ๋ก ํธ์๋
- Prisma
- Ktor
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- SEO์ต์ ํ
- REACT
- seo ์ต์ ํ 10๊ฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |