최근에 NestJS로 프로젝트를 진행하면서 socket.io를 이용할 일이 있었다.
이 때 배웠던 것을 짤막하게 정리해보려 한다.
NestJS에서 지원하는 소켓의 플랫폼으로 ws와 socket.io 두 가지가 있다.
그리고 나는 이전에 웹 소켓이 독자적인 프로토콜(ws://)를 사용한 다는 것을 경험을 통해 알았기 때문에
socket.io를 사용한 웹 소켓 서버에도 무리 없이 클라이언트가 접속될 것이라고 생각하였다.
이전에 웹 소켓을 사용한 프로젝트에서 유용하게 쓴 툴이 있는데 WebSocket King Client이다 (크롬의 확장 프로그램이다)
그런데 웬걸, 연결이 되지 않는다
gateway와 모듈 설정에 문제가 없는지 확인해보았다.
// chat.gateway.ts
import {
ConnectedSocket,
MessageBody,
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
} from '@nestjs/websockets';
import { Socket, Server } from 'socket.io';
import { ChatService } from './chat.service';
import { ChatJoinSocketDto, ChatMessageSocketDto } from './dto/chat.dto';
@WebSocketGateway({
transport: ['websocket'],
namespace: '/',
cors: {
origin: '*',
},
})
export class ChatGateway {
// 생략
}
// chat.module.ts
// ... 생략
@Module({
// ... 생략
providers: [ChatService, ChatGateway],
exports: [ChatService],
controllers: [ChatController],
})
export class ChatModule {}
설정엔 분명 문제가 없었다.
이리저리 구글링도 해보고 그러다가 socket.io 공식문서를 들여다 보게 되는데..
결론은 웹 소켓 클라이언트로 socket.io 서버에 접속할 수 없다는 것이다.
socket.io는 패킷에 메타데이터를 부가적으로 추가한다고 한다.
이참에 웹 소켓과 socket.io가 어떻게 다른지 정리해보았다.
socket.io는 node.js 기반의 라이브러리이다.
아무래도 라이브러리이다 보니 패턴을 갖고 있어서 커스터마이징에는 불리한 측면이 있다.
하지만 websocket과는 다르게 room을 가지고 있고, 기본적으로 제공하는 기능이 websocket에 비하면 많다는 것 정도를 들 수 있겠다. (websocket 기반이긴 하지만 추상화가 되어 있다)
socket.io만의 차별적인 기능은 다음과 같다.
1. Acknowledgement (확인 응답을 통한 수신 확인)
2. Reconnection (연결이 끊어지면 자동으로 재연결 시도)
3. Broadcasting (다수의 클라이언트에게 전달)
위 기능은 socket.io 공식문서의 '여전히 socket.io가 필요한가?' 섹션에 정리되어 있다.
결론
공식문서를 잘 읽자....
'TIL' 카테고리의 다른 글
[TIL] 2024-09-19 (0) | 2024.09.19 |
---|---|
[TIL] 2024-09-12 (1) | 2024.09.12 |
[TIL] 2024-09-11 (0) | 2024.09.11 |
[내일배움캠프] 스타터 노트 (0) | 2024.09.11 |