맥락이 남는 대화
아이디어·댓글·반응·읽음 상태를 주제 단위로 동기화했습니다.
주제별 대화와 아이디어, 댓글, 반응, 파일, 알림을 연결하고 화상회의까지 확장한 실시간 협업 제품입니다. 여러 기능에서 발생하는 상태 변화를 전달하기 위해 Socket.IO → Message Bus → UI 단계로 책임을 나누었습니다.
사용자는 주제를 만들고 메시지와 아이디어를 공유하며, 댓글과 반응을 남기고 읽지 않은 항목을 실시간으로 확인합니다. 이미지와 파일을 업로드하거나 Dropbox로 전달하고, 같은 서비스 안에서 WebRTC 화상회의로 전환합니다.
아이디어·댓글·반응·읽음 상태를 주제 단위로 동기화했습니다.
분할 업로드 진행률과 전송 완료를 이벤트로 UI에 전달했습니다.
Web Push를 누르면 해당 주제와 메시지 앵커로 이동합니다.
WebRTC signaling과 미디어 엔진을 분리해 협업 흐름을 확장했습니다.
대화·주제·알림·화상회의를 Socket.IO namespace로 분리하고, JWT로 식별한 사용자를 개인 Room과 주제 Room에 연결했습니다. Redis Adapter로 여러 서버 인스턴스에서도 이벤트 경로를 유지했습니다.
소켓 이벤트를 도메인 이벤트로 변환하고, 각 화면이 필요한 변화만 구독하도록 구성했습니다.
jam namespace는 방 생성·입퇴장과 WebRTC offer, answer, ICE candidate만 중계합니다. 프론트의 JamManager가 Socket signaling과 RTCPeerConnection을 조합하고, 원격 track은 다시 Message Bus 이벤트로 UI에 전달합니다.
API, Socket.IO, 파일 업로드, WebRTC 제어는 Access·Engine·Manager 객체가 담당하고, UI Adapter가 필요한 결과를 화면에 반영하도록 분리했습니다.
Socket namespace와 Room으로 전달 경로를 분리
Manager가 signaling과 peer connection을 조합
원격 미디어 이벤트를 구독해 표현
앱 전체의 상태 전이는 React 밖의 Message Bus가 전달하고, React Query 캐시는 서버 상태의 화면 Projection으로 사용했습니다. 컴포넌트와 Hook은 일반 TypeScript 객체로 구성한 동작을 호출하고 필요한 이벤트만 화면에 반영하는 Adapter 역할을 했습니다.
전송·도메인 변환·상태 반영을 나누고, React는 현재 화면이 필요로 하는 결과만 표현하도록 설계한 프로젝트입니다.
포트폴리오로 돌아가기