왜 API로 만들면 안 되나요? 🚫

  1. 보안 위험 (Security):
  2. 상태 불일치 (State Mismatch):
  3. 역할의 문제:

그럼 언제 청소하나요? (자동화 시점) 🤖

서버는 다음 두 가지 상황에서 자동으로 청소 로직을 돌려야 합니다.

상황 A: "마지막 사람"이 나갈 때 (가장 중요)

방에 5명이 있다가 4명이 나가고, 마지막 1명이 disconnect 하거나 leaveRoom을 했을 때, 서버는 스스로 판단해야 합니다.

"어? 방금 나간 놈이 마지막이네? 그럼 이제 Mediasoup Router 닫고 메모리 비우자."

상황 B: "방장"이 '모임 종료'를 눌렀을 때

방장이 강제로 방을 폭파하는 기능이 있다면, 이때는 room:close 같은 비즈니스 로직 API를 호출하고, 그 내부에서 청소 메서드를 실행합니다.

코드 구현: 이렇게 만드세요 (Nest.js)

cleanup은 API가 아니라 Service 내부의 Private Method여야 합니다.

// voice.gateway.ts (게이트웨이)
@SubscribeMessage('voice:leave')
async handleLeave(@ConnectedSocket() client: Socket) {
  // 1. 유저 리소스 정리 (Transport, Producer, Consumer 닫기)
  this.voiceService.removePeer(client.data.roomId, client.data.userId);

  // 2. ⭐️ 자동 청소 트리거 ⭐️
  // 유저가 떠난 후 방이 비었는지 체크합니다.
  if (this.voiceService.isRoomEmpty(client.data.roomId)) {
    // 3. 방이 비었으면 방 전체 리소스 정리 (Router 닫기)
    this.voiceService.closeRoom(client.data.roomId);
    console.log(`방(${client.data.roomId})이 비어서 삭제했습니다.`);
  }
}