> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sifi.life/llms.txt
> Use this file to discover all available pages before exploring further.

# DABs 기초: 개념과 리소스 유형

## 개념

> **Databricks Declarative Automation Bundles (DABs)** 는 Databricks 리소스(Jobs, Pipelines, 대시보드 등)를 **코드로 정의하고 배포** 하는 IaC(Infrastructure as Code) 도구입니다. YAML 파일로 리소스를 선언하고, `databricks bundle` CLI 명령어로 배포합니다.

> **명칭 변경**: 2025년부터 **Databricks Asset Bundles (DABs)** 가 **Declarative Automation Bundles** 로 리브랜딩되었습니다. CLI 명령어(`databricks bundle`)와 설정 파일 구조는 동일합니다. 기존 문서나 블로그에서 "DABs"나 "Asset Bundles"로 언급되는 것은 같은 기능을 가리킵니다.

> **IaC(Infrastructure as Code)란?** 인프라(서버, 데이터베이스, 파이프라인 등)를 수동으로 설정하는 대신, **코드(설정 파일)로 정의** 하여 자동으로 배포하는 방식입니다. 코드이므로 Git으로 버전 관리할 수 있고, 코드 리뷰를 통해 변경 사항을 검토할 수 있으며, 여러 환경(dev, staging, prod)에 동일한 구성을 일관되게 배포할 수 있습니다.

***

## 1. 왜 DABs가 필요한가

### 수동 배포(UI 클릭)의 고려사항

실제 엔터프라이즈 환경에서 UI로만 Databricks 리소스를 관리하면 다음과 같은 문제가 발생합니다.

| 문제               | 구체적인 현상                               |
| ---------------- | ------------------------------------- |
| **재현 불가**        | "누가, 언제, 어떤 설정으로 만들었지?" 추적이 어렵습니다     |
| **환경 불일치**       | 개발 환경과 프로덕션 환경의 설정이 미묘하게 달라 버그가 발생합니다 |
| **온보딩 비용**       | 신규 팀원이 리소스 구조를 파악하려면 UI를 일일이 탐색해야 합니다 |
| **롤백 불가**        | 잘못된 변경을 되돌리는 공식적인 방법이 없습니다            |
| **감사(Audit) 곤란** | 누가 어떤 Job 설정을 바꿨는지 추적하기 어렵습니다         |
| **코드 리뷰 불가**     | 인프라 변경에 대한 팀 리뷰 프로세스가 없습니다            |

### IaC가 이 문제를 해결하는 방법

DABs는 모든 리소스 정의를 YAML 파일로 관리합니다. Git에 커밋되는 순간 다음 모든 것이 자동으로 확보됩니다.

* **버전 이력** — 언제, 누가, 무엇을 바꿨는지 `git log`로 확인
* **코드 리뷰** — PR(Pull Request)을 통해 변경 사항을 팀이 검토
* **재현 가능성** — 동일 YAML로 어느 환경에나 동일한 리소스 생성
* **자동화** — CI/CD 파이프라인에서 배포 자동 실행

### DABs vs Terraform — 무엇을 선택해야 하나

| 비교 항목              | DABs                     | Terraform                              |
| ------------------ | ------------------------ | -------------------------------------- |
| **관리 대상**          | Databricks 리소스 전용        | 모든 클라우드 인프라                            |
| **설정 언어**          | YAML                     | HCL (HashiCorp Configuration Language) |
| **학습 곡선**          | 낮음 (Databricks 개념만 알면 됨) | 중간\~높음 (Terraform 개념 추가 필요)            |
| **상태 관리**          | Databricks 플랫폼이 자동 관리    | `terraform.tfstate` 파일 직접 관리 필요        |
| **Databricks 신기능** | 즉시 반영 (네이티브)             | Provider 업데이트 후 사용 가능                  |
| **적합한 경우**         | Databricks 리소스만 관리       | VPC, S3, IAM + Databricks 통합 관리        |
| **혼합 사용**          | 가능 — 실제로 권장되는 패턴         | 가능 — Terraform으로 클라우드 인프라, DABs로 워크로드  |

> **권장 패턴**: 클라우드 인프라(VPC, 서브넷, IAM Role)는 Terraform으로, Databricks 워크로드(Jobs, Pipelines, Dashboards)는 DABs로 관리합니다.

***

## 2. 핵심 개념

### Bundle 구조

DABs 프로젝트의 핵심은 `databricks.yml`이라는 메인 설정 파일입니다. 이 파일을 중심으로 전체 번들이 구성됩니다.

```
my-project/
├── databricks.yml          # 메인 설정 (필수)
├── resources/
│   ├── jobs.yml            # Job 정의
│   ├── pipelines.yml       # DLT Pipeline 정의
│   └── dashboards.yml      # 대시보드 정의
├── src/
│   ├── notebooks/          # 노트북 소스
│   ├── pipelines/          # DLT 파이프라인 소스
│   └── python/             # Python 모듈
└── tests/                  # 테스트 코드
```

### 핵심 4대 구성 요소

| 구성 요소         | 설명                                                  |
| ------------- | --------------------------------------------------- |
| **bundle**    | 번들 이름, 버전 등 메타데이터를 정의합니다                            |
| **resources** | Jobs, Pipelines, Dashboards 등 Databricks 리소스를 선언합니다 |
| **targets**   | dev, staging, prod 등 배포 환경별 설정을 정의합니다               |
| **variables** | 환경별로 달라지는 값(카탈로그명, 웨어하우스 ID 등)을 변수로 관리합니다           |

### Variables (변수)

변수는 두 가지 방식으로 값을 받습니다.

```yaml theme={null}
variables:
  # 1. 기본값 지정
  catalog:
    description: "Unity Catalog 카탈로그 이름"
    default: "dev_catalog"

  # 2. 런타임에 CLI 인자로 전달 (기본값 없음)
  warehouse_id:
    description: "SQL Warehouse ID"
```

