이번에는 핵심인 방 생성/참가 및 WebRTC 시그널링을 구현할 때 어려웠던 점들이나 했던 고민들을 서술해보려고 한다.
요구사항에서 최대 7명 정도의 인원이 N:M(다대다) 화상 회의를 진행할 수 있어야 한다고 명시되어 있었으므로 여러 고민들이 많았다. 대표적인 방식인 P2P 방식은 소수의 인원이나 1대1 정도의 화상회의에만 적합해서 필수적으로 Media Server를 활용해야 했다.
미디어 서버란 중계자라고 생각하면 편할 것이다
내가 했던 고민들은 다음과 같다.
- P2P, SFU, MCU 방식이 있다는데 어떤 방식을 채용해야 될까?
- SFU, MCU 방식을 선택하면 어떤 Media Server를 사용해야 할까?
- 내가 쌩으로 시그널링 로직들을 다 구현해야 되나?
- 시그널링에 필요한 API 명세 등 형식들은 어떻게 정해야 되지?
- 화상 회의 진행 시 DB에 어떤 것들을 저장해야 되지?
etc...
등등 여러 고민들이 많았다. 우선적으로 내가 택한 최적의 방식은 SFU 방식이었다. P2P는 클라이언트의 부담이 크고, MCU는 서버의 부담이 커서 그 중간인 SFU 방식이 제일 적절하다고 생각했기 때문이다.
SFU 방식으로 구현하려고 관련 정보들을 찾다 보니 여러 미디어 서버나 쉽게 구현할 수 있는 것들을 찾게 되었다.(Kurento Media Server, Openvidu 등등 이외에도 많지만 기억이 안난다...)
현재 프로젝트는 단순 화상 회의가 목적이 아니라 화상 회의를 통한 수업을 진행하고, 채팅, 실시간 이모지, 실시간 피드백 등 여러 부가 요소가 많아서 자유도가 낮은 Openvidu보단 Kurento Media Server를 통해 구현하기로 했다. (Kurento 공식 링크)
개발할때 Kurento와 Java를 사용한 국내 예제가 많이 없었고, 공식 홈페이지의 코드 설명은 매우 포괄적으로 간략하게 설명해 놓아서 처음에 어떻게 구현해야 될지 정말 막막했다.... 그리고 시그널링 과정에서 매우 짜잘한 오류가 많이 생긴다.. 그리고 오류가 나지 않는데 연결이 안되거나 알 수 없는 이유로 화상 연결이 안된다.. 그래서 Kurento를 안 쓰는게 맞나 싶었는데 그래도 우직하게 끝까지 영어로 된 것들도 찾아보면서 구현했다. 공식 github 코드도 10번 넘게 계속 보고 Kureneto로 구현한 다른 사람들 예제도 수도 없이 봤던 것 같다.
그리고 또 하나 어려웠던 점이 Sdp Offer나 Ice Candidate 교환을 할때 순서가 안 맞거나 어느 하나라도 안되면 연결이 안 되었었다.. Ice Candidate 같은 경우는 이벤트 리스너를 등록해서 메세지를 보내느 형식인데 한 사람이 연결할 때 30개 정도가 오고가니 7명이라 치면 약 200개 정도의 메세지가 매우 빠르게 오고 가서 동시성 문제나 동기화가 필수적이었다.
당시에 알아볼때는 힘들었던 점을 적으라하면 책 출간도 가능할거라 생각 했었는데 막상 다 구현하고 적으려니까 생각이 안난다..
chrome://webrtc-internals/ 그리고 이 사이트가 구글에서 제공하는 WebRTC 관련 통계를 보여주는 사이트인데 RTC 개발을 하시는 분들이라면 이 사이트가 연결 상태나 로그들을 보기에 꽤나 유용하니 참고하시면 좋을 것 같다.
주저리주저리 말이 길었는데 다음엔 로직들을 포스팅하겠다.