Basics

Basics

Nest ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋Š” HTTP์™€ ๋‹ค๋ฅธ ์ „์†ก ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

Installation

๋จผ์ € ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$ npm i --save @nestjs/microservices

Overview

์ผ๋ฐ˜์ ์œผ๋กœ Nest๋Š” ์—ฌ๋Ÿฌ ๋‚ด์žฅ ์ „์†ก๊ธฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ-์‘๋‹ต ๋ฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ์ „์ฒด ํ†ต์‹  ๋กœ์ง์ด ์ถ”์ƒํ™” ๊ณ„์ธต ๋’ค์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ผ์ธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์šด์†ก์—…์ฒด(transporter)๊ฐ„์— ์‰ฝ๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ฒญ-์‘๋‹ต ํŒจ๋Ÿฌ๋‹ค์ž„์€ ๋‹ค์–‘ํ•œ ๋ฒ”์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ์„ค๊ณ„๋œ Kafka ๋˜๋Š” NATS ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ์ง€์†์„ฑ์ด ์ œ๊ณต๋˜๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ (๋‹จ๋ฐฉํ–ฅ) ํ†ต์‹  ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ปจํ…์ŠคํŠธ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Getting started

๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” NestFactory ํด๋ž˜์Šค์˜ createMicroservice()๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@@filename(main)
import { NestFactory } from '@nestjs/core';
import { Transport } from '@nestjs/microservices';
import { ApplicationModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.createMicroservice(ApplicationModule, {
    transport: Transport.TCP,
  });
  app.listen(() => console.log('Microservice is listening'));
}
bootstrap();

info ํžŒํŠธ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ TCP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

createMicroservice()๋ฉ”์†Œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์˜ต์…˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด์—๋Š” ๋‘ ๋ฉค๋ฒ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

transport

Specifies the transporter (for example, Transport.NATS)

options

ํŠธ๋žœ์Šคํฌํ„ฐ ๋™์ž‘์„ ๊ฒฐ์ •ํ•˜๋Š” ํŠธ๋žœ์Šคํฌํ„ฐ๋ณ„ ์˜ต์…˜ ๊ฐ์ฒด

The ์˜ต์…˜ ๊ฐœ์ฒด๋Š” ์„ ํƒํ•œ ํŠธ๋žœ์Šคํฌํ„ฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. TCP ํŠธ๋žœ์Šคํฌํ„ฐ๋Š” ์•„๋ž˜์— ์„ค๋ช…๋œ ๋ช‡๊ฐ€์ง€ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

host

์—ฐ๊ฒฐ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„

port

์—ฐ๊ฒฐ ํฌํŠธ

retryAttempts

์ด ์—ฐ๊ฒฐ ์‹œ๋„ ํšŸ์ˆ˜

retryDelay

์—ฐ๊ฒฐ ์žฌ์‹œ๋„ ์ง€์—ฐ(ms)

Patterns

๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋Š” ํŒจํ„ด์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€์™€ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‘ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ„ด์€ ๋ฆฌํ„ฐ๋Ÿด ๊ฐ์ฒด ๋˜๋Š” ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ชจ๋“  ํŒจํ„ด์ด ์ง๋ ฌํ™”๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ฆฌ์‹œ๋ฒ„๋Š” ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€์‘ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ์™€ ์‰ฝ๊ฒŒ ์—ฐ๊ด€์‹œํ‚ฌ ์ˆ˜์žˆ๋‹ค.

Request-response

์š”์ฒญ-์‘๋‹ต ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ์„œ๋น„์Šค๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋น„์Šค๊ฐ€ ์‹ค์ œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก Nest๋Š” ๋‘ ์ฑ„๋„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋‹ด๋‹นํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋“ค์–ด์˜ค๋Š” ์‘๋‹ต์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด NATS์™€ ๊ฐ™์€ ํ”Œ๋žซํผ์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ž์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ, ์š”์ฒญ-์‘๋‹ต ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” @nestjs/microservices ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜จ @MessagePattern()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@@filename(math.controller)
import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';

@Controller()
export class MathController {
  @MessagePattern({ cmd: 'sum' })
  accumulate(data: number[]): number {
    return (data || []).reduce((a, b) => a + b);
  }
}

accumulate() ํ•ธ๋“ค๋Ÿฌ๋Š” cmd:'sum' ํŒจํ„ด์„ ์ถฉ์กฑ์‹œํ‚ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ„ด ํ•ธ๋“ค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋œ data๋ผ๋Š” ๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋Š” ๋ˆ„์ ๋˜์–ด์•ผ ํ•˜๋Š” ์ˆซ์ž์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

Asynchronous responses

๊ฐ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋™๊ธฐ์‹ ๋˜๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ async ๋ฉ”์†Œ๋“œ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

@@filename()
@MessagePattern({ cmd: 'sum' })
async accumulate(data: number[]): Promise<number> {
  return (data || []).reduce((a, b) => a + b);
}

๋˜ํ•œ Observable์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ŠคํŠธ๋ฆผ์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ฐ’์ด ๋ฐฉ์ถœ๋ฉ๋‹ˆ๋‹ค.

@@filename()
@MessagePattern({ cmd: 'sum' })
accumulate(data: number[]): Observable<number> {
  return from([1, 2, 3]);
}

์œ„์˜ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ๋ชฉ๊ณผ ํ•จ๊ป˜ 3 ๋ฒˆ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

