Nest.js를 배워보자

💡 NestJS에서 Gateway란?

_Blue_Sky_ 2025. 12. 5. 12:54
728x90

NestJS에서 Gateway실시간 양방향 통신을 처리하기 위한 특별한 클래스입니다. 가장 흔하게는 WebSockets 기술을 사용하여 클라이언트(예: 웹 브라우저)와 서버 간의 지속적인 연결을 관리하고 데이터를 주고받는 역할을 합니다.

쉽게 말해, Gateway는 서버와 클라이언트 사이에서 "실시간으로 소식을 전달하는 문지기" 또는 "우체국" 같은 역할을 한다고 생각할 수 있습니다.


📬 왜 Gateway를 사용할까요? (일반적인 API와의 차이점)

일반적인 REST API는 클라이언트가 요청(Request)을 보내야만 서버가 응답(Response)을 보내는 단방향/요청-응답 방식입니다.

반면에 Gateway는 WebSockets을 사용하여 다음과 같은 이점을 제공합니다.

특징 REST API (Controller) Gateway (WebSocket)
통신 방식 요청-응답 (단발성) 양방향 (지속적 연결)
데이터 전송 클라이언트 → 서버 클라이언트 ↔ 서버
사용 사례 로그인, 데이터 조회/수정 실시간 채팅, 실시간 알림, 실시간 모니터링
  • 실시간성: Gateway를 사용하면 클라이언트의 요청 없이도 서버에서 능동적으로 새로운 데이터를 클라이언트에 푸시(Push)할 수 있습니다.
    • 예시 (주신 코드): 서버 상태(CPU, 메모리 등)가 변경될 때마다 서버가 2초마다 직접 클라이언트에게 새로운 상태 데이터를 전송(this.server.emit('serverStats', { ... }))하는 것이 바로 이 기능입니다.

🛠️ 주신 코드에서 Gateway의 역할 분석

주신 MonitoringGateway 코드를 통해 Gateway가 어떻게 동작하는지 더 자세히 알아볼 수 있습니다.

  1. 데코레이터 (@WebSocketGateway):
    • 이 클래스가 WebSocket 통신을 처리하는 Gateway임을 NestJS에게 알려줍니다.
    • { cors: { origin: '*' } } 옵션은 어떤 도메인의 클라이언트와도 연결을 허용하도록 설정합니다.
  2. 서버 인스턴스 (@WebSocketServer):
    • @WebSocketServer() 데코레이터는 NestJS가 내부적으로 사용하는 WebSocket 라이브러리인 socket.io의 서버 인스턴스를 server 속성에 주입해 줍니다.
    • 이 server 객체를 통해 모든 연결된 클라이언트에게 메시지를 보낼 수 있습니다 (this.server.emit(...)).
  3. 초기화 후 실행 (afterInit):
    • afterInit() 메서드는 Gateway가 완전히 초기화된 후에 한 번 실행됩니다.
    • 여기서 setInterval을 사용하여 2초마다 서버의 CPU, 메모리 등의 상태를 계산하고, 이 데이터를 'serverStats' 이벤트 이름으로 모든 연결된 클라이언트에게 전송합니다.
  4. 연결 해제 처리 (handleDisconnect):
    • 연결이 끊어졌을 때(혹은 서버가 종료될 때) 불필요한 자원 낭비를 막기 위해, 설정했던 2초 간격의 타이머(this.interval)를 정리(clearInterval)합니다.

결론적으로, MonitoringGateway는 서버의 상태를 주기적으로 계산하고, WebSockets을 통해 실시간으로 클라이언트에게 푸시하는 핵심적인 역할을 수행하고 있는 것입니다.

728x90