Problem
어떤 문제를 풀었나
기존 시청자 참여 방식은 스트리머가 게임방 코드를 방송 화면에 노출하고, 시청자가 무작위로 입장하는 비구조적 형태로 운영됨. 이로 인해 참여자 식별 불가, 입장 순서 관리 부재, 중복/악성 참여자 필터링 불가, 실시...
Project Detail
스트리머와 시청자를 매끄럽게 연결하는 실시간 참여 플랫폼
치지직 스트리머들이 시청자 참여 방송을 진행할 때, 시청자 인원을 실시간으로 수용하고 방송 컨텐츠에 맞게 유연하게 조절하여 효율적으로 관리할 수 있도록 돕는 스트리밍 서드파티 서비스입니다.
기간
2025.01 ~ 2025.05
팀 구성
3명 (PM 1 / BE 1 / FE 1)
기술 스택
8개 기술 사용
Problem
기존 시청자 참여 방식은 스트리머가 게임방 코드를 방송 화면에 노출하고, 시청자가 무작위로 입장하는 비구조적 형태로 운영됨. 이로 인해 참여자 식별 불가, 입장 순서 관리 부재, 중복/악성 참여자 필터링 불가, 실시...
Contribution
API 서버 개발 및 배포 · UI 디자인 설계
Outcome
치지직(네이버) 계정을 활용한 OAuth SSO 방식 채택. 별도 회원가입 없이 로그인 토큰만으로 즉시 인증 및 세션 생성하여 사용자 접근성 극대화
치지직 스트리머들이 시청자 참여 방송을 진행할 때, 시청자 인원을 실시간으로 수용하고 방송 컨텐츠에 맞게 유연하게 조절하여 효율적으로 관리할 수 있도록 돕는 스트리밍 서드파티 서비스입니다.
Target User
치지직 기반 소규모~중형 스트리머
Core Experience
스트리머와 시청자를 매끄럽게 연결하는 실시간 참여 플랫폼
Why It Matters
스트리머가 직접 세션을 생성하고 참여자를 초대/제어하는 구조로, 기존 코드 공유 방식의 수동성 제거
치지직 플랫폼 내 시청자 참여형 콘텐츠(게임 시참, 합방 등)의 운영 효율성을 극대화하기 위한 실시간 참여자 관리 솔루션 구축. 스트리머가 방송 흐름을 유지하면서도 참여자 대기열, 입장/퇴장, 상태 변경을 직관적으로 제어할 수 있는 서드파티 서비스 제공
기존 시청자 참여 방식은 스트리머가 게임방 코드를 방송 화면에 노출하고, 시청자가 무작위로 입장하는 비구조적 형태로 운영됨. 이로 인해 참여자 식별 불가, 입장 순서 관리 부재, 중복/악성 참여자 필터링 불가, 실시간 상태 파악 어려움 등의 문제가 발생하여 방송 운영 효율성과 시청자 경험 모두 저하되는 Pain Point 존재
치지직 기반 소규모~중형 스트리머
What makes this project special
스트리머가 직접 세션을 생성하고 참여자를 초대/제어하는 구조로, 기존 코드 공유 방식의 수동성 제거
실시간으로 참여자 상태 확인 및 입장/대기/퇴장/강퇴 등의 세밀한 제어 가능
별도의 앱이나 복잡한 가입 없이, 방송 중 링크 공유만으로 참여 가능한 낮은 진입장벽
SSE 기반으로 구현된 가벼운 단방향 실시간 이벤트 처리 구조로 WebSocket의 복잡성 제거
방송 운영 흐름을 방해하지 않으면서 참여형 콘텐츠를 매끄럽게 진행할 수 있는 UX 설계

CHIT은 치지직 공식 OAuth 기반의 SSO 로그인 방식을 사용합니다. 치지직은 네이버 계정 기반이기 때문에, 사용자는 별도의 회원가입 절차 없이 네이버에 로그인된 상태에서 치지직 인증 토큰을 발급받고, 해당 토큰으로 유저 정보를 조회하여 자동 로그인됩니다.

CHIT은 실제 스트리밍 방송 중인 경우에만 시청자 참여 세션을 생성할 수 있도록 설계되어 있습니다.
이러한 조건 기반 제한 로직은 스트리밍 상황과 콘텐츠 목적에 맞는 서비스 사용을 유도하고, 시청자 경험의 일관성과 정확성을 보장하기 위한 목적에서 구현되었습니다.

스트리머는 로그인 후 방송 중일 경우에만 시참 세션 생성 화면으로 진입할 수 있으며, 해당 화면에서는 다음과 같은 세부 입력 및 제어 기능을 제공합니다.