Event-based

์š”์ฒญ-์‘๋‹ต ๋ฐฉ๋ฒ•์€ ์„œ๋น„์Šค๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ตํ™˜ํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ด๋ฒคํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์™„์ „ํžˆ ์“ธ๋ชจ์—†๋Š” ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ์˜ ์ด ๋ถ€๋ถ„์—์„œ ํŠน์ • ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์•Œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ†ต์‹ ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š”@nestjs/microservices ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜จ @EventPattern ()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@@filename()
@EventPattern('user_created')
async handleUserCreated(data: Record<string, unknown>) {
  // business logic
}

handleUserCreated()๋ฉ”์†Œ๋“œ๋Š” user_created ์ด๋ฒคํŠธ๋ฅผ ์ฒญ์ทจํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋œ data๋ผ๋Š” ๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค (์ด ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋œ ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ).

Client

๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•˜๊ฑฐ๋‚˜ Nest ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์— ์ด๋ฒคํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ClientProxyํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ •์  register()๋ฉ”์†Œ๋“œ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ClientsModule์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋“  ์š”์†Œ๊ฐ€ name (๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์‹๋ณ„์ž์˜ ์ผ์ข…)๊ณผ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ํŠน์ • ์˜ต์…˜ (์ด๊ฒƒ์ดcreateMicroservice() ๋ฐฉ๋ฒ•์— ์ „๋‹ฌ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฐ์ฒด)์„ ๊ฐ–๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐฐ์—ด์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

ClientsModule.register([
  { name: 'MATH_SERVICE', transport: Transport.TCP },
]),

info ํžŒํŠธ ClientsModule์€ @nestjs/microservices ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์„ ๊ฐ€์ ธ ์˜ค๋ฉด @Inject()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MATH_SERVICE๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

constructor(
  constructor(
    @Inject('MATH_SERVICE') private readonly client: ClientProxy,
  ) {}
)

info ํžŒํŠธ ClientProxy ํด๋ž˜์Šค๋Š”@nestjs/microservices ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ,์ด ์ ‘๊ทผ๋ฒ•์€ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ๊ตฌ์„ฑ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—, ์šฐ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธ์Šคํ„ด์Šค ์ธ Custom provider๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ClientProxyFactory๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

{
  provide: 'MATH_SERVICE',
  useFactory: (configService: ConfigService) => {
    const mathSvcOptions = configService.getMathSvcOptions();
    return ClientProxyFactory.create(mathSvcOptions);
  },
  inject: [ConfigService],
}

info ํžŒํŠธ ClientProxyFactory๋Š” @nestjs/microservices ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์€ @Client()์†์„ฑ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Client({ transport: Transport.TCP })
client: ClientProxy;

info ํžŒํŠธ @Client()๋Š” @nestjs/microservices ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค).

ClientProxy๋Š” ๊ฒŒ์œผ๋ฅธ์ž…๋‹ˆ๋‹ค. ์ฆ‰์‹œ ์—ฐ๊ฒฐ์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ์ฒซ ๋ฒˆ์งธ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ํ˜ธ์ถœ ์ „์— ์„ค์ •๋˜๊ณ  ์ดํ›„์˜ ๊ฐ ํ˜ธ์ถœ์—์„œ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์—ฐ๊ฒฐ์„ ์ˆ˜๋™์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด OnModuleInit ๋ผ์ดํ”„ ์‚ฌ์ดํด ํ›„ํฌ ๋‚ด์—์„œ connect()๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@@filename()
async onModuleInit() {
  await this.client.connect();
}

์—ฐ๊ฒฐ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฉด connect()๋ฉ”์†Œ๋“œ๋Š” ํ•ด๋‹น ์˜ค๋ฅ˜ ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

Sending messages

ClientProxy๋Š” send()๋ฉ”์†Œ๋“œ๋ฅผ ๋…ธ์ถœ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ์‘๋‹ต๊ณผ ํ•จ๊ป˜ Observable์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฉ์ถœ๋œ ๊ฐ’์„ ์‰ฝ๊ฒŒ ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@@filename()
accumulate(): Observable<number> {
  const pattern = { cmd: 'sum' };
  const payload = [1, 2, 3];
  return this.client.send<number>(pattern, payload);
}

send()๋ฉ”์†Œ๋“œ๋Š” pattern๊ณผ payload๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. pattern์€ @MessagePattern() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์— ์ •์˜๋œ ๊ฒƒ๊ณผ ๋™์ผํ•ด์•ผ ํ•˜๋ฉฐ, payload๋Š” ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋กœ ์ „์†กํ•˜๋ ค๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

Publishing events

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ emit()์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์˜ ์ฑ…์ž„์€ ์ด๋ฒคํŠธ๋ฅผ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์— ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@@filename()
async publish() {
  this.client.emit<number>('user_created', new UserCreatedEvent());
}

emit()๋ฉ”์†Œ๋“œ๋Š” pattern๊ณผ payload๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. pattern์€ @EventPattern() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์— ์ •์˜๋œ ๊ฒƒ๊ณผ ๋™์ผํ•ด์•ผํ•˜๋ฉฐ, payload๋Š” ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋กœ ์ „์†กํ•˜๋ ค๋Š” ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ์ž…๋‹ˆ๋‹ค.

Last updated

Was this helpful?