3.1 ๋ฉํ๋ฐ์ดํฐ์ 3๊ฐ์ง ์ ํ
1) ๊ธฐ์ ๋ฉํ๋ฐ์ดํฐ (Technical Metadata)
๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ๊ตฌ์กฐ์ ๊ธฐ์ ์ ํน์ฑ์ ์ค๋ช ํฉ๋๋ค.
- ํ ์ด๋ธ๋ช , ์ปฌ๋ผ๋ช , ๋ฐ์ดํฐ ํ์
- Primary Key, Foreign Key ์ ์ฝ์กฐ๊ฑด
- ์ธ๋ฑ์ค, ํํฐ์ ์ ๋ณด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด
- ํ์ผ ํฌ๋งท, ์์ถ ๋ฐฉ์
2) ๋น์ฆ๋์ค ๋ฉํ๋ฐ์ดํฐ (Business Metadata)
๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ์ปจํ ์คํธ์ ์๋ฏธ๋ฅผ ์ค๋ช ํฉ๋๋ค.
- ์ค๋ช (Description)
- ์์ ์ (Owner)
- ๋น์ฆ๋์ค ์ฉ์ด (Business Terms)
- ๋ฐ์ดํฐ ์ฌ์ฉ ๋ชฉ์
- SLA (Service Level Agreement)
3) ์ด์ ๋ฉํ๋ฐ์ดํฐ (Operational Metadata)
๋ฐ์ดํฐ์ ์ฌ์ฉ ํจํด๊ณผ ์ด์ ์ ๋ณด๋ฅผ ์ถ์ ํฉ๋๋ค.
- ๋ง์ง๋ง ์ ๋ฐ์ดํธ ์๊ฐ
- ์กฐํ/์ฟผ๋ฆฌ ๋น๋
- ๋ฐ์ดํฐ ํ์ง ์ ์
- ์ธ๊ธฐ๋ (Popularity)
- ์ ๊ทผ ๋ก๊ทธ
{
"technical": {
"table": "customers",
"database": "prod_db",
"schema": "public",
"columns": [
{"name": "customer_id", "type": "BIGINT", "pk": true},
{"name": "email", "type": "VARCHAR(255)", "unique": true}
]
},
"business": {
"description": "๊ณ ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฉ์ธ ํ
์ด๋ธ",
"owner": "data-team@company.com",
"purpose": "Customer 360 ๋ถ์"
},
"operational": {
"last_updated": "2025-12-26T10:00:00Z",
"query_count_24h": 1547,
"quality_score": 0.95,
"popularity_rank": 5
}
}
3.2 ๋ฉํ๋ฐ์ดํฐ ์๋ ์์ง
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ
JDBC, ODBC๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์งํฉ๋๋ค.
# PostgreSQL ์์
SELECT
table_schema,
table_name,
column_name,
data_type,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name, ordinal_position;
์ฃผ์ ํ๋ซํผ๋ณ ๋ฉํ๋ฐ์ดํฐ API
| ํ๋ซํผ | API/๋๊ตฌ | ์ง์ ๋ฉํ๋ฐ์ดํฐ |
|---|---|---|
| AWS | Glue Data Catalog API | ํ ์ด๋ธ, ํํฐ์ , ์คํค๋ง |
| GCP | Data Catalog API | BigQuery, Cloud Storage |
| Snowflake | INFORMATION_SCHEMA | ํ ์ด๋ธ, ๋ทฐ, ์ปฌ๋ผ, ๊ณ๋ณด |
| Databricks | Unity Catalog | Delta Lake, ๊ณ๋ณด |
| dbt | manifest.json | ๋ชจ๋ธ, ํ ์คํธ, ์์กด์ฑ |
3.3 ์คํค๋ง ๊ด๋ฆฌ
์คํค๋ง ๋ณ๊ฒฝ ๊ฐ์ง
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ ์ง์์ ์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์ถ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ํด๋ง (Polling): ์ฃผ๊ธฐ์ ์ผ๋ก ์คํค๋ง๋ฅผ ํ์ธํ์ฌ ๋ณ๊ฒฝ ๊ฐ์ง
- ์ด๋ฒคํธ ๊ธฐ๋ฐ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋ฆฌ๊ฑฐ/ํํฌ ํ์ฉ
- CDC (Change Data Capture): ํธ๋์ญ์ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง
์คํค๋ง ๋ฒ์ ๊ด๋ฆฌ
{
"schema_version_id": "v5",
"dataset_id": "customers",
"timestamp": "2025-12-26T10:00:00Z",
"changes": [
{
"type": "ADD_COLUMN",
"column": "loyalty_points",
"data_type": "INTEGER",
"nullable": true
},
{
"type": "MODIFY_COLUMN",
"column": "email",
"old_type": "VARCHAR(200)",
"new_type": "VARCHAR(255)"
}
],
"changed_by": "migration-script-v1.5"
}
3.4 ๋ฉํ๋ฐ์ดํฐ ํ์ง ๊ด๋ฆฌ
ํ์ง ํ๊ฐ ๊ธฐ์ค
| ํญ๋ชฉ | ๊ธฐ์ค | ๋ฐฐ์ |
|---|---|---|
| ์ค๋ช (Description) | 20์ ์ด์์ ์๋ฏธ์๋ ์ค๋ช | 30์ |
| ์์ ์ (Owner) | ์ ํจํ ์ด๋ฉ์ผ ์ฃผ์ | 20์ |
| ์ปฌ๋ผ ์ค๋ช | 80% ์ด์ ์ปฌ๋ผ์ ์ค๋ช | 20์ |
| ํ๊ทธ | ์ต์ 2๊ฐ ์ด์์ ํ๊ทธ | 15์ |
| ์ ์ ๋ | ์ต๊ทผ 30์ผ ์ด๋ด ์ ๋ฐ์ดํธ | 15์ |
quality_score = (
(description_score * 0.3) +
(owner_score * 0.2) +
(column_description_score * 0.2) +
(tags_score * 0.15) +
(freshness_score * 0.15)
)
# ์์:
customers ํ
์ด๋ธ:
- Description: 30/30 (์๋ฒฝํ ์ค๋ช
)
- Owner: 20/20 (์ ํจํ ์์ ์)
- Column Description: 16/20 (80%)
- Tags: 15/15 (3๊ฐ ํ๊ทธ)
- Freshness: 15/15 (์ด์ ์
๋ฐ์ดํธ)
= 96/100 = 0.96 (Gold tier)
3.5 ๋ฉํ๋ฐ์ดํฐ ๊ฑฐ๋ฒ๋์ค
์น์ธ ์ํฌํ๋ก์ฐ
์ค์ํ ๋ฉํ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ์น์ธ ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง๋์ด๊ฐ ์ ํ ์ด๋ธ์ ๋ฉํ๋ฐ์ดํฐ ์์ฑ
- ๋ฐ์ดํฐ ๊ฑฐ๋ฒ๋์ค ํ์ ๋ฆฌ๋ทฐ ์์ฒญ
- ๋ฆฌ๋ทฐ์ด๊ฐ ์ค๋ช , ๋ถ๋ฅ, ํ๊ทธ ๊ฒํ
- ์น์ธ ํ ์นดํ๋ก๊ทธ์ ๊ฒ์
- ๊ด๋ จ ํ์ ์๋ฆผ ๋ฐ์ก
๋ฉํ๋ฐ์ดํฐ ํ์ค
- ๋ช ๋ช ๊ท์น: snake_case, ์๋ฌธ์ ์ฌ์ฉ
- ์ค๋ช ๊ท์น: ํ๊ธ/์์ด, ์ต์ 20์, ๋ชฉ์ ํฌํจ
- ํ๊ทธ ๊ท์น: kebab-case, ์ฌ์ ์ ์๋ ํ๊ทธ ์ฌ์ฉ
- ์์ ์ ๊ท์น: ํ ์ด๋ฉ์ผ ์ฃผ์ ์ฐ์
3.6 ๋ฉํ๋ฐ์ดํฐ ๋๊ธฐํ
์ค์๊ฐ vs ๋ฐฐ์น ๋๊ธฐํ
| ๋ฐฉ์ | ์ฅ์ | ๋จ์ | ์ ํฉํ ๊ฒฝ์ฐ |
|---|---|---|---|
| ์ค์๊ฐ | ์ฆ๊ฐ ๋ฐ์ | ๋์ ๋ถํ | ์ค์ ์ด์ DB |
| ๋ฐฐ์น (1์๊ฐ) | ๊ท ํ | ์ง์ฐ ์์ | ๋๋ถ๋ถ์ ๊ฒฝ์ฐ |
| ๋ฐฐ์น (์ผ๊ฐ) | ๋ฎ์ ๋ถํ | ํฐ ์ง์ฐ | ์์นด์ด๋ธ ๋ฐ์ดํฐ |
์ฆ๋ถ ๋๊ธฐํ
์ ์ฒด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ ์์งํ๋ ๋์ , ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํฉ๋๋ค.
# ์ฆ๋ถ ๋๊ธฐํ ์ฟผ๋ฆฌ
SELECT *
FROM metadata_changelog
WHERE last_modified > :last_sync_timestamp
ORDER BY last_modified ASC;
3.7 ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ์ ์ํคํ ์ฒ
์ ์ฅ์ ์ ํ
| ์ ์ฅ์ | ์ฉ๋ | ์์ |
|---|---|---|
| ๊ด๊ณํ DB | ๊ตฌ์กฐํ๋ ๋ฉํ๋ฐ์ดํฐ | PostgreSQL, MySQL |
| ๋ฌธ์ DB | ์ ์ฐํ ์คํค๋ง | MongoDB |
| ๊ทธ๋ํ DB | ๊ณ๋ณด, ๊ด๊ณ | Neo4j, JanusGraph |
| ๊ฒ์ ์์ง | ์ ๋ฌธ ๊ฒ์ | Elasticsearch |
๋๋ถ๋ถ์ ๋ฐ์ดํฐ ์นดํ๋ก๊ทธ๋ ์ฌ๋ฌ ์ ์ฅ์๋ฅผ ์กฐํฉํฉ๋๋ค:
- PostgreSQL: ๋ฉ์ธ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ
- Neo4j: ๊ณ๋ณด ๊ทธ๋ํ ์ ์ฅ
- Elasticsearch: ๊ฒ์ ์ธ๋ฑ์ค
- Redis: ์บ์
3.8 ์ค์ ํ
- ์๋ํ ์ฐ์ : ์์์ ์ต์ํ, ์๋ ์์ง ๊ทน๋ํ
- ์ ์ง์ ๊ฐ์ : ์๋ฒฝํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ง๋ค๋ ค ํ์ง ๋ง๊ฒ
- ์ธ์ผํฐ๋ธ ์ ๊ณต: ๋ฉํ๋ฐ์ดํฐ ์์ฑ/๊ฐ์ ์ ๋ฆฌ์๋
- ํ์ง ๋์๋ณด๋: ํ๋ณ ๋ฉํ๋ฐ์ดํฐ ํ์ง ์ ์ ๊ณต๊ฐ
- ํ ํ๋ฆฟ ์ ๊ณต: ์ข์ ์ค๋ช ์ ์์ ์ ๊ณต
3.9 ๋ค์ ์ฅ ์๊ณ
๋ค์ ์ฅ์์๋ Data Lineage Tracking์ ๋ค๋ฃน๋๋ค. ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ถ์ ํ๊ณ ๊ณ๋ณด ๊ทธ๋ํ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค.