홈 › 5장 MAM 시스템 설계

5.4 메타데이터 모델 - 소재, 파일, 구간을 어떻게 저장할까

기술·서술·구조·관리 메타데이터의 구분, 소재-파일-구간 계층 모델, 관계형 스키마 예제(SQLite로 검증), 통제 어휘와 표준 스키마(EBUCore 등) 활용을 설명합니다.

최종 수정 2026-10-28 · 읽는 시간 약 5분 · 운영 프리즘(Prism) · 편집 원칙

#메타데이터의 네 종류

MAM이 다루는 메타데이터는 성격에 따라 네 가지로 나눌 수 있습니다.

종류 내용 입력 방식 예
기술(Technical) 파일 자체의 속성 자동(MediaInfo/FFprobe, 3장) 코덱, 해상도, 프레임레이트, 길이, 시작 타임코드
서술(Descriptive) 내용에 대한 설명 사람 + 자동(AI) 제목, 줄거리, 출연자, 장소, 키워드
구조(Structural) 내부 구성과 관계 사람 + 자동 장면 구간, 챕터, 원본-편집본 관계
관리(Administrative) 권리·이력·운영 정보 시스템 + 사람 저작권, 사용 가능 기간, 등록자, 보존 기한

이렇게 나누는 이유는 입력 책임이 다르기 때문입니다. 기술 메타데이터는 사람이 입력하면 안 되고(오류 발생), 서술 메타데이터는 자동화가 어렵습니다. 사용자의 입력 부담을 줄이려면 입력할 수 있는 것은 최대한 자동화하고, 사람이 입력할 것은 꼭 필요한 항목만 요구해야 합니다.

#계층 모델: 소재 - 파일 - 구간

가장 흔한 실수는 "영상 파일 하나 = 레코드 하나"로 모델링하는 것입니다. 실제 업무에서는 같은 영상에 여러 파일(원본, 프록시, 썸네일) 이 있고, 한 영상 안에 여러 구간(장면, 인터뷰) 이 있습니다.

소재(Asset)                        ← 사용자가 "영상 하나"로 인식하는 단위. 서술 메타데이터가 붙음
 ├─ 파일(Media File) × N           ← 원본(hires), 프록시, 썸네일... 기술 메타데이터가 붙음
 └─ 구간(Segment) × N              ← 타임코드 in/out. 구간별 서술 메타데이터(라벨, 키워드)
  • 소재(Asset) 는 논리적 단위입니다. 사용자는 "어제 저녁 9시 뉴스 영상"을 찾지, a1.mxf를 찾지 않습니다.
  • 파일은 소재의 물리적 표현입니다. 원본이 아카이브(테이프)로 이동해도 소재 레코드와 프록시는 남아 있어야 검색이 됩니다.
  • 구간은 시작/끝 타임코드로 정의하며, 서브클립이나 마커의 기반입니다.

#관계형 스키마 예제

아래는 위 구조를 SQL로 옮긴 최소 스키마입니다. SQLite 3.51로 실제 실행해서 제약 조건과 조회를 확인했습니다.

