차세대 CMS 재구축
“CMS의 고객은 시청자가 아니라 운영자다. 그들의 화폐는 시간이다.”
CMS는 콘텐츠가 회사 밖에서 들어와 시청자 화면에 걸리기까지의 전 과정을 책임집니다. 재생·스트리밍은 CMS의 일이 아닙니다. 그러므로 CMS의 성공은 MAU가 아니라 운영자의 작업 리드타임과 자동화 처리율로 잽니다.
내부 고객
| 누구 | 하는 일 | 고통 |
|---|---|---|
| 콘텐츠 운영자 (MD) | 메타 등록·검수, 썸네일 선정, 카탈로그 배치 | 반복 수작업, 엑셀 왕복, 오타 재작업 |
| 편성 담당 | 실시간 채널 편성, FAST 채널 구성 | EPG–카탈로그 매핑 수작업, 급편 대응 |
| 권리(라이선스) 담당 | 계약 조건 입력, 서비스 윈도우 관리 | 만료 임박 콘텐츠 수동 추적, 지역 제한 누락 |
| QC 담당 | 영상·자막 품질 검수 | 전수 검사 불가, 샘플링 의존 |
| 글로벌 운영 | 다국어 메타·자막 관리 | 언어별 누락 추적 불가, 번역 발주 수작업 |
설계 원칙
- 1
원본과 조회를 분리하되 CDC로 잇는다
배치가 아니라 변경 로그 스트리밍. 조회 장애가 원본을 오염시키지 않는다.
- 2
편성(시간축)과 노출(공간축)을 분리하고 매핑 계층으로 연결
EPG와 카탈로그는 목적이 다른 두 분류 체계다.
- 3
공통 메타 + 오버레이
언어·테넌트·지역별 차이를 컬럼 추가가 아닌 오버레이 행으로 흡수한다.
- 4
AI는 초안, 사람은 승인 (HITL)
자동화율만 좇다 품질이 무너지지 않도록 승인 게이트를 남긴다.
- 5
외부 연동은 워크플로우 엔진이 소유
재시도·보상·타임아웃을 화면 코드가 아니라 오케스트레이터가 책임진다.
흔한 출발점 → 목표 설계
| 축 | 흔한 레거시 | 목표 설계 | 근거 |
|---|---|---|---|
| 원본→조회 동기화 | 배치(주기적) | CDC 스트리밍 | 노출 지연 제거 |
| 외부 연동 | 화면 코드에 산재 | 워크플로우 엔진 소유 | 재시도·보상·가시성 확보 |
| 메타 입력 | 사람 100% | AI 초안 + 사람 승인 | 품질 게이트를 유지한 자동화 |
| EPG ↔ 카탈로그 | 이중 입력 | 매핑 계층으로 자동 연결 | 편성 변경이 노출까지 자동 전파 |
| 다국어 | 후행 컬럼 | 오버레이 테이블 | 언어 추가가 스키마 변경을 유발하지 않음 |
| 권리 | 문서·엑셀 | 도메인 서비스 + 노출 제약 | 만료·지역 제한을 시스템이 강제 |
전환 로드맵
빅뱅이 아니라 Strangler Fig입니다. 재구축하는 동안에도 콘텐츠 수급과 편성은 하루도 멈출 수 없습니다. 전환 기간의 양방향 동기화는 임시 구조이므로, 각 도메인 이관마다 '언제 끊을 것인가'를 시작 전에 못박습니다.
Phase 0 — 진단
약 1.5개월- 운영자 인터뷰 · 작업 로그 계측
- 레거시 인벤토리 · 사용 로그 분석
- Quick Win: 권리 만료 자동 알림
완료 조건 · baseline 확정 · 지표 정의
Phase 1 — 파사드
약 2개월- API Gateway 도입 · 레거시로 전부 프록시
- 계측 · 관측 구축
완료 조건 · 재구축 범위 · 순서 합의
Phase 2 — 저위험 이관
약 3.5개월- 권리 도메인 서비스
- 카탈로그 도메인 서비스
- CDC 파이프라인 (Debezium · Kafka)
완료 조건 · 카나리 5% → 50% → 100%
Phase 3 — 코어 이관
약 7개월- 메타 도메인 + 다국어 오버레이
- AI 메타 초안 + HITL 승인 게이트
- 인제스트 워크플로우
- 편성 도메인 + 매핑 계층
완료 조건 · CMS 코어 전환 완료
Phase 4 — 레거시 소멸
약 2개월- 잔여 트래픽 정리
- 레거시 읽기 전용 전환 후 폐기
완료 조건 · 레거시 폐기
성과지표
북극성
수급 → 노출 리드타임 (p50 · p95)
입력 지표
- 단계별 소요시간
- 자동화 처리율 — AI 초안 무수정 승인률
- 운영자 1인당 처리량
- 셀프서비스 비율
가드레일
- 권리 위반 노출 = 0
- 재작업률 (노출 후 메타 수정 비율)
- 인제스트 실패율
- 장애 건수 · MTTR
진단 · 설계 결정 · 빌드/바이 · 중단 기준 자세히 보기
이런 구조가 반복해서 만드는 문제
P1원본↔조회 저장소 배치 동기화
신작 노출이 배치 주기만큼 지연. 급편·긴급 수정이 즉시 반영되지 않음
P2외부 연동이 화면 로직에 흩어짐
트랜스코딩 실패 시 재시도·보상 로직이 없거나 사람이 처리. 실패가 조용히 묻힘
P3메타 등록이 수작업
카탈로그가 커질수록 인력이 선형으로 늘어남. 확장 불가
P4EPG와 카탈로그가 따로 논다
편성 변경이 노출에 자동 반영되지 않아 이중 입력
P5다국어가 후행 컬럼
글로벌 확장 시 스키마를 갈아엎어야 함
P6권리가 문서에 있고 시스템에 없음
만료 콘텐츠가 노출되는 사고 위험. 지역 제한 누락
무엇을 옮길지보다, 무엇을 버릴지를 먼저 정합니다
안 쓰는 기능을 그대로 옮기는 것이 재구축 최대의 낭비입니다. BTV NCMS에서도 레거시 190여 개 메뉴를 먼저 분석해 전환 범위와 순서를 정의한 뒤에 착수했습니다.
부임 30일 안에 무엇을 실측하는가
- 작업 로그 계측 (2~4주)
- 운영자 인터뷰 (5개 직군)
- 기능 사용 로그 — 메뉴별 접근 빈도
- 우선순위 매트릭스 = 월간 빈도 × 건당 소요시간 × 오류 비용 계수
가설을 정답처럼 다루지 않습니다. 측정 → 확정 → 우선순위 순서로 갑니다. 이 매트릭스의 점들은 30일 실측 후 이동합니다.
설계 결정 — 왜 이렇게 나눴는가
메타를 별도 테이블로 분리해 다국어를 '행'으로 만든다
title_ko · title_en · title_ja를 컬럼으로 두면 언어 추가마다 스키마를 바꿔야 합니다. 로케일을 행으로 만들면 언어 추가가 데이터 삽입이 됩니다. 동시에 source(HUMAN / AI_DRAFT / MT)와 approved 플래그가 자동화 처리율 지표를 계산 가능하게 만듭니다.
편성과 노출을 분리하고 선택적으로 매핑한다
편성은 시간축, 카탈로그는 공간축입니다. 한 에피소드가 오늘 밤 채널에 편성되면서 동시에 홈의 '지금 뜨는' 행에 노출될 수 있습니다. 두 개념을 한 테이블에 억지로 합치면 FAST 채널이나 급편 대응에서 반드시 터집니다.
공통은 컬럼, 이질적인 건 JSONB
시리즈·영화·숏클립·라이브는 공통 필드를 빼면 구조가 전혀 다릅니다. 타입별 테이블은 조인 지옥, 컬럼 통합은 NULL 밭입니다. TVING 1세대에서 원본 Oracle과 서비스용 MongoDB를 분리했던 이유가 바로 이 유연 스키마 요구였습니다. 같은 문제를 10년 뒤의 도구로 다시 푸는 셈입니다.
빌드 vs 바이
빌드 — 소유해야 하는 것
- 콘텐츠·메타 도메인 모델
- 권리 윈도우 엔진
- 편성–카탈로그 매핑 계층
- 승인 게이트 (HITL)
- 플랫폼 지표 계측
바이 — 사는 게 싼 것
- Temporal 워크플로우
- Debezium + Kafka
- OpenSearch
- STT · 비전 · 번역 AI
- TMS 번역관리
- MTS · DRM · CDN
경쟁 우위가 되는 도메인 지식은 빌드, 남들도 똑같이 쓰는 인프라는 바이. 권리 윈도우 로직을 잘 만든다고 아무도 칭찬하지 않지만, 그게 틀리면 회사가 소송을 당합니다. 반면 Kafka를 직접 만들면 그냥 시간 낭비입니다.
중단 기준 — 시작 전에 정한다
| 조건 | 조치 |
|---|---|
| 재작업률이 baseline 대비 +5%p 초과 | AI 초안 자동 승인 범위 축소, 원인 분석 |
| 권리 위반 노출 1건이라도 발생 | 즉시 해당 도메인 롤백. 사후 검토 필수 |
| 카나리 구간 오류율이 레거시 대비 1.5배 초과 | 라우팅 100% 레거시로 즉시 복귀 |
| 리드타임은 개선됐는데 인제스트 실패율 상승 | 속도 개선분을 성공으로 인정하지 않음 |