Skip to content

๐Ÿชต 2. WebSocket ์„œ๋ฒ„

ssum1ra edited this page Dec 5, 2024 · 1 revision

NestJS WebSocket ์„œ๋ฒ„ ๊ตฌ์ถ•

1. @WebSocketGateway ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

@WebSocketGateway๋Š” NestJS์—์„œ WebSocket ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ด๋‹ค. ์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค๋ฅผ WebSocket ์„œ๋ฒ„์˜ ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด WebSocket ์—ฐ๊ฒฐ ๋ฐ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP ์„œ๋ฒ„์™€ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

@WebSocketGateway({
  cors: '*',
  namespace: '/socket.io/game',
})
  • cors: CORS ์„ค์ •์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ WebSocket ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • namespace: WebSocket์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ WebSocket ์—ฐ๊ฒฐ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด /socket.io/game ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๊ฒŒ์ž„ ๊ด€๋ จ ํด๋ผ์ด์–ธํŠธ๋“ค๋งŒ ์—ฐ๊ฒฐ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. @SubscribeMessage ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

@SubscribeMessage๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ด๋‹ค. ๊ฐ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

@SubscribeMessage('joinRoom')
async handleJoinRoom(@ConnectedSocket() client: Socket, @MessageBody() data: { roomId: string }) {
  // handle joining room
}
  • 'joinRoom': ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ 'joinRoom'์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • @ConnectedSocket() client: ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ์†Œ์ผ“ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • @MessageBody() data: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ, ๋ฉ”์‹œ์ง€์˜ ๋ณธ๋ฌธ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

3. ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

WebSocket ์„œ๋ฒ„์—์„œ๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

  • emit: ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, client.to(roomId).emit('playerJoined', ...)๋Š” ํŠน์ • ๋ฃธ์— ์†ํ•œ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ 'playerJoined' ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • on: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. @SubscribeMessage ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ๊ทธ ์—ญํ• ์„ ํ•œ๋‹ค.

4. OnGatewayDisconnect ์ธํ„ฐํŽ˜์ด์Šค

OnGatewayDisconnect ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ์˜ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š์—ˆ์„ ๋•Œ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒํƒœ๋ฅผ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

export class GameGateway implements OnGatewayDisconnect {
  async handleDisconnect(client: Socket) {
    // ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ
  }
}

๐Ÿ˜Ž ์›จ๋ฒ ๋ฒ ๋ฒ ๋ฒฑ

๐Ÿ‘ฎ๐Ÿป ํŒ€ ๊ทœ์น™

๐Ÿ’ป ํ”„๋กœ์ ํŠธ

๐Ÿชต ์›จ๋ฒ ๋ฒฑ ๊ธฐ์ˆ ๋กœ๊ทธ

๐Ÿช„ ๋ฐ๋ชจ ๊ณต์œ 

๐Ÿ”„ ์Šคํ”„๋ฆฐํŠธ ๊ธฐ๋ก

๐Ÿ“— ํšŒ์˜๋ก

Clone this wiki locally