코로나로 다들 집에 있던 시기였다. 지인들과 떨어져 있어도 YouTube를 같이 볼 수 있으면 좋겠다는 생각이 들었다. 마침 GDG Korea Android에서 주최하는 Android 11 끝장개발대회를 발견했다. 약 3주간 진행되는 해커톤이었다. 단독으로 참가했다.
서비스
YouTube Together는 지인들과 비대면으로 YouTube 영상을 동시에 시청할 수 있는 앱이다.
YouTube 시청 기능은 기존 YouTube 앱처럼 동작했다. YouTube API를 통해 영상을 검색하고 재생했다. 미니 플레이어를 지원해서 영상을 보면서 다른 콘텐츠를 탐색할 수 있게 했다.
핵심은 동시 시청이었다. 친구를 추가하고 영상을 선택하면 동시에 재생이 시작된다. 재생 위치, 재생 여부가 실시간으로 동기화됐다. 채팅도 있어서 영상을 보면서 대화했다.
아키텍처
3주 안에 끝내려면 검증된 구조가 필요했다. 앱은 MVVM 패턴으로 설계했다 — Single Activity에 Fragment를 구성하고, Hilt로 의존성을 주입했다. ViewModel과 LiveData로 UI 상태를 관리하고, Repository 패턴으로 로컬(SQLite)과 원격 데이터 소스를 분리했다.
서버는 두 가지를 구성했다. REST API 처리를 위한 Spring 기반 API 서버와, 실시간 동기화를 위한 Java 소켓 서버다.
flowchart TD
Hilt["Hilt\n(DI)"] -. 의존성 주입 .-> App
subgraph App["Application"]
Activity["Single Activity\n+ Fragment"] --> VM["ViewModel\n+ LiveData"]
VM --> Repo["Repository"]
end
Repo --> Local["Local Model\n(SQLite)"]
Repo --> Remote["Remote Data Model"]
Remote --> Socket["소켓 서버\n(Java)"]
Remote --> API["API 서버\n(Spring)"]
핵심 구현
YouTube API 연동
YouTube Data API로 영상 검색과 재생을 구현했다. 재생 화면에는 Motion Layout을 활용해 미니 플레이어 전환을 넣었다. 아래로 스와이프하면 미니 플레이어로 축소되고, 다시 탭하면 전체 화면으로 돌아간다.
실시간 동시 시청
동시 시청의 핵심은 재생 상태 동기화였다. Java로 소켓 서버를 구현하고, 참여한 사용자들의 재생 위치와 재생/일시정지 상태를 실시간으로 동기화했다. 한 사용자가 재생 위치를 변경하면 다른 사용자의 영상도 같은 위치로 이동했다. 채팅은 같은 소켓 연결을 통해 처리했다.
회고
3주가 짧지 않다고 생각할 수 있지만, 서버와 앱을 혼자 만들기에는 빠듯했다. API 서버 설계, 소켓 서버 구현, Android 앱 개발을 동시에 진행해야 했다. 기능을 줄이고 핵심에 집중하는 판단이 핵심이었다 — 커뮤니티나 추천 같은 부가 기능은 잘라내고, 동시 시청 하나에 집중했다.
대도서관 상을 받았다. 떨어져 있어도 함께 보겠다는 아이디어에서 시작된 3주였다. 돌이켜 보면 시간의 제약 안에서 범위를 잘라내고 완성까지 가본 경험이 해커톤의 핵심 배움이었다.