오늘은 마피아 게임의 밤 결과 및 다양한 공지를 실시간으로 전파하는 시스템을 구현했다. 이를 위해 WebSocketGateway
를 활용한 게이트웨이(NightResultGateway)와 이를 관리하는 서비스(NightResultService)를 만들었다.
역할: 클라이언트에게 밤 결과 및 공지 메시지를 실시간으로 전달
@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)의 공지를 보낼 수 있음
역할: 게임의 각 단계(밤 결과, 낮 시작, 경찰/의사/마피아 행동 등)에 따라 공지를 생성하고
NightResultGateway
를 통해 클라이언트에게 전파
밤 동안 발생한 사건 결과를 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 },
);
낮이 되었습니다. {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 },
);
broadcastNotice
에서 추가 데이터를 쉽게 전달할 수 있다.오늘은 웹소켓 기반으로 실시간 게임 알림을 관리하는 구조를 만들었다. 앞으로는 이를 좀 더 확장해서 투표 시스템과 연동하는 작업을 진행할 예정이다!