• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Eventsgateway 인스턴스 다중으로 생성

21.09.08 17:12 작성 조회수 112

0

안녕하세요 

제로초님 강좌를 통해서 서비스 개발에 접목시키면서 정말 많은 도움 얻고 있고 너무 많이 배우고 있습니다.

일단 감사 말씀 먼저 드립니다 :)

 

제가 올려주신 코드와 거의 비슷한 구조로 채팅 기능을 구현중에 있는데요.

구현 중에 채팅 기능이 잘 동작하지 않아서 나름대로 해결법을 찾았는데 아마 이 부분은 저만 겪는 이슈가 아닐 듯 하여 글 남겨 봅니다.

 

- 현상 :

socket연결 정상, 'onlineList' 이벤트까지는 client에서 잘 받아오고 있으나

dm을 보내보면 client로 event가 전달되지 않는 현상입니다.

혹시 onlineMap에 제대로 리스트업이 되지 않은 것인가 싶어 로그를 찍어봐도 onlineMap까지는 각각의 socketid정보가 잘 등록되어 있었습니다.

- 해결 : 

제가 추측한 원인은 dm module, channel module에서 EventsGateway를 provider로 가져다 쓰고 있어서 이 때 별도로 instance화되고 이 것이 client와 연결되어있는 EventsGateway와 별개로 동작하면서 socket통신이 이루어지지 않은것으로 판단했습니다.

@Module({
  imports: [TypeOrmModule.forFeature([DMs, Users, Workspaces])],
  controllers: [DMsController],
  providers: [DMsService, EventsGateway],
})
export class DMsModule {}

( 로그 상 eventsgateway의 init로그가 gateway를 provider로 등록한  module수(app, dm, channel) 만큼 찍힘)

[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [InstanceLoader] WorkspacesModule dependencies initialized +0ms
[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [InstanceLoader] UsersModule dependencies initialized +0ms
[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [InstanceLoader] ChannelsModule dependencies initialized +1ms
[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [InstanceLoader] DMsModule dependencies initialized +0ms
init
init
init
[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [RoutesResolver] AppController {/}: +83ms
[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [RoutesResolver] UsersController {/api/users}: +0ms
[Nest] 68842  - 2021. 09. 08. 오후 5:06:46     LOG [RouterExplorer] Mapped {/api/users, GET} route +0ms

그래서 gateway를 직접 provider로 등록하는 방식이 아닌 EventsModule에서 gateway를 export하고 필요한 곳에서 EventsModule을 가져다 쓰는 방식으로 변경했더니 해결 되었습니다.

//events.module.ts
@Module({
  providers: [EventsGateway],
  exports: [EventsGateway],
})
export class EventsModule {}
//chat.module.ts
@Module({
  imports: [TypeOrmModule.forFeature([User, Chat, Room]), EventsModule],
  controllers: [ChatController],
  providers: [ChatService],
  exports: [ChatService],
})
export class ChatModule {}

아직 nestjs 초보라서 맞는지 확신까지는 들지 않는데 어쨌든 해결된 버전이어서 공유 드립니다.

혹시 위와 같이 처리하면 문제가 있거나 제가 뭔가 잘못 셋팅하여 발생한 이슈였을지 모르겠네요. 

보시면 검토 한번 해주시면 감사하겠습니다

 

그럼 좋은 하루 되세요 :)

 

답변 1

답변을 작성해보세요.

0

아, 제가 EventsModule을 import하는 대신 EventsGateway를 provider넣었네요. EventsModule을 만들어두고 정작 아무데도 사용하지 않았었네요.

EventsModule을 사용하는 게 맞습니다. 그래야 말씀하신대로 EventsGateway가 여러 번 new 되지 않습니다. provider에 EventsGateway를 넣으면 그 때마다 new 되어서 게이트웨이가 여러 번 생성되어 버립니다.

AppModule에서는 EventsModule을 빼시고, 진짜 쓰고 있는 Module에서 EventsModule을 임포트하시면 됩니다.

감사합니다. 이 부분은 아예 영상을 따로 찍어서 수정하도록 하겠습니다.

오종혁님의 프로필

오종혁

질문자

2021.09.08

넵 확인 감사합니다!