nest에 socket.io

내부 프로젝트에는 대기실과 같은 기능과 게임 서버와 같은 게임방이 필요했기 때문에 이러한 기능을 위해 소켓 기능을 채택했습니다.

6명이서 하는 취미로 캐치마인드를 만들기 위해 웹소켓 기술만 사용했습니다. 그걸로 충분한지 궁금해

먼저 nest.js를 기반으로 소켓 서버를 시작합니다.

nest new project-name

nest 명령을 사용하여 기본값을 설치합니다.

npm i @nestjs/websockets socket.io

socket.io 및 nestjs/websocket을 설치합니다.

src 폴더에 소켓용 모듈 폴더를 만들고 Go에서 socket.module.ts 및 socket.gateway.ts 파일을 만듭니다.

nestjs와 socket.io에 대한 글을 몇 개 읽어봤는데 nestjs에서 socekt.io를 사용할 때 동적 네임스페이스 지원 등의 문제가 있고 대부분 그냥 쓰라고 말하는 것 같고 대신 게이트웨이를 사용해야 한다고 합니다. 하지만 처음 하는 일이라 nestjs를 게이트웨이로 해서 접속을 해야 합니다.

@WebSocketGateway({
  namespace: 'localLobby',
  cors: {
    origin: ('http://localhost:3000'),
  },
})
export class gameLobbyEventGateway
  implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect
{
  @WebSocketServer() nsp: Namespace; // 네임스페이스 타입선언

  afterInit() {}// 초기화 이후에 실행되는 함수

  handleConnection(@ConnectedSocket() socket: Socket) {}
  handleDisconnect(@ConnectedSocket() socket: Socket) {}
  // 소켓이 연결되고 끊길때 실행되는 메소드들
}

하지만 아쉽게도 제가 만든 서비스는 로컬과 글로벌 두 개의 서버로 나뉩니다. 그러면 네임스페이스별로 분할하고 관리하는 것이 편리하겠지만 nest.js는 동적 네임스페이스를 지원하지 않기 때문에 두 개의 게이트웨이를 만드는 것 외에는 선택의 여지가 없습니다.

@wabSocketGateway가 호출되는 네임스페이스를 변경하여 다른 게이트웨이 파일을 만듭니다. 이제 함수를 구현해 봅시다. 내가 그랬어

아니, 생각해보면 게이트웨이 파일이 아무리 많아도 결국 두 웹소켓 서버가 같은 작업을 하게 될 것이 뻔하다. 그런 다음 게이트웨이 파일에 동일한 코드를 입력하고 기능을 변경하려면 두 파일을 모두 변경해야 합니다.

무의미한 말. 이것은 아니다

그래서 “nestjs 모듈인데도 js 클래스로 만들어졌으니 상속해서 사용하지 않을까?” 오전.

이러한 defaultGateway.ts 파일을 만듭니다.

export class DefaultGateway {
	@WebSocketServer() nsp: Namespace;
	serverType:string;
     
	constructor (type:string){
     	this.serverType = type;
	}
     
     ...
}

이전에 만든 게이트웨이 파일의 클래스를 확장합니다.

회사 다닐때 재밌게 봤는데 집에가서 쓸꺼라 기억이 안나서 여기까지만 하겠습니다.