서버

웹RTC 미디어 서버의 RESTful API 설계

JohnnyDeveloper 2024. 6. 19. 18:29

웹RTC(Web Real-Time Communication) 기술을 활용한 실시간 화상회의 시스템에서 우리는 Media Server를 운영하고 있습니다. Media Server는 Node 환경에서 WebSocket을 이용해 실시간 미디어 처리를 담당하고 있으며, 클라이언트는 이 서버와의 통신을 통해 녹화 파일 데이터를 요청하고 있습니다. 이 블로그에서는 클라이언트가 녹화 파일을 효율적으로 가져가기 위한 RESTful API를 어디에 배치할지에 대한 고민과 해결 과정을 공유하려 합니다.

문제 상황: RESTful API 배치 고민

기존 미디어 서버에 RESTful API를 추가할지, 아니면 새로운 서버를 구성할지에 대한 결정이 필요했습니다. 각 방법의 장단점을 분석해보았습니다.

1. 기존 미디어 서버에 RESTful API 추가

장점

  • 간편한 통합: 추가적인 인프라 구성 없이, 현재 시스템 내에서 빠르게 구현 가능합니다.
  • 단순한 관리: 모든 기능이 한 서버에 집중되어 있어 관리가 일원화됩니다.

단점

  • 성능 저하 우려: WebSocket을 통해 실시간 미디어 스트림을 처리하는 미디어 서버에 추가로 RESTful 요청을 처리하면, 트래픽이 증가할 경우 성능이 저하될 가능성이 큽니다.
  • 확장성 부족: 하나의 프로세스에서 모든 요청을 처리하기 때문에 확장성이 떨어집니다. 특히, 트래픽이 급증할 경우 병목 현상이 발생할 수 있습니다.

2. 새로운 서버로 RESTful API 구성

장점

  • 모듈화: API가 독립적인 서버에서 동작하므로 소스 코드가 모듈화되고, 유지보수가 용이합니다.
  • 확장 용이: 필요에 따라 API 서버만 독립적으로 확장할 수 있어, 성능 관리가 쉽습니다.
  • 보안 강화: API 서버와 미디어 서버를 분리함으로써 각 서버에 대한 접근 제어를 독립적으로 설정할 수 있습니다.

단점

  • 리소스 관리: 추가 서버가 필요하므로, 리소스 할당과 관리가 필요합니다. 이는 추가적인 오버헤드가 발생할 수 있음을 의미합니다.
  • 서버 간 통신: 서버 간의 통신이 필요할 경우, 추가적인 통신 계층을 고려해야 합니다. 하지만 이번 경우 녹화 정보가 파일로 저장되므로 서버 간 통신에 대한 부담이 크지 않을 수 있습니다.

서버 구성 환경: Node.js vs. Spring

Node.js

Node.js는 비동기 이벤트 기반의 I/O를 제공하여 파일 입출력 작업에 효율적입니다. 기존 미디어 서버가 Node.js 환경에서 운영되고 있기 때문에, 동일한 기술 스택을 유지하는 것이 통합성과 성능 면에서 유리할 수 있습니다.

Spring

Spring은 자바 기반의 웹 애플리케이션 프레임워크로, 다양한 엔터프라이즈급 기능을 제공하지만, 파일 I/O 작업에서는 Node.js보다 성능이 떨어질 수 있습니다.

결론: 새로운 API 서버 구성의 장점

미디어 서버와 별도로 새로운 RESTful API 서버를 구성하는 것이 더 효율적입니다. 이는 확장성과 유지보수 측면에서 장점이 크며, 성능 관리에도 유리합니다. 특히, 모듈화된 코드와 독립적인 서버 운영을 통해 API 트래픽 증가에도 유연하게 대처할 수 있습니다.

추천 구성

  1. 기술 스택: Node.js를 선택하여 동일한 기술 스택을 유지함으로써 개발 속도를 높이고, 통합 작업을 간소화합니다.
  2. API 서버 구성: RESTful API 서버를 별도로 구축하여, 미디어 서버와의 의존성을 최소화합니다. API 서버는 HTTP/2를 활용해 효율적인 통신을 지원하고, 확장 가능한 구조로 설계합니다.
  3. 보안: 두 서버 간의 통신에 대해 SSL 인증서를 사용해 보안을 강화하고, IP 필터링 및 인증 토큰을 활용해 불법적인 접근을 차단합니다.
  4. 모니터링 및 관리: API 서버와 미디어 서버의 상태를 지속적으로 모니터링하여, 문제 발생 시 빠르게 대처할 수 있는 자동화된 알림 시스템을 구축합니다.

추가 고려 사항

  • 로드 밸런싱: API 서버 트래픽이 증가할 경우, 로드 밸런서를 활용해 부하를 분산시킵니다.
  • 캐싱 전략: 자주 요청되는 데이터를 캐시하여 API 응답 속도를 향상시킵니다.
  • 자동화 배포: CI/CD 파이프라인을 구축해 코드 변경 사항을 자동으로 배포하고, 배포 과정에서의 오류를 최소화합니다.