소마 프로젝트 진행하면서 실시간 통신이 필요한 아이디어가 제시되었고, 그에 관하여 WebSocket과 WebRTC가 있어서 자세히 알아보기로 하였다.
두가지 모두 웹 기반 실시간 통신이 가능하게 해주는 방법이라는 공통점이 있지만 완전히 다른 차이점이 존재한다!

WebSocket은 HTML5 표준 프로토콜로 HTTP을 한 번의 HandsShake 과정을 통해 연결하여 클라이언트와 서버 간 Full-duplex 통신 채널을 유지하는 방식이다.
주요 특성으로는 아래와 같이 있다.

WebRTC는 웹 브라우저와 장치 간 플러그인 없이 실시간 스트리밍을 지원하는 오픈 소스 프로젝트이다. 기본적으로 P2P 연결을 기반으로 미디어 스트림이나 데이터 채널을 직접 교환할 수 있다.
주요 특성으로는 아래와 같이 있다.
가장 큰 방식은 WebSocket은 HTTP 핸드셰이크 후 TCP 소켓 위에서 프레임 기반 통신을 유지하는 반면 WebRTC는 SDP와 ICE를 통해 피어 간에 직접 암호화된 UDP 스트림을 주고받는다.
그 결과, WebRTC는 P2P 통신으로 실시간 오디오 및 비디오 상호작용에 적합하고, WebSocket은 클라이언트-서버 통신에 중점으로 채팅 및 라이브 피드 업데이트와 같이 지속적인 데이터 교환에 적합하다. 특히 서버 중간에 작업이 필요하면 WebSocket을 이용해야한다!
STOMP 방식의 WebSocket은 Spring 에서 비교적 사용이 간단한다.
(STOMP란 Simple text Oriented Messaging Protocol로 메시징-Pub-Sub 기능을 손쉽게 구현하기 위한 프로토콜이다!)
Spring 에서 구현은 @EnableWebSocketMessageBroker 어노테이션을 통해 사용 가능하며, 스프링의 내장 메시지 브로커 관리를 통해 사용 가능하다.
반면 WebRTC는 보다 복잡한데, 시그널링을 위해서 다양한 파트를 사용 가능하지만 웹소켓을 통해서도 할 수 있다! 정확히 정해진 방법이 없기 때문에다. 백엔드는 여기서 메타데이터를 중계하는 인프라 역할만 하게 되며 프론트엔드에서 실제 P2P 연결, 미디어나 데이터 처리 등을 구현하게 된다.
나는 항상 지속 연결을 하면 WebSocket만 생각했는데, 이번 프로젝트를 위해 찾아보면서 WebRTC라는 개념에 대해서도 알게 되었다. 이를 잘 상의하고 적절한 기능 테스트를 통해 어떤 방법이 적합한지는 실제 테스트를 통해 알아봐야겠다!
참고자료
https://apidog.com/kr/blog/webrtc-vs-websocket-3/
https://getstream.io/blog/webrtc-websockets/
https://infinitecode.tistory.com/85
https://ably.com/topic/webrtc-vs-websocket