NestJs에서 RabbitMQ를 적용한 레퍼런스가 많지 않습니다.
이전에 MSA(MicroService Architecture)를 구축했었기에, 금방할거라 생각했지만 꽤 걸렸네요.
두 글에 걸쳐서 적용하는 과정을 공유하려 합니다
NestJs는 microservice 기능을 제공한다. http단계를 넘어 transport단계까지 아우를수 있다고 한다.
*transport 수단으로 RabbitMQ를 사용한다 이해하면 좋다
https://docs.nestjs.com/microservices/basics
보통 프레임워크에서 제공하는 부가기능은 그냥 가져다 쓰면 됐다. 코드로 밟아야할 절차를 제공해 클론코딩이 가능했고, 용어들에 혼선이 와도 일단 가능했다.
문제는 NestJs-RabbitMQ는 그렇지 않다는거....
* NestJs의 RMQ는 nodJs의 RMQ에서 message emit시 필수가 아닌 pattern이 필수다.
여러번의 시도 끝에 아래와 같은 구조가 잡혔다.
0. hybrid application
웹 서버가 아닌 서비스 서버면 microservice기능을 그대로 쓰면 된다.
그러나 웹 서버에서 서비스 서버로 메세지 큐를 날리고 싶었고, 어떡하지 찰나에 문서 구석에 아래 정보가 있었다.
*여기서 웹서버는 동적 웹서버 express로 이해하시는게 좋을듯합니다
https://docs.nestjs.com/faq/hybrid-application#hybrid-application
1. main.ts에서 microservice start
const app = await NestFactory.create(AppModule);
//추가된 코드
const microservice = app.connectMicroservice<MicroserviceOptions>({
transport: Transport.TCP,
});
//추가된 코드
await app.startAllMicroservices();
await app.listen(3001);
기존 http서버 띄우는 코드에서 두줄이 추가가 됐다. 연결할 microservice를 설정한후, startAllMicroservices를 실행한다
2. module에서 import
// module import
@Module({
imports: [
ClientsModule.register([
{ name: 'MATH_SERVICE', transport: Transport.TCP },
]),
]
...
})
사용할 transport(TCP, RMQ...)와 name을 설정후 등록한다.
3. Inject(name)으로 접근
// constructor내에서 선언
@Inject("name") private rmqClient: ClientProxy
controller or service에서 사용하려면, 모듈 Import시 설정한 name으로 Inject하면 된다.
대략적인 흐름을 다뤘다. 다음 글에서 실제 코드를 다룰것이다.
*코드가 깨지면 아래 링크를 참조해주세요
'개발 > 개발의 ㄱ' 카테고리의 다른 글
[NestJS] 사용할 메소드가 Promise인지? (0) | 2023.07.20 |
---|---|
[NestJs] Exception Error 처리 (0) | 2023.07.19 |
[NestJs]Instead change the require of index.js in /Users/user/Desktop/url-shorter/dist/url/url.service.js to a dynamic import() which is available in all CommonJS modules. (0) | 2023.07.17 |
[자료구조] hash, hash table, mapping table, bloom filter, bit map (0) | 2023.07.13 |
[NestJs] Redis with Docker (0) | 2023.07.11 |