CHIT은 세션 생성 이후, 스트리머가 실시간으로 참여자 목록을 관리하고 파티 구성을 시각적으로 확인할 수 있는 다양한 기능을 제공합니다.

CHIT의 시청자용 화면은 세션 참여 흐름에 따라 동적으로 UI가 변화하며, 스트리머 상태 및 본인의 참여 순서에 맞춰 다양한 인터랙션을 제공합니다.
Engineering details and infrastructure
시스템 아키텍처
치지직(네이버) 계정을 활용한 OAuth SSO 방식 채택. 별도 회원가입 없이 로그인 토큰만으로 즉시 인증 및 세션 생성하여 사용자 접근성 극대화
단방향 실시간: 동시성 및 실시간성을 고려하여 Socket 대신 SSE(Server-Sent Events) 활용. 비실시간 처리: 데이터 처리나 기타 기능은 API를 통해 제공
Virtual Thread(가상 스레드) 적용으로 자원 활용 극대화. Redis 사용 불가 상황에서 JVM 기반의 Ehcache 도입
OCI Free Tier (1 Core, 1GB) 환경에서 제한된 자원으로 최대 성능 구현. Redis 대신 EhCache와 Hibernate 2차 캐시 활용
Cloudflare를 통해 API 서버 보호. Nginx를 이용한 HTTPS 기반 리버스 프록시로 웹 애플리케이션 보안 강화
Technical challenges encountered during the project and solutions
참가자가 증가하고 데이터베이스에 저장되는 데이터의 양이 많아질수록, 인덱싱을 적용하더라도 ORDER BY 연산의 비용이 점차 증가하여 성능 저하가 발생할 가능성이 높았습니다. 특히, 사용량이 많은 시간대에는 쿼리의 실행 속도가 느려지면서 실시간성을 보장하기 어려울 것으로 우려되었습니다.
ConcurrentHashMap(세션별 참가자 목록 정보)과 ConcurrentSkipListSet(참가자 목록을 정렬된 상태로 유지)을 활용하여 JVM 메모리 공간 내에서 정렬된 참가자 순서를 유지합니다.
Redis SortedSet을 대안으로 고려했으나, 제한된 자원(1코어, 1GB RAM) 환경에서 단순히 SortedSet 기능 하나만을 위해 Redis를 사용하는 것은 비효율적이라 판단되었습니다.
다수의 사용자에게 실시간 순번 정보를 제공하면서도 성능과 동시성을 유지해야 했습니다. 초기에는 코루틴을 고려했지만, 기존 동기 코드와 아키텍처의 변경을 최소화할 필요가 있었습니다.
가상 스레드 기반 ExecutorService를 Spring Bean으로 등록하고, SseEmitter를 활용한 세션별 클라이언트 연결 관리를 구현했습니다.
양방향 통신(WebSocket)이 고려되었으나, 요구사항을 분석한 결과 단방향 통신만으로 충분하여 SSE(Server-Sent Events)를 대안으로 채택했습니다.
단순해 보이는 기능 속에 숨겨진 기술적 복잡성을 발견하고 해결해나가는 과정이었습니다. 실시간 데이터 처리, 동시성 관리, 사용자 경험 설계 등 여러 측면에서 많은 것을 배울 수 있었습니다.
수백 명의 사용자를 대상으로 한 실시간 데이터 전송을 안정적으로 처리. 시스템 부하가 증가해도 높은 안정성 유지
ConcurrentHashMap과 ConcurrentSkipListSet을 활용하여 동시성 처리와 정렬 성능을 극대화. 실시간 순서 변경과 상태 업데이트가 매우 빠르게 처리
실시간 대기열 회전, 고정픽 처리 등 스트리밍 환경에 특화된 사용자 경험 구현
자율 프로젝트임에도 팀원 간 지속적인 피드백과 효율적인 역할 분담으로 높은 완성도 확보
SpringMVC와 코루틴의 궁합 문제로 인해 비동기 처리 방식에 대한 전면적인 재검토가 필요. 결과적으로 더 안정적인 시스템 구축
UI와 실시간 동기화 사이에서 로직의 단순함과 풍부한 사용자 경험 간의 균형을 찾는 데 많은 시간 소요
Redis SortedSet을 활용한 분산 처리 구조로 확장
시청자 UX 개선 및 반응성 높은 인터페이스 구현
스트리머별 개인화 세션 설정 기능 추가
실시간 모니터링 및 시청자 반응 분석 통계 대시보드 추가