블로그 목록
개발 스토리
⚙️

밸런스 게임이 빅데이터가 되는 방법: VS 서비스 아키텍처 개발 스토리

2026-03-058분 읽기

단순한 재미 게임처럼 보이는 VS 밸런스 게임이 어떻게 실시간 사회적 선호도를 측정하는 빅데이터 플랫폼으로 발전했는지, 익명 데이터 파이프라인 설계부터 Supabase Realtime 집계 아키텍처, 마이크로 트렌드 분석까지 기술적으로 공개합니다.

밸런스 게임이 빅데이터가 되는 방법\n\n처음 Z-Labs 기획 회의에서 VS 밸런스 게임 아이디어를 구상했을 때, 목표는 아주 단순했습니다. UI가 예쁘게 애니메이션되는 투표 앱을 만들자. 그리고 통계 퍼센트를 보여주자.\n\n실제로 만들어보니 훨씬 흥미로운 현상이 발생했습니다. 유저들이 단순히 자신의 선택을 공유하는 것이 아니라, 다른 사람들의 선택을 보기 위해 서비스에 머무르는 시간이 눈에 띄게 길었습니다. "나는 A를 골랐는데 73%가 B를 선택했다"는 사실이 단순한 재미를 넘어 사회적 비교 욕구를 자극했습니다.\n\n이 인사이트가 단순 투표 앱을 **실시간 사회적 선호도 측정 플랫폼**으로 진화시키는 출발점이 됐습니다.\n\n### 가장 어려운 질문: 무엇을 수집할 것인가\n\n데이터를 모으기 전에 먼저 답해야 할 질문이 있었습니다. "우리가 정말 알고 싶은 것이 무엇인가?" 단순히 A/B 투표 비율은 이미 프론트엔드에서 집계됩니다. 그것만으로는 부족했습니다.\n\n우리가 주목한 것은 **dwell_time_ms**, 즉 질문이 화면에 렌더링된 시점부터 유저가 실제로 선택을 클릭하기까지의 체류 시간입니다. 이 수치는 단순한 클릭 데이터와는 차원이 다른 정보를 담고 있습니다. "커피 vs 차" 질문에서 400ms 만에 클릭한 유저와, 12초 동안 고민한 유저는 동일한 "커피" 선택이라도 그 확신의 강도가 완전히 다릅니다.\n\n### 개인정보 보호를 전제로 한 익명 데이터 파이프라인 설계\n\n빅데이터 수집에 있어 최우선 과제는 완벽한 익명성이었습니다. Z-Labs는 회원가입이나 소셜 로그인을 요구하지 않습니다. 이름, 이메일, 전화번호 등 어떠한 개인 식별 정보도 수집하지 않습니다.\n\n수집하는 핵심 로그 데이터 스키마:\n\n```\nchoice_id : 유저가 선택한 옵션 A 또는 B의 식별자\ntopic_id : 현재 질문의 카테고리 ID\ndwell_time_ms : 렌더링 시점부터 유저가 클릭하기까지 체류 시간 (밀리초)\ndevice_type : 모바일, 태블릿, 데스크탑 구분\ntimezone_slot : 로컬 환경 접속 시간대 (KST 09~24시를 6개 슬롯으로 분류)\n```\n\n개인을 특정할 수 있는 정보는 단 하나도 없지만, 이 5개 필드의 조합만으로도 "야간에 모바일로 접속하는 20대는 커피보다 에너지 음료를 선호한다"는 수준의 집단 행동 패턴 분석이 가능합니다.\n\n### React + Supabase로 구축한 실시간 집계 아키텍처\n\n수만 명의 동시 접속자가 투표 쿼리를 발생시킬 때, 프론트엔드에 즉각적 피드백을 제공하는 것은 생각보다 까다로운 문제입니다. 초당 수백 건의 쓰기 요청이 쏟아지는 상황에서 모든 요청이 즉시 DB에 반영되고, 그 결과가 다시 모든 클라이언트에게 실시간으로 전달되어야 합니다.\n\n**1단계: 원시 이벤트 스트리밍**\n\n유저가 선택을 클릭하면 Supabase Edge Function으로 RESTful POST 요청이 발송됩니다. Edge Function은 요청을 검증하고 인메모리 대기열에 쌓은 뒤 배치로 DB에 flush합니다. 이 방식으로 개별 클릭마다 DB 트랜잭션이 발생하는 오버헤드를 제거했습니다.\n\n**2단계: Materialized View 집계 캐시**\n\nPostgreSQL의 Materialized View를 구축하고 백그라운드 워커(pg_cron)가 10초 간격으로 최신 투표 비율을 집계 캐시에 반영합니다. 실시간 쿼리가 거대한 투표 테이블을 직접 집계하지 않아도 되므로, 응답 속도가 평균 340ms에서 28ms로 단축됐습니다.\n\n**3단계: Supabase Realtime 클라이언트 구독**\n\nSupabase Realtime을 통해 클라이언트는 현재 질문의 데이터 채널을 WebSocket으로 구독합니다. Materialized View가 갱신되면 변경 이벤트가 구독 중인 모든 클라이언트에게 push됩니다. 유저는 페이지를 새로고침하지 않아도 실시간으로 투표 비율이 바뀌는 것을 볼 수 있습니다.\n\n### 데이터가 밝혀낸 의외의 사회적 패턴\n\n수십만 건의 투표 데이터가 쌓이면서 흥미로운 패턴들이 나타나기 시작했습니다.\n\n가장 놀라운 발견은 **dwell_time_ms의 양극화**였습니다. 대부분의 질문에서 응답 시간이 1초 미만(순간 선택)과 10초 이상(신중한 고민) 두 그룹으로 명확히 분리됐습니다. 2~9초 구간은 상대적으로 비어 있었는데, 이는 인간의 의사결정이 직관(시스템 1)과 숙고(시스템 2)로 이분된다는 행동경제학의 이중 프로세스 이론과 정확히 일치했습니다.\n\n또한 timezone_slot 데이터를 분석하니, 같은 질문이라도 새벽 2-4시에 접속하는 유저 집단은 낮 시간대 집단과 선택 패턴이 통계적으로 유의미하게 달랐습니다. 피로와 감정적 상태가 의사결정에 미치는 영향을 데이터로 확인한 순간이었습니다.\n\n### 다음 마일스톤: 마이크로 트렌드 예측 엔진\n\n현재 축적된 투표 데이터를 기반으로 다음 단계를 준비하고 있습니다. 특정 인구통계 집단(연령대, 접속 시간대, 디바이스)이 새로운 질문에 어떻게 반응할지 예측하는 머신러닝 트렌드 리포트 생성기입니다. 마케터나 콘텐츠 기획자가 "20대 여성 모바일 유저는 이 두 가지 중 어느 것을 더 선호할까?"라는 질문에 데이터 기반 답변을 얻을 수 있는 플랫폼이 목표입니다.