변수 참조는 `${var.변수명}` 형식을 사용합니다. Bundle 자체 메타데이터는 `${bundle.name}`, `${bundle.target}` 으로 참조할 수 있습니다.

```bash theme={null}
# CLI에서 변수 오버라이드
databricks bundle deploy -t prod --var="catalog=prod_catalog"
```

***

## 3. 프로젝트 초기화

### databricks bundle init

Databricks CLI가 제공하는 공식 템플릿으로 프로젝트를 빠르게 시작할 수 있습니다.

```bash theme={null}
# 대화형 템플릿 선택 (권장)
databricks bundle init

# 특정 템플릿 직접 지정
databricks bundle init default-python
databricks bundle init default-sql

# GitHub 저장소의 커스텀 템플릿 사용
databricks bundle init https://github.com/my-org/my-dab-template
```

실행 후 템플릿 선택 대화가 진행됩니다.

```
Template to use [default-python]:
> default-python
> default-sql
> dbt-sql
> mlops-stacks

Project name: my-etl-pipeline
Include a stub (sample) notebook [yes]: yes
```

### 공식 내장 템플릿

| 템플릿              | 적합한 경우                          |
| ---------------- | ------------------------------- |
| `default-python` | Python 노트북/Job 위주의 일반적인 파이프라인   |
| `default-sql`    | SQL 위주, DLT + SQL 작업 조합         |
| `dbt-sql`        | dbt Core와 Databricks를 연동하는 프로젝트 |
| `mlops-stacks`   | ML 모델 훈련\~서빙 전체 MLOps 워크플로      |

***

## 4. 주요 리소스 유형

### 4-1. Jobs

```yaml theme={null}
# resources/jobs.yml
resources:
  jobs:
    daily_etl:
      name: "daily-sales-etl-${bundle.target}"
      schedule:
        quartz_cron_expression: "0 0 2 * * ?"  # 매일 새벽 2시 KST
        timezone_id: "Asia/Seoul"
      email_notifications:
        on_failure:
          - "data-team@company.com"

      tasks:
        - task_key: "ingest"
          pipeline_task:
            pipeline_id: "${resources.pipelines.medallion.id}"

        - task_key: "validate"
          depends_on:
            - task_key: "ingest"
          sql_task:
            query:
              query_text: >
                SELECT COUNT(*) AS cnt
                FROM ${var.catalog}.ecommerce.silver_orders
                WHERE order_date = CURRENT_DATE() - INTERVAL 1 DAY
            warehouse_id: "${var.warehouse_id}"

        - task_key: "notify"
          depends_on:
            - task_key: "validate"
          notebook_task:
            notebook_path: "src/notebooks/send_report.py"
          environment_key: "default"

      environments:
        - environment_key: "default"
          spec:
            client: "1"
            dependencies:
              - "requests>=2.28"
              - "pandas>=2.0"
```

**핵심 포인트**: `${resources.pipelines.medallion.id}` 처럼 다른 리소스를 참조할 수 있습니다. DABs가 배포 순서를 자동으로 결정합니다.

### 4-2. Pipelines (DLT, Delta Live Tables)

```yaml theme={null}
# resources/pipelines.yml
resources:
  pipelines:
    medallion:
      name: "medallion-pipeline-${bundle.target}"
      catalog: "${var.catalog}"
      schema: "ecommerce"
      serverless: true
      continuous: false
      channel: "CURRENT"
      libraries:
        - notebook:
            path: "src/pipelines/bronze_layer.sql"
        - notebook:
            path: "src/pipelines/silver_layer.py"
        - notebook:
            path: "src/pipelines/gold_layer.py"
      notifications:
        - on_failure:
            - "data-team@company.com"
      configuration:
        source_path: "/Volumes/${var.catalog}/raw/landing"
```

### 4-3. Dashboards (AI/BI 대시보드)

대시보드도 YAML로 코드화하여 Git 관리가 가능합니다.

```yaml theme={null}
# resources/dashboards.yml
resources:
  dashboards:
    sales_overview:
      display_name: "Sales Overview - ${bundle.target}"
      file_path: "src/dashboards/sales_overview.lvdash.json"
      warehouse_id: "${var.warehouse_id}"
      embed_credentials: false
```

대시보드 파일(`*.lvdash.json`)은 Databricks UI에서 "Export as code" 기능으로 추출합니다.

### 4-4. Model Serving Endpoints

```yaml theme={null}
# resources/model_serving.yml
resources:
  model_serving_endpoints:
    fraud_detector:
      name: "fraud-detector-${bundle.target}"
      config:
        served_models:
          - model_name: "${var.catalog}.ml.fraud_model"
            model_version: "1"
            workload_size: "Small"
            scale_to_zero_enabled: true
      rate_limits:
        - calls: 1000
          renewal_period: "minute"
```

### 4-5. Quality Monitors & Alerts

```yaml theme={null}
# resources/quality.yml
resources:
  quality_monitors:
    orders_monitor:
      table_name: "${var.catalog}.ecommerce.silver_orders"
      assets_dir: "/Shared/monitors/orders"
      output_schema_name: "${var.catalog}.monitoring"
      inference_log:
        granularities: ["1 day"]
        model_id_col: "model_version"
        prediction_col: "prediction"
        timestamp_col: "scored_at"

  alerts:
    pipeline_failure_alert:
      display_name: "Pipeline Failure - ${bundle.target}"
      condition:
        op: "GREATER_THAN"
        operand:
          column:
            name: "failed_count"
        threshold:
          value:
            double_value: 0
      query_id: "${var.failure_query_id}"
      seconds_to_retrigger: 3600
```

***
