Product case study
NeoCAST — 실시간 협업과 음성 처리 서비스
스마트펜 필기와 문서를 실시간으로 공유하는 협업 서비스입니다. 기존 프로토타입을 이어받아 상용 서비스로 만드는 과정을 전담하며, 세션과 Canvas 동기화부터 음성 처리 파이프라인, Windows 인쇄 연동까지 프론트엔드와 서버 전반을 개발했습니다.

01
실시간 음성 스트림 재설계와 아카이브 분석
Context
장시간 세션에서는 실시간 음성 인식 연결이 끊기고, 세션이 끝나면 저장된 음성과 실시간 결과가 따로 남았습니다.
Goal
세션 중에는 자막을 빠르게 보여 주고, 종료 후에는 저장된 음성을 다시 처리해 교정과 요약, 아카이브 분석까지 이어가는 것이 목표였습니다.
What I changed
- 음성 스트림의 수명주기를 발화 단위로 재설계했습니다. 말이 시작되기 직전 구간을 함께 저장해 첫마디가 잘리지 않게 하고, 장시간 연결은 일정한 구간으로 나눠 이어 붙였습니다.
- 실시간 STT 결과를 화면에 전달하고, 저장된 음성은 세션 종료 후 배치 STT로 다시 처리했습니다.
- 인식 결과를 LLM 기반 교정과 요약, 세션별 아카이브 분석으로 연결했습니다.
Outcome
사용자는 세션 중에는 자막을 보고, 종료 후에는 교정된 기록과 요약을 이어서 확인할 수 있게 됐습니다.
02
세션 재연결과 Canvas 동기화
Context
연결이 끊긴 사용자가 다시 들어올 때 이전 연결이 남아 있거나 참여 상태가 사라졌고, 페이지와 배경, 작성 내용이 사용자마다 다르게 보일 수 있었습니다.
Goal
재연결한 사용자의 참여 상태를 복구하고, Canvas에서 일어난 변경이 모든 참여자에게 같은 상태로 전달되도록 만들어야 했습니다.
What I changed
- 끊어진 연결을 정리하고 기존 세션에 다시 참여할 수 있도록 연결 상태 복구 로직을 구현했습니다.
- 페이지 이동과 배경 변경, 작성 내용이 다시 접속한 사용자에게도 전달되도록 동기화 방식을 손봤습니다.
- 실행 취소와 다시 실행, 지우기 명령을 원격으로 전달하고, 역할에 따라 쓸 수 있는 기능을 구분했습니다.
Outcome
다시 접속한 사용자도 기존 세션을 그대로 이어가고, 재연결과 페이지 전환 시나리오는 회귀 테스트로 고정해 같은 문제의 재발 여부를 계속 확인할 수 있게 됐습니다.
03
참여자 명부와 스마트펜 연결
Context
참여자 명부와 스마트펜 정보가 따로 관리됐고, 세션에서 공유한 파일도 참여 권한에 맞게 접근을 제한해야 했습니다.
Goal
명부와 스마트펜을 세션에 연결하고, 공유 파일은 해당 세션에 참여한 사용자만 쓸 수 있게 하는 것이 조건이었습니다.
What I changed
- 명부를 만들고 가져오거나 내보낼 수 있는 화면과 저장 기능을 구현했습니다.
- 세션 생성 시 명부 정보를 함께 저장해 참여자의 이름과 스마트펜 정보를 연결했습니다.
- 파일을 올리고 내려받을 때 로그인과 세션 참여 여부를 확인하도록 서버 처리를 보완했습니다.
Outcome
세션 진행자는 이제 참여자와 펜을 한곳에서 관리하고, 명부 가져오기·내보내기와 파일 공유를 세션 안에서 끝낼 수 있습니다.
04
브라우저와 Windows 인쇄 앱 연결
Context
문서를 여는 화면마다 Windows 인쇄 기능으로 들어가는 방식이 달랐고, 인쇄 앱이 설치되지 않았거나 버전과 사용 권한이 맞지 않으면 사용자가 직접 문제를 해결하기 어려웠습니다.
Goal
브라우저에서 인쇄 앱의 상태를 확인하고, 필요하면 설치나 업데이트를 안내한 뒤 인쇄를 이어갈 수 있어야 했습니다.
What I changed
- 여러 문서 화면에서 공통으로 사용하는 인쇄 준비 화면을 만들었습니다.
- 브라우저와 Windows 앱이 deep link와 WebSocket으로 요청과 결과를 주고받도록 구현했습니다.
- 설치된 앱의 버전을 확인해 업데이트를 진행하고, 재시작 뒤 앱 상태와 사용 권한을 다시 점검하도록 처리했습니다.
- 모바일 웹에서는 Windows 전용 인쇄 기능이 노출되지 않도록 분기했습니다.
Outcome
어느 문서 화면에서 시작해도 같은 순서로 Windows 인쇄가 진행되고, 인쇄 앱이 업데이트된 뒤에도 작업이 끊기지 않습니다.