컴파일 구현 방법 ◦ 컴파일에 필요한 정보는 언어와 코드. 이를 기반으로 서버와 상호작용. ▪ req : { lang: “js”, code: “console.log(‘hi’)” } ▪ res : { output: “hi” } ◦ 단일 파일의 경우 해당 언어가 설정된 서버 환경에서 코드를 받아와서 실행하고 이를 결과로 리턴 ◦ 다중 파일의 경우 환경 설정이 연계되어야 해서 복잡해짐 • 오픈소스 및 클라우드 서비스 존재 ◦ Judge0 ▪ 오픈소스 ▪ 셀프 호스팅 및 유료 API 모두 지원 ▪ 루비 기반 ◦ Jdoodle
WebRTC • Peer to Peer 통신 • 브라우저간에 소켓을 여는 방법 • 주소를 어떻게 획득하는지는 정의되지 않음 ◦ 이론적으로는 서로 전화로 IP:Port 알려줘도 됨 ◦ 일반적으로 Websocket 기반의 Signaling server 구현 • 관련 용어 ◦ Signaling server : 주소 정보 공유 서버 ◦ SDP : 주소 정보 규격 ◦ ICE : 통신 경로 규격 ◦ STUN server : 주소 확인 서버 ◦ TURN server : 데이터 중계 서버
만들 때는 이론을 모두 이해할 필요는 없음 • Signaling Server ◦ WebSocket으로 Peer 간에 signal 정보 전달하도록 구현 ◦ 정해진 규격이 없기 때문에 웹에 있는 샘플들 보면서 작성 필요 • STUN Server ◦ Google이 무료 서버 제공. 설정에 해당 URL 넣어주면 끝 • TURN Server ◦ HTTP Server 처럼 규격이 정해진 서버라 오픈소스 사용해서 EC2 같은 곳에 올릴 수 있음 ◦ 클라우드 기반으로 사용량에 따라 돈을 내는 SaaS도 존재 Realtime Communication - WebRTC
CRDT • 실제 구현을 직접하기는 쉽지 않음 • 다행스럽게도 유명한 오픈소스들이 존재 ◦ Automerge ◦ Yjs ◦ … • 특별히 많은 조사를 하지는 않았는데 Yjs가 쓰기 편했음 ◦ 유명 에디터 라이브러리들의 플러그인을 제공 ◦ 서버 구현부에 대해서 플러그인을 제공
Server [EC2] Frontend App [Amplify] Frontend App [Amplify] TURN server [Cloud Service] STUN server [Cloud Service] Yjs CodeMirror WebRTC 추후 고려사항 - Signaling Server 가 스케일을 키우려면 Redis와 같은 별도 DB가 필요 (Pub/Sub 이용)
분야의 전문적인 지식을 모두 알기는 어려움 ◦ 만들어진 것을 최대한 활용하자. OpenSrc, SaaS 등 다양한 도구로 이미 존재한다. ◦ 다양한 언어를 알아두면 좋고, 웹 기반은 JavaScript 라이브러리가 많다고 느낌. ◦ 프론트엔드의 경우 대부분 React, Vue를 가정하기 때문에 이들의 코어 컨셉은 알면 좋음 • 로컬에서는 잘 되어도 웹에 올리려면 다양한 고민이 필요. 네트워크 지식은 알아두면 좋음. ◦ HTTPS ◦ CORS ◦ DNS ◦ … • 초기 구축은 프론트엔드가 더 리소스가 많이 필요한 느낌.. ◦ 엮인게 많음. Bundling, Tranfile 등 (RCA or VueCli 같은 초기화 도구 좋은 듯) ◦ Webpack, Parcel 등 번들러 하나 정도는 알아두면 좋음. 간단한거 (Vite도 좋은 거 같음) • 전체적으로 알아야 할게 많지만 막상 해보면 금방 함. 모두 알고 해보기보다는 해보면서 찾아가는게 좋은 듯