NestJS Kafka emit(), ์ด๋๊น์ง ์ฑ๊ณตํ๋ค๊ณ ๋งํ ์ ์์๊น?
๐ Overview
ํ์ฌ ์ฌ์ง ์ค์ธ ํ์ฌ์์๋ SNS ๋ง์ผํ ์ ํ๋์ ์ํ์ผ๋ก ๋ง๋ค์ด ํ๋งคํ๋ ์๋น์ค๋ฅผ ์ด์ํ๊ณ ์๋ค.
๊ธฐ์ ์ด๋ ๊ฐ์ธ ์ฌ์ฉ์๋ ์ธ์คํ๊ทธ๋จ, ๋ธ๋ก๊ทธ, ์ ํ๋ธ ๋ฑ ๋ค์ํ SNS ์ฑ๋์ ๋์์ผ๋ก ์ข์์, ํ๋ก์, ์กฐํ์์ ๊ฐ์ ๋ง์ผํ ์ํ์ ์ฃผ๋ฌธํ ์ ์๊ณ ์๋น์ค๋ ์ด ์ฃผ๋ฌธ์ ์ค์ SNS ๋ง์ผํ ์์ ์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ๋ค.
์ด ๊ณผ์ ์ ๋จ์ํ โ์ฃผ๋ฌธ์ ํ๋ ์ฒ๋ฆฌํ๋ ๊ฒโ์์ ๋๋์ง ์๋๋ค.
- ์ฃผ๋ฌธ ์์ฑ
- ๊ฒฐ์ ๋ฐ ํฌ์ธํธ ์ฐจ๊ฐ
- ์ฃผ๋ฌธ ์ํ ๊ด๋ฆฌ
- SNS ๋ง์ผํ ์์ ์งํ
- ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ธ๋ถ ๋ง์ผํ ์๋ฃจ์ ์ ์ฒด์์ ์ฐ๋
๊น์ง ์ด์ด์ง๋ ์ฌ๋ฌ ๋จ๊ณ์ ์ฒ๋ฆฌ ํ๋ฆ์ด ์กด์ฌํ๋ค.
ํนํ, SNS ๋ง์ผํ ์์ ์ ์์ฌ์์ ์ด์ํ๋ ์๋ฒ๊ฐ ์ง์ ์ฒ๋ฆฌํ๊ธฐ๋ ํ๊ณ , ์ํฉ์ ๋ฐ๋ผ์๋ ์ธ๋ถ SNS ๋ง์ผํ ํ๋ซํผ(๊ณต๊ธ์) ์ ์ฃผ๋ฌธ์ ์ ๋ฌํด ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ธฐ๋ ํ๋ค.
์ด์ฒ๋ผ ํ๋์ ์ฃผ๋ฌธ์ด ์ฌ๋ฌ ์๋ฒ, ๋๋ก๋ ์ธ๋ถ ์์คํ ๊น์ง ๊ฑฐ์ณ ์ฒ๋ฆฌ๋๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ์๋น์ค ์ ๋ฐ์ ์์ฐ์ค๋ฝ๊ฒ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ(MSA) ํํ๋ฅผ ๋ ๊ฒ ๋์๋ค.
์ด๋ฌํ ๊ตฌ์กฐ์์ ์ฃผ๋ฌธ ์๋น์ค์ SNS ์ฒ๋ฆฌ ์ฃผ์ฒด(์์ฌ ์๋ฒ ํน์ ์ธ๋ถ ๊ณต๊ธ์)๋ฅผ ๋์จํ๊ฒ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์๋น์ค์์๋ Kafka๋ฅผ ์ฌ์ฉํด ๋ฉ์์ง ๊ธฐ๋ฐ์ผ๋ก ์ฃผ๋ฌธ์ ์ ๋ฌํ๊ณ ์๋ค.
1. Kafka ๋ฉ์์ง ์ ์ก์ ์ธ์ โ์ฑ๊ณตโ์ด๋ผ๊ณ ๋งํ ์ ์์๊น?
Kafka๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋๋ค๊ณ ํ๋ฉด, ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ์ํ๋ฅผ ๊ธฐ๋ํ๋ค.
- ๋ฉ์์ง๊ฐ ๋ธ๋ก์ปค์ ์ ์์ ์ผ๋ก ์ ๋ฌ๋์๋ค.
- ์ปจ์๋จธ๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
- ์ ์ก ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ํธ์ถํ ์ชฝ์์ ์๋ฌ๋ฅผ ์ธ์งํ ์ ์๋ค.
ํ์ง๋ง ์ค์ Kafka ๊ธฐ๋ฐ ์์คํ ์์๋ โ๋ฉ์์ง๋ฅผ ๋ณด๋๋คโ๋ ํํ์ด ์๊ฐ๋ณด๋ค ํจ์ฌ ๋ชจํธํ๋ค. ๋ฉ์์ง๋ฅผ ์ด๋๊น์ง ์ ๋ฌํ์ ๋๋ฅผ ์ฑ๊ณต์ผ๋ก ๋ณผ ๊ฒ์ธ์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋๊ฐ, ์ธ์ ์ ์ ์๋์ง๊ฐ ์ฝ๋๋ง ๋ด์๋ ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
NestJS์์ Kafka ๋ฉ์์ง๋ฅผ ๋ฐํํ ๋, ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.
@Injectable()
export class SendKafkaService {
constructor(@Inject(KafkaService) private readonly client: ClientKafka) {}
execute({ topic, data }: TopicProducerMessage): void {
this.client.emit(topic, data);
}
}์ด ์ฝ๋๋ ๊ณผ์ฐ ์ด๋๊น์ง ์ฑ๊ณตํ ์ํ์ผ๊น?
- Kafka ๋ธ๋ก์ปค์ ์ค์ ๋ก ๋๋ฌํ์๊น?
- ์ ์ก์ ์คํจํ๋ค๋ฉด ์๋ฌ๋ฅผ ๋ฐ์ ์ ์์๊น?
- ์ด ์์ ์ ์ฃผ๋ฌธ ์ํ๋ฅผ ๋ณ๊ฒฝํด๋ ๋ ๊น?
์ด ์ง๋ฌธ์ ๋ตํ๋ ค๋ฉด, ๋จผ์ NestJS์ emit()์ด ๋ฌด์์ ๋ฐํํ๋์ง๋ถํฐ ์ดํดํด์ผ ํ๋ค.
Kafka ์ด์ ์, ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๊ณ ์๋ ๊ฒ์ ์ฌ์ค Kafka ์ด๋ฒคํธ๊ฐ ์๋๋ผ Observable ๊ฐ์ฒด์ด๋ค.
Observable ์ด๋?
NestJS์ client.emit()์ ๊ฐ์ ์ฆ์ ๋ฐํํ์ง ์๋๋ค. ๋์ Observable ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. Observable์ ๊ฐ๋จํ ๋งํด ์์ง ์คํ๋์ง ์์ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ณ ์๋ ์ปจํ ์ด๋์ ๊ฐ๊น๋ค. Observable์ด ๊ตฌ๋ (subscribe) ๋๊ฑฐ๋, firstValueFrom, lastValueFrom ๋ฑ์ผ๋ก await ๋๊ธฐ ์ ๊น์ง๋ ๋ด๋ถ์์ ๋ฐ์ํ ์ฑ๊ณต์ด๋ ์คํจ๊ฐ ํธ์ถํ ์ชฝ์ผ๋ก ์ ๋ฌ๋์ง ์๋๋ค.
2. emit()์ ๋ด๋ถ์ ์ผ๋ก ๋ฌด์์ ํ๊ณ ์์๊น?
์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ, emit()์ ํธ์ถํ๋ค๊ณ ํด์ ๊ณง๋ฐ๋ก โKafka๋ก ๋ฉ์์ง๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ์ก๋์๋คโ๊ณ ๋งํ๊ธฐ๋ ์ด๋ ต๋ค. ๊ทธ ์ด์ ๋ฅผ ์ดํดํ๋ ค๋ฉด NestJS์ emit()์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ์์ ์ ์ํํ๋์ง ํ ๋จ๊ณ๋ง ๋ ๋ค์ด๊ฐ ๋ณผ ํ์๊ฐ ์๋ค.
NestJS์์ client.emit()์ ๋จ์ํ โKafka๋ก ๋ฉ์์ง ํ๋ ๋ ๋ฆฌ๋ ํจ์โ๊ฐ ์๋๋ผ, ์ด๋ฒคํธ ๋ฐํ ๊ณผ์ ์ RxJS Observable๋ก ๊ฐ์ผ ์ธํฐํ์ด์ค๋ค.
๋จผ์ Nest์ ClientProxy.emit() ์ฃผ์์ ์ด๋ ๊ฒ ์ ์๋์ด ์๋ค.
// @nestjs/microservices
/**
* Emits an event to the server/broker.
* Used for event-driven communication style between microservices.
* @param pattern Pattern to identify the event
* @param data Data to be sent
* @returns Observable that completes when the event is successfully emitted
*/
emit<TResult = any, TInput = any>(pattern: any, data: TInput): Observable<TResult>;์ฆ, emit()์ โ๊ฐ์ ์ฆ์ ๋ฐํโํ๋ API๊ฐ ์๋๋ผ, ์ด๋ฒคํธ ๋ฐํ ์๋ฃ๋ฅผ ํํํ๋ Observable ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ค๋ค.
3. ๊ทธ๋ผ โemit ์ฑ๊ณตโ์ ์ด๋๊น์ง๋ฅผ ์๋ฏธํ ๊น?
emit()์ Kafka๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ธฐ ์ํ API๋ค. ํ์ง๋ง emit()์ ํธ์ถํ๋ค๊ณ ํด์ ๊ทธ ์ฆ์ โ์ด๋ฒคํธ๊ฐ ๋ธ๋ก์ปค์ ๋์ฐฉํ๋คโ๊ณ ๋งํ ์๋ ์๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ฐจ์ด๋ emit()์ ๋ฐํ๊ฐ์ ์ด๋ป๊ฒ ๋ค๋ฃจ๋๋์ ์๋ค.
this.client.emit(topic, payload);์์ ๊ฐ์ด emit()์ ๋จ์ํ ํธ์ถ๋ง ํ ๊ฒฝ์ฐ, ์ด ์ฝ๋๋ โ์ด๋ฒคํธ ๋ฐํ์ ์๋ํ๋คโ ์๋ฏธ์ ๊ฐ๊น๋ค. ์ ์ก ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๊ทธ ์คํจ๋ Observable ๋ด๋ถ์์ ์ฒ๋ฆฌ๋๋ฉฐ ํธ์ถํ ์ชฝ์์๋ ์ด๋ฅผ ์ธ์งํ์ง ๋ชปํ ์ ์๋ค.
๋ฐ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด emit()์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๋ค.
import { lastValueFrom } from 'rxjs';
await lastValueFrom(this.client.emit(topic, payload));emit()์ด ๋ฐํํ๋ Observable์ ํ ๋ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์ถํ๊ณ complete ๋๋ ๋จ๋ฐ ์คํธ๋ฆผ์ด๊ธฐ ๋๋ฌธ์, firstValueFrom ๋๋ lastValueFrom์ ์ฌ์ฉํด ์ ์ก ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๋ค.
- emit()๋ง ํธ์ถํ ๊ฒฝ์ฐ โ โ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋คโ
- emit()์ด ๋ฐํํ Observable ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ ํ ๊ฒฝ์ฐ โ โ์ด๋ฒคํธ๊ฐ ๋ธ๋ก์ปค๊น์ง์ ์ ์ก์ด ์๋ฌ ์์ด ์๋ฃ๋์๋คโ
๋ผ๊ณ ์ดํดํ๋ ํธ์ด ํจ์ฌ ์ ํํ๋ค.
4. emit ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝ์ฐ๋ ์ธ์ ์ผ๊น?
๊ทธ๋ ๋ค๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฐ ์ง๋ฌธ์ด ์๊ธด๋ค.
- ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ธ์ emit()์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๊ณ , ์ธ์ ๋ ๊ตณ์ด ๊ธฐ๋ค๋ฆฌ์ง ์์๋ ๋ ๊น?
์ด ์ง๋ฌธ์ ๋ํ ๋ต์ Kafka์ ํน์ฑ์ด ์๋๋ผ, ์ฐ๋ฆฌ ์ฝ๋๊ฐ ์ ์ก ๊ฒฐ๊ณผ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ ์๋์ง์ ๋ฌ๋ ค ์๋ค.
4-1. ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ
๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด๋ผ๋ฉด, emit()์ ๊ฒฐ๊ณผ๋ฅผ ๊ตณ์ด ๊ธฐ๋ค๋ฆฌ์ง ์์๋ ํฐ ๋ฌธ์ ๊ฐ ์๋ค.
- ์ด๋ฒคํธ๊ฐ ๋จ์ํ โ์๋ฆผโ ์ฑ๊ฒฉ์ธ ๊ฒฝ์ฐ
- ์ ์ก ์คํจ๊ฐ ๋ฐ์ํด๋ ์น๋ช ์ ์ด์ง ์์ ๊ฒฝ์ฐ
- ์คํจ ์ฌ๋ถ๋ฅผ ๋ณ๋์ ๋ชจ๋ํฐ๋ง์ด๋ ์ฌ์ฒ๋ฆฌ๋ก ๋ณด์ํ๊ณ ์๋ ๊ฒฝ์ฐ
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฌ์ฉ์ ํ๋ ๋ก๊ทธ ์์ง
- ํต๊ณ์ฉ ์ด๋ฒคํธ ๋ฐํ
- ์คํจํ๋๋ผ๋ ๋น์ฆ๋์ค ํ๋ฆ์ ์ง์ ์ ์ธ ์ํฅ์ ์ฃผ์ง ์๋ ๋น๋๊ธฐ ์์
์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ด๋ฒคํธ ๋ฐํ ์์ฒด๊ฐ ํต์ฌ ๋ก์ง์ด ์๋๊ธฐ ๋๋ฌธ์, emit()์ fire-and-forget ์ฒ๋ผ ์ฌ์ฉํด๋ ์ถฉ๋ถํ ํฉ๋ฆฌ์ ์ด๋ค.
4-2. ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝ์ฐ
๋ฐ๋๋ก, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ผ๋ฉด emit()์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋ ๊ฒ์ ์ํํด์ง ์ ์๋ค.
- ์ด๋ฒคํธ ๋ฐํ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ
- ์ ์ก ์คํจ ์ ์ฌ์๋, ๋ณด์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ
- โ์ด ์ด๋ฒคํธ๋ ๋ฐ๋์ ์ ๋ฌ๋์ด์ผ ํ๋คโ๋ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด ์ด๋ฐ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
this.client.emit(topic, payload);
order.setPublished(); // ์ฃผ๋ฌธ ์ํ ๋ณ๊ฒฝ์ด ์ฝ๋์์ setPublished()๋ โ์ฃผ๋ฌธ ์ด๋ฒคํธ๊ฐ ์ ์์ ์ผ๋ก ๋ฐํ๋์๋คโ๋ ์๋ฏธ๋ก ์ฃผ๋ฌธ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ก์ง์ด๋ผ๊ณ ๊ฐ์ ํด๋ณด์.
emit()์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
- Kafka ์ ์ก์ ์คํจํ์ง๋ง ์ฃผ๋ฌธ์ ์ด๋ฏธ โ๋ฐํ ์๋ฃโ ์ํ๋ก ๋ณ๊ฒฝ๋จ
- ์ดํ ์ฌ์๋ ๋์์์๋ ์ ์ธ๋จ
์ฆ, ์ ์ก ์คํจ๋ฅผ ์ธ์งํ์ง ๋ชปํ ์ฑ ์ํ๋ง ์์ ๋๊ฐ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
import { lastValueFrom } from 'rxjs';
await lastValueFrom(this.client.emit(topic, payload));
order.setPublished();์ด๋ฐ ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ด emit()์ ๊ฒฐ๊ณผ๋ฅผ ๋ช ์์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ ์์ ํ๋ค.
๋ค๋ง, ํ ๊ฐ์ง๋ ๋ถ๋ช ํ ์ง๊ณ ๋์ด๊ฐ์ผ ํ๋ค. emit()์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค๊ณ ํด์ ์ปจ์๋จธ์ ์ฒ๋ฆฌ ์ฑ๊ณต๊น์ง ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋ค.
5. send vs emit โ ์ฐ๋ฆฌ๋ ์ emit์ ์ ํํ์๊น?
emit()์ ๊ฒฐ๊ณผ๋ฅผ await ํ๋ค๊ณ ํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฐ ์ง๋ฌธ์ด ๋ ์ค๋ฅธ๋ค.
โ๊ทธ๋ ๋ค๋ฉด send()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ ์ ์ ํ์ง ์์๊น?โ
send()์ emit()์ ๋ชจ๋ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ API์ฒ๋ผ ๋ณด์ด์ง๋ง, ๋ ๋ฉ์๋๋ ์ ํ ๋ค๋ฅธ ํต์ ๋ชจ๋ธ๊ณผ ์๋๋ฅผ ์ ์ ๋ก ํ๋ค.
send()๋ ์๋ ์๋น์ค์ ์ฒ๋ฆฌ๋ฅผ ์ ์ ๋ก ํ request-response ๋ฐฉ์์ ํต์ ์ด๋ค.
const result = await this.client.send(pattern, payload);์ด ๋ฐฉ์์์๋,
- ์์ฒญ์ ๋ณด๋ธ ์ชฝ์ด ์๋ ์๋น์ค์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๊ณ
- ๊ทธ ์๋ต์ ๊ธฐ์ค์ผ๋ก ๋ค์ ๋ก์ง์ ๊ฒฐ์ ํ๋ค.
์ฆ, ๋ ์๋น์ค๋ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ค.
๋ฐ๋ฉด emit()์ ์๋ต์ ๊ธฐ๋ํ์ง ์๋ event-driven ๋ฐฉ์์ ํต์ ์ด๋ค.
this.client.emit(topic, payload);emit()์,
- โ์ด๋ค ์ผ์ด ๋ฐ์ํ๋คโ๋ ์ฌ์ค์ ์๋ฆด ๋ฟ
- ๋๊ฐ ์ด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ง๋ ์์ง ๋ชปํ๊ณ
- ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์ญ์ ์ ํ์๊ฐ ์๋ค
์ด ์ฐจ์ด๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ DDD ๊ด์ ์์ ๋์ฑ ๋ช ํํด์ง๋ค. ์ด๋ฒคํธ๋ โ๋ค๋ฅธ ์ปจํ ์คํธ๊ฐ ์์์ผ ํ ์ฌ์คโ์ ์ ๋ฌํ๋ ์ญํ ์ด์ง, โ๋ฌด์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋ผ๊ณ ์ง์ํ๋ ๋ช ๋ นโ์ด ์๋๋ค.
SNS ๋ง์ผํ ์ฃผ๋ฌธ ์ด๋ฒคํธ ์ญ์ ๋ง์ฐฌ๊ฐ์ง์๋ค. ์ฃผ๋ฌธ ์๋น์ค๋ โ์ฃผ๋ฌธ์ด ์์ฑ๋์๋คโ๋ ์ฌ์ค์ ์๋ฆด ๋ฟ, ์ฒ๋ฆฌ๋ฅผ ๋๊ฐ ๋ด๋นํ ์ง, ์ธ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ ๊ฐ๊ฐ์ ์ปจํ ์คํธ(์ฌ๋ด ์๋ฒ ํน์ ์ธ๋ถ ๊ณต๊ธ์)์ ์ฑ ์์ด๋ค.
์ด๋ฐ ์ํฉ์์ send()๋ฅผ ์ฌ์ฉํ๋ฉด ์ฃผ๋ฌธ ์๋น์ค๋ ์์ฐ์ค๋ฝ๊ฒ ๋ค๋ฅธ ์๋น์ค์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๊ณ , ์ํคํ ์ฒ๊ฐ ์์ฐ์ค๋ฝ๊ฒ request-response ํํ๋ก ๊ธฐ์ธ ๊ฐ๋ฅ์ฑ๋ ์๊ธด๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฅผ ํผํ๊ณ ์ถ์๋ค.
๊ทธ๋์ ์ ํํ ๋ฐฉ์์ด emit()์ ์ฌ์ฉํ๋, ํ์ํ ๋๋ง ์ ์ก ๊ฒฐ๊ณผ๋ฅผ await ํ๋ ๊ตฌ์กฐ์๋ค.
์ด ๋ฐฉ์์
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์
- ์ต์ํ์ ์ ์ก ์ฑ ์๋ง ํ์ธํ๊ณ
- ์ดํ์ ์ฒ๋ฆฌ๋ ๊ฐ ์ปจํ ์คํธ์ ์์ํ ์ ์๊ฒ ํด์ค๋ค
emit() + await๋ send()๋ฅผ ๋์ฒดํ๊ธฐ ์ํ ์ ํ์ด๋ผ๊ธฐ๋ณด๋ค๋, ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์ ์ฑ ์ ๊ฒฝ๊ณ๋ฅผ ์กฐ๊ธ ๋ ๋ถ๋ช ํ ํ๊ธฐ ์ํ ์ ํ์ ๊ฐ๊น์ ๋ค.
๐ค Understanding
์ง๊ธ๊น์ง ์ดํด๋ณธ ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
| ๊ตฌ๋ถ | emit() | emit() + await | send() |
|---|---|---|---|
| ๋ฉ์์ง ์ ๋ฌ ๋ฐฉ์ | Event-driven | Event-driven | Request-response |
| ์๋ต ๊ธฐ๋ | โ | โ | โญ |
| await ์๋ฏธ | ์ฌ์ฉํ์ง ์์ | ์ ์ก ์คํจ ์ฌ๋ถ ํ์ธ | ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์์ |
| ์ ์ก ์ฑ๊ณต ์๋ฏธ | ๋ฐํ ์๋ | ์ ์ก์ด ์๋ฌ ์์ด ์๋ฃ๋จ | ์๋ ์๋น์ค ์ฒ๋ฆฌ ์๋ฃ |
| ์ปจ์๋จธ ์ฒ๋ฆฌ ๋ณด์ฅ | โ | โ | โญ |
| ์๋น์ค ๊ฐ ๊ฒฐํฉ๋ | ๋ฎ์ | ๋ฎ์ | ๋์ |
| DDD ๊ด์ | Domain / Integration Event | Domain / Integration Event | Command |
| ์ถ์ฒ ์ฌ์ฉ์ฒ | ๋ก๊ทธ, ์๋ฆผ, ํต๊ณ | ์ํ ๋ณ๊ฒฝ์ด ์๋ฐ๋๋ ์ด๋ฒคํธ | ๋๊ธฐ ์ฒ๋ฆฌ ํ์ ์ |
์ด ํ์์ ๋ณด๋ฏ, await๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ฉ์์ง ์ ๋ฌ ๋ฐฉ์ ์์ฒด๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ ์๋๋ค. emit() + await ์ญ์ ์ฌ์ ํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐฉ์์ด๊ณ , ์ฐ๋ฆฌ๊ฐ ํ์ธํ๋ ์ฑ ์์ ๋ฒ์๋ง ์กฐ๊ธ ๋ฌ๋ผ์ง ๋ฟ์ด๋ค.
Kafka ๊ธฐ๋ฐ์ ์ด๋ฒคํธ ๋ฐํ์์ โ๋ฉ์์ง๋ฅผ ๋ณด๋๋คโ๋ ํํ์ ์๊ฐ๋ณด๋ค ์ฌ๋ฌ ์ํ๋ฅผ ํฌํจํ๊ณ ์๋ค.
- emit()์ ๋จ์ํ ํธ์ถํ๋์ง,
- emit()์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ ธ๋์ง,
- ํน์ send()๋ฅผ ์ ํํ๋์ง์ ๋ฐ๋ผ
ํ์ธํ ์ ์๋ ๋ฒ์์ ์ฑ ์์ ๋ฌด๊ฒ๋ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๋ค.
์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ์์ ๋ฉ์์ง๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํด ๋ฌ๋ผ๋ ์์ฒญ์ด๋ผ๊ธฐ๋ณด๋ค๋, ์ด๋ค ์ผ์ด ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ์๋ฆฌ๋ ์ชฝ์ ๊ฐ๊น๋ค.
์ฐ๋ฆฌ ํ์ ์ด ์ฌ์ค์ ์ ๋ฌํ๋ ์ญํ ๊น์ง๋ง ๋งก๊ณ , ๊ทธ ์ดํ์ ์ฒ๋ฆฌ๋ ๊ฐ ์ปจํ ์คํธ์ ์์ฐ์ค๋ฝ๊ฒ ๋งก๊ธฐ๊ณ ์ถ์๋ค. ๊ทธ๋์ send()๋ณด๋ค๋ emit()์ ์ ํํ๊ณ , ์ํ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ์ ์ก ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ๋ ํ์ธํ๋ ๋ฐฉ์์ ํํ๋ค.
์ด ๊ธ์ด Kafka์ NestJS๋ฅผ ์ฒ์ ์ ํ๋ ๊ฐ๋ฐ์์๊ฒ๋ ์ ์ก์ ์๋ฏธ๋ฅผ ํ ๋ฒ์ฏค ์๊ฐํด๋ณด๋ ๊ณ๊ธฐ๊ฐ ๋๊ณ , ์ด๋ฏธ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ํ์๊ฒ๋ ๊ฐ์์ ์ ํ์ ๋์๋ณด๋ ์ฐธ๊ณ ์๋ฃ ์ ๋๊ฐ ๋๋ฉด ์ข๊ฒ ๋ค.