피드로 돌아가기
PostgreSQL JSONB for Video Analytics Dashboards
Dev.toDev.to
Database

DailyWatch가 PostgreSQL JSONB 컬럼 타입을 도입해 스키마 마이그레이션 없이 동적 분석 메트릭 저장

PostgreSQL JSONB for Video Analytics Dashboards

ahmet gedik2026년 3월 27일4intermediate

Context

비디오 분석 데이터는 시간에 따라 추적하는 메트릭이 변한다. 새로운 지표마다 컬럼을 추가하는 방식은 50개의 nullable 컬럼을 가진 테이블과 지속적인 마이그레이션을 초래했다.

Technical Solution

  • 구조화된 데이터는 일반 컬럼(video_id, views, likes, captured_at)에 저장하고 변동하는 분석 메트릭은 JSONB 컬럼(metrics)에 저장하는 하이브리드 스키마 설계
  • GIN 인덱스를 JSONB 컬럼에 생성해 containment(@>) 및 existence(?) 연산자를 지원: 일반 GIN 인덱스와 경로별 특화 인덱스(metrics -> 'regions') 두 가지 전략 활용
  • jsonb_set() 함수와 || 연산자를 사용해 전체 객체 교체 없이 특정 경로만 업데이트: 새 트래픽 소스 추가 시 기존 데이터 유지
  • jsonb_each_text() 함수로 동적 키를 행으로 언팩해 GROUP BY 집계: 지역별 뷰 합계를 7일 단위로 집계
  • date_trunc()과 결합해 시간 단위 시계열 데이터 생성: 시간별 평균 뷰, 평균 시청 시간, 모바일 비율을 단일 JSONB 컬럼에서 추출

Impact

경로 추출(->>)쿼리는 1-3ms, containment(@>) 쿼리는 2-5ms, jsonb_each_text 집계는 10-20ms, 전체 테이블 JSONB 집계는 40-80ms 성능을 보유. 초기 테이블 생성 후 약 50,000개의 분석 레코드에 대해 단일 마이그레이션 없이 대시보드 반복 가능.

Key Takeaway

JSONB는 필수 불가결한 데이터(JOIN 대상, 자주 필터링되는 칼럼)를 저장하는 도구가 아니라, 선택적이고 형태가 가변적이며 필터링이 드문 데이터를 위한 설계 패턴이다. 올바른 용도로 적용하면 스키마 마이그레이션 비용을 완전히 제거할 수 있다.


변동하는 분석 메트릭을 추적하는 서비스에서 고정 컬럼과 JSONB 컬럼을 분리해 설계하고, GIN 인덱스와 jsonb_set() 함수를 조합하면 스키마 변경 없이 새로운 지표를 추가할 수 있고, jsonb_each_text()를 활용한 집계로 시계열 대시보드 데이터를 단일 테이블에서 1-80ms 내에 조회할 수 있다.

원문 읽기