2025년 2월 18일

김동환·2025년 2월 18일
0

TIL (Today I Learned) - 2025년 2월 18일

NestJS 웹소켓을 활용한 마피아 게임의 밤 결과 및 공지 시스템 구현

오늘은 마피아 게임의 밤 결과 및 다양한 공지를 실시간으로 전파하는 시스템을 구현했다. 이를 위해 WebSocketGateway를 활용한 게이트웨이(NightResultGateway)와 이를 관리하는 서비스(NightResultService)를 만들었다.


1. NightResultGateway (게이트웨이)

역할: 클라이언트에게 밤 결과 및 공지 메시지를 실시간으로 전달

  • @WebSocketGateway({ namespace: '/game' }) 데코레이터를 사용하여 '/game' 네임스페이스에 속한 웹소켓 게이트웨이를 생성

  • @WebSocketServer() server: Server; 를 통해 socket.io 서버 인스턴스를 주입받음

  • broadcastNotice(roomId, type, message, additionalData?) 메서드를 통해 특정 방(roomId)에 속한 모든 클라이언트에게 이벤트(ROOM:NIGHT_RESULT)를 전파

    예제 코드:

this.server.to(roomId).emit('ROOM:NIGHT_RESULT', payload);

이 방식으로 방에 속한 모든 유저에게 특정 유형(type)의 공지를 보낼 수 있음


2. NightResultService (서비스)

역할: 게임의 각 단계(밤 결과, 낮 시작, 경찰/의사/마피아 행동 등)에 따라 공지를 생성하고 NightResultGateway를 통해 클라이언트에게 전파

밤 결과 전파 (announceNightResult)

  • 밤 동안 발생한 사건 결과를 Redis에 저장 후, NightResultGateway를 사용해 클라이언트에게 전송

  • night_result:${roomId}:${nightNumber} 형식의 Redis 키를 사용해 1시간(3600초) 동안 저장

    예제 코드:

const key = `night_result:${roomId}:${nightNumber}`;
await this.redisService.setToken(key, JSON.stringify(payload), 3600);

this.nightResultGateway.broadcastNotice(
  roomId,
  'night_result',
  message,
  { nightNumber, result },
);

낮 시작 공지 (announceDayStart)

  • 낮이 되었습니다. {dayNumber}번째 낮 메시지를 생성하여 broadcastNotice로 전송

    예제 코드:

this.nightResultGateway.broadcastNotice(
  roomId,
  'day_start',
  message,
  { dayNumber },
);

기타 공지

  • announceGameRestart(roomId): 게임 재시작 공지

  • announcePoliceAction(roomId, userId): 경찰 능력 사용 공지

  • announceDoctorAction(roomId, savedUserId): 의사 치료 공지

  • announceMafiaAction(roomId, targetUserId): 마피아 공격 공지

  • announceMorning(roomId, morningNumber): 아침 시작 공지

    예제 코드 (마피아 공격 예시):

this.nightResultGateway.broadcastNotice(
  roomId,
  'mafia_action',
  message,
  { targetUserId },
);

오늘의 배운 점

  1. NestJS의 WebSocketGateway를 활용하면 실시간 게임 이벤트를 효과적으로 클라이언트에 전달할 수 있다.
  2. Redis를 활용해 게임 데이터를 캐싱하면, 방에 새로 참여하는 유저도 이전의 이벤트 정보를 조회할 수 있다.
  3. 객체 확장 연산자(...)를 활용하면 broadcastNotice에서 추가 데이터를 쉽게 전달할 수 있다.

다음 할 일

  • 공지 시스템이 잘 작동하는지 클라이언트에서 테스트
  • 마피아 게임의 투표 시스템과 연동하여 밤/낮 이벤트가 자동으로 진행되도록 구현

오늘은 웹소켓 기반으로 실시간 게임 알림을 관리하는 구조를 만들었다. 앞으로는 이를 좀 더 확장해서 투표 시스템과 연동하는 작업을 진행할 예정이다!

profile
Node.js 7기

0개의 댓글

관련 채용 정보