요약
•
Unity 엔진을 활용한 3D 가상 협업 공간 '게더타운' 개발
•
WebRTC 기반 실시간 통신 및 CRDT 알고리즘을 이용한 동시 문서 편집 구현
역할
•
2인 개발팀에서 기획, 설계, 네트워크 개발 담당 (기여도 70%)
•
WebRTC 시스템 아키텍처 설계 및 Unity 환경 내 구현 주도 (기여도 100%)
•
Photon을 활용한 시그널링 서버 구축 및 CRDT 알고리즘 적용 (기여도 80%)
성과
•
WebRTC 기술을 활용하여 P2P 기반의 실시간 영상/음성 통화, 화면 공유 기능 구현
•
Photon 네트워킹을 이용한 효율적인 룸 매칭 및 WebRTC 시그널링 프로세스 최적화
•
CRDT 알고리즘과 Photon RPCs를 결합한 충돌 없는 실시간 문서 협업 시스템 구축
시기
•
2022.09 (1개월 소요)
WebRTC 기반 몰입형 3D 화상 회의
WebRTC 기술을 활용하여 고품질의 실시간 영상/음성 통화를 구현했습니다. 이를 통해 사용자들은 지연 없이 자연스러운 대화를 나눌 수 있으며, 3D 가상 공간에서 아바타를 통해 직접 마주하는 듯한 경험을 제공합니다.
P2P 연결을 통해 서버 부하를 줄이고 안정적인 통신을 보장합니다. 또한 동적 연결 관리 시스템을 구축하여 사용자 간 거리와 공간 속성에 따라 유동적으로 연결을 구성, 대규모 가상 공간에서도 원활한 소통이 가능합니다.
사용자들은 마치 실제 사무실에 있는 것처럼 자연스럽게 동료들과 마주치고 대화할 수 있어 원격 근무 환경에서도 팀워크와 소속감을 유지할 수 있습니다.
Photon-WebRTC 하이브리드 시그널링 시스템
Photon 네트워킹과 WebRTC를 연동하여 효율적인 시그널링 시스템을 구축했습니다. Photon의 안정적인 서버-클라이언트 통신을 활용해 WebRTC 연결 설정에 필요한 메타데이터를 빠르게 교환함으로써, 복잡한 시그널링 과정을 단순화했습니다.
Photon RPC(Remote Procedure Call)를 이용해 Offer/Answer 교환 및 ICE 후보 전달 과정을 추상화했습니다. 이를 통해 개발자는 저수준 네트워크 통신 로직에 대한 부담 없이 고수준의 기능 구현에 집중할 수 있습니다.
사용자들은 빠른 초기 연결 설정으로 원활한 서비스 이용이 가능합니다. 또한 Photon의 룸 매칭 시스템과 결합하여 손쉬운 화상 회의 참여 및 전환이 가능해져 사용자 경험이 크게 향상됩니다.
예시 코드
public IEnumerator CreatOfferInit()
{
peerConnection = CreateLocalPeer();
var offer = await peerConnection.CreateOffer();
await peerConnection.SetLocalDescription(offer);
photonView.RPC("ReceiveOfferInit", RpcTarget.Others, JsonUtility.ToJson(offer));
}
[PunRPC]
public void ReceiveOfferInit(string offerJson)
{
var offer = JsonUtility.FromJson<RTCSessionDescription>(offerJson);
StartCoroutine(OnReceiveOfferInit(offer));
}
IEnumerator OnReceiveOfferInit(RTCSessionDescription offer)
{
peerConnection = CreateRemotePeer();
await peerConnection.SetRemoteDescription(offer);
var answer = await peerConnection.CreateAnswer();
await peerConnection.SetLocalDescription(answer);
photonView.RPC("ReceiveAnswerInit", RpcTarget.Others, JsonUtility.ToJson(answer));
}
C#
복사
CRDT 기반 실시간 문서 협업 시스템
충돌 없는 복제 데이터 타입(CRDT) 알고리즘을 도입하여 실시간 문서 협업 기능을 구현했습니다. 이 기술을 통해 다수의 사용자가 동시에 같은 문서를 편집할 때 발생할 수 있는 충돌을 자동으로 해결하여 일관성을 유지합니다.
각 편집 작업에 고유 식별자(CRDTID)를 부여하고 Photon RPC를 통해 네트워크 상에서 동기화합니다. 이를 통해 사용자의 편집 내용이 실시간으로 다른 사용자에게 전파되며, 네트워크 지연이나 일시적 연결 끊김에도 강건하게 동작합니다.
사용자들은 별도의 동기화 과정 없이 자유롭게 문서를 편집할 수 있어 생산성이 크게 향상됩니다. 또한 문서의 버전 관리가 자동으로 이루어져 변경 이력 추적이 용이하며, 언제든 이전 상태로 롤백할 수 있는 안정성을 제공합니다.
예시 코드
public class CRDT {
SortedList<CRDTID, char> characters = new SortedList<CRDTID, char>();
public void Insert(int index, char value) {
CRDTID newID = GetInsertID(index, value);
characters.Add(newID, value);
}
public void Delete(int index) {
characters.RemoveAt(index);
}
CRDTID GetInsertID(int index, char value) {
if (characters.Count == 0) return new CRDTID();
if (index == 0) return new CRDTID(characters.Keys[0], true);
if (index == characters.Count) return new CRDTID(characters.Keys[index - 1], false);
return new CRDTID(characters.Keys[index - 1], characters.Keys[index]);
}
}
C#
복사