CREATE TABLE asset (
  id         INTEGER PRIMARY KEY,
  title      TEXT NOT NULL,
  kind       TEXT,                       -- news, drama, ...
  created_at TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE media_file (
  id          INTEGER PRIMARY KEY,
  asset_id    INTEGER NOT NULL REFERENCES asset(id),
  role        TEXT NOT NULL CHECK (role IN ('hires','proxy','thumb')),
  path        TEXT NOT NULL,
  container   TEXT, codec TEXT,
  fps         TEXT,                      -- '30000/1001' 분수 문자열
  start_tc    TEXT,                      -- '01:00:00;00'
  duration_ms INTEGER, size_bytes INTEGER,
  sha256      TEXT
);

CREATE TABLE segment (
  id       INTEGER PRIMARY KEY,
  asset_id INTEGER NOT NULL REFERENCES asset(id),
  tc_in    TEXT NOT NULL, tc_out TEXT NOT NULL,
  label    TEXT,
  source   TEXT DEFAULT 'manual'         -- manual / auto(AI)
);

CREATE TABLE metadata (
  asset_id INTEGER NOT NULL REFERENCES asset(id),
  field    TEXT NOT NULL,                -- location, person, keyword ...
  value    TEXT,
  PRIMARY KEY (asset_id, field, value)
);

설계 포인트는 다음과 같습니다.

  • role에 CHECK 제약을 걸어 허용되지 않는 값(예: 'bad')을 넣으면 DB가 거부합니다. 실행 결과 CHECK constraint failed: role IN ('hires','proxy','thumb')로 차단되는 것을 확인했습니다.
  • 외래키는 연결(connection)마다 켜야 합니다. SQLite는 REFERENCES를 적어도 기본값에서는 검사하지 않습니다. 존재하지 않는 asset_id = 999로 media_file을 넣으면 PRAGMA foreign_keys = ON이 없을 때는 그대로 삽입되어 고아 행이 생겼고, 켠 뒤에는 FOREIGN KEY constraint failed로 거부되었습니다. DB에 접속하는 모든 코드에서 연결 직후 PRAGMA foreign_keys = ON을 실행하세요.
  • 프레임레이트는 분수 문자열로 저장합니다(3장 정규화 원칙).
  • 시작 타임코드를 파일에 저장합니다. 구간(tc_in, tc_out)은 타임코드로 표현하고, 시간 계산 시 파일의 프레임레이트와 시작 타임코드를 사용합니다.
  • metadata 테이블은 키-값 구조로 같은 필드에 여러 값(출연자 여러 명)을 허용합니다(기본 키가 asset_id, field, value).
  • 구간의 source로 사람이 입력한 것과 AI가 자동 생성한 것을 구분합니다. AI 결과는 틀릴 수 있으므로 신뢰도 표시와 검수 흐름이 필요합니다.

프록시 경로를 조회하는 쿼리는 다음과 같습니다.

SELECT a.title, f.role, f.path
FROM asset a JOIN media_file f ON f.asset_id = a.id
WHERE f.role = 'proxy';

#키-값 vs 고정 컬럼

위 스키마의 metadata 테이블은 유연성을 얻는 대신 쿼리가 복잡해지고 타입 검증이 어렵습니다. 선택 기준은 다음과 같습니다.

방식 장점 단점 적합한 경우
고정 컬럼 쿼리·인덱스·검증 쉬움 항목 추가 시 스키마 변경 모든 소재에 공통인 핵심 항목(제목, 종류, 방송일)
키-값(EAV) 항목 추가가 자유로움 쿼리 복잡, 타입 약함 프로그램 유형마다 다른 확장 항목
JSON 컬럼 중간 DB별 기능 차이 외부 시스템 원본 메타데이터 보관

실무에서는 핵심은 고정 컬럼, 확장은 키-값 또는 JSON으로 섞어 씁니다.

#통제 어휘

"서울", "서울시", "Seoul"을 모두 다른 장소로 입력하면 검색에서 놓칩니다. 이를 막으려면 통제 어휘(Controlled Vocabulary), 즉 미리 정한 목록에서 고르게 하는 방식이 필요합니다.

  • 장소, 인물, 프로그램, 카테고리처럼 반복되는 값은 별도 테이블(코드표)로 관리하고, 소재에서는 ID로 참조합니다.
  • 동의어(예: "서울" = "서울특별시")는 코드표에서 대표어 1개와 별칭으로 관리합니다.
  • 자유 입력(키워드)과 통제 입력(카테고리)을 구분해서 UI에 제공합니다.

#표준 스키마

처음부터 자체 필드를 만들기보다 기존 표준을 참고하면 다른 시스템과 교환할 때 편합니다.

표준 설명
Dublin Core 제목, 작성자, 날짜 등 15개 기본 요소. 범용
EBUCore EBU가 방송용으로 정의한 메타데이터 모델. 방송 자산 교환에 사용 (MediaInfo가 출력 형식으로 지원)
SMPTE DMS-1 등 MXF에 내장하는 서술 메타데이터
PBCore 공영방송·아카이브 분야에서 사용

내부 스키마를 이 표준과 매핑 표로 연결해 두면, 외부 전송과 교환 시 변환이 쉬워집니다.

#변경 이력

메타데이터는 계속 수정됩니다. 누가 언제 무엇을 바꿨는지 이력(감사 로그) 을 남기세요. 특히 다음은 반드시 남깁니다.

  • 서술 메타데이터 수정(사람이 입력한 값의 보호)
  • AI가 자동 생성한 값과 사람이 수정한 값의 구분
  • 소재의 상태 변경(승인, 반려, 삭제)
  • 권한 및 공개 범위 변경

#정리

  • 메타데이터는 기술·서술·구조·관리로 나누고, 입력 책임을 구분합니다.
  • 소재-파일-구간 계층으로 모델링해야 프록시, 아카이브, 구간 검색을 지원할 수 있습니다.
  • 핵심은 고정 컬럼, 확장은 키-값/JSON, 반복되는 값은 통제 어휘로 관리합니다.
  • 표준 스키마와의 매핑과 변경 이력을 처음부터 고려합니다.

#참고 자료

링크는 2026-10-28에 열람이 되는 것을 확인했습니다. 규격과 도구 문서는 개정될 수 있으므로 적용하기 전에 최신 판을 확인하세요.