해당 글은 개인적으로 공부하면서 기록하는 글로써 잘못된 점이나 보충할 점이 있다면 많은 댓글 부탁드립니다~
Nest.js에서의 소켓은 어떻게 다루는지 그리고 공부하다가 느꼈던 궁금했던 점들을 간단하게 정리해봅니다.

❓Gateway가 뭔가요??
HTTP요청을 @Controller가 처리하듯, 실시간 통신은 @WebSocketGateway가 처리한다
클라이언트와 서버 사이의 '관문' 역할을 한다
당연히 기능이 여러개면 컨트롤러도 여러개가 존재하듯 게이트웨이도 여러개가 존재 할 수 있다.
✅🌀SubscribeMessage() 데코레이터
@SubscribeMessage() 는 클라이언트가 명시적으로 보낸 이벤트들을 리스닝하는 데코레이터다
@SubscribeMessage('이벤트명')
handleEvent((@MessageBody() data: string): string{
return data;
}
✅소켓 연결🔗과 해제⛓️💥는 어떻게 하죠?
OnGatewayConnection, OnGatewayDisconnection
이 두 메서드는 NestJS가 제공하는 특별한 인터페이스로써 클래스에 implements 하면
NestJS가 "아 이 클래스는 클라이언트가 연결/연결해제 될 때 뭔가 특별한 일을 하고 싶어 하는구나" 라고 인식한다.
그리고 자동으로 handleConnection 메서드를 찾아서 실행시켜준다.
import { OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Socket } from 'socket.io';
export class EventsGateway implements OnGatewayConnection, OnGatewayDisconnect {
handleConnection(client: Socket){
console.log(`Client connected: ${client.id}`);
}
handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
}
}
✅handleConnection(client: Socket)
문득 이런 생각이 들었다, 여기서 client는 어떻게 클라이언트 정보를 가지고 있나?
handleConnection함수는 클라이언트가 연결에 성공했을 때 NestJS 프레임워크가 '자동으로' 호출해주기 때문에
이때 NestJS는 방금 연결된 실제 클라이언트의 모든 정보를 담고 있는 Socket객체를 만들어서 이 함수의 첫 번째 인자로 넣어준다.
그래서 client: Socket으로 타입을 지정해주는것은 "client 에 Socket타입의 객체가 들어올거야" 라는 약속이고,실제 고유 ID를 가진 객체는 런타임에 NestJS가 직접 전달해준다.
✅ @WebSocketServer()
@WebSocketServer() 는 Nestjs 로부터 Nestjs가 관리하는 순수한 socket.io 서버 객체를 요청하는 데코레이터로
게이트웨이의 메서드만으로 할 수 없는 더 강력한 기능을 사용하기 위함이다.
예를 들어
- 모든 클라이언트에게 메세지 보내기(broadcasting) this.server.emit(...)
- 특정 방에 메세지 보내기 this.server.to.('room-name').emit(...) 등이 있다.
✅ 소켓의 room 기능
클라이언트를 그룹 채팅방처럼 특정 방에 참여시키고 싶다면
join을 사용하여, 서버는 그 클라이언트를 해당 방에 참여시킨다.
특정 방에만 메세지를 보내고 싶다면 to를 사용해서 보낸다
방 생성 및 참여
예를 들어보자
client.join(roomName)을 호출하면 roomName에 해당하는 방이 존재하지 않으면 새로 만들고 클라이언트를 참여시킨다.
만약 이미 존재한다면 그 방에 참여시킨다
이때 생성된 방의 정보는 어디에 저장될까?
생성된 방과 참여자 정보는 기본적으로 socket.io 서버의 메모리에 저장된다.
서버 내부적으로는 대략 이런식으로 관리된다.
{
"room-123": ["socketId-abc", "socketId-def"],
"room-456": ["socketId-xyz"]
}
추후에 내용 추가 예정입니다
'Framework > nestjs' 카테고리의 다른 글
| [Nest.js] Entity란? (2) | 2025.07.10 |
|---|---|
| [Nest.js] DTO란? (0) | 2025.07.07 |