IBM Db2 설정

IBM Db2 설정

ibm-dbt-db2 어댑터로 IBM Db2 데이터베이스를 dbt에서 사용하는 방법을 정리한 페이지예요. 인스턴스 요구 사항부터 시드 데이터 타입, materialization 전략, 스냅샷, 제약 조건, 성능 최적화, 권한 관리, 대소문자 처리까지 폭넓게 다뤄요.

출처: dbt 공식 문서

본문

인스턴스 요구 사항

ibm-dbt-db2 어댑터로 IBM Db2를 사용하려면, 연결된 인스턴스에 테이블과 뷰 같은 객체를 만들고, 이름을 바꾸고, 변경하고, 삭제할 수 있는 데이터베이스가 있어야 해요. ibm-dbt-db2 어댑터로 인스턴스에 연결하는 사용자는 대상 데이터베이스와 스키마에 필요한 권한을 갖고 있어야 해요.

자세한 내용은 공식 IBM Db2 문서를 참고해요.

지원되는 Db2 플랫폼

ibm-dbt-db2 어댑터는 다음 IBM Db2 플랫폼을 지원해요.

  • Db2 for Linux, Unix, and Windows (LUW) - 버전 9.7 이상
  • Db2 for z/OS - 버전 11 이상
  • Db2 for iSeries - 호환 가능한 버전

시드와 데이터 타입

ibm-dbt-db2 어댑터는 시드 파일에서 모든 Db2 데이터 타입을 폭넓게 지원해요. 이 기능을 활용하려면 시드 설정에서 각 컬럼의 데이터 타입을 명시적으로 정의해야 해요.

컬럼 데이터 타입은 dbt가 지원하는 대로 dbt_project.yml 파일이나 프로퍼티 파일에서 설정할 수 있어요. 시드 설정과 모범 사례에 대한 자세한 내용은 dbt 시드 설정 문서를 참고해요.

시드 설정 예시

dbt_project.yml에서:

seeds:
  my_project:
    raw_customers:
      +column_types:
        id: INTEGER
        name: VARCHAR(100)
        email: VARCHAR(255)
        created_at: TIMESTAMP
        is_active: BOOLEAN

지원되는 Db2 데이터 타입

Db2 데이터 타입 설명 사용 예시
INTEGER 32비트 정수 id: INTEGER
BIGINT 64비트 정수 large_id: BIGINT
SMALLINT 16비트 정수 status_code: SMALLINT
DECIMAL(p,s) 고정 소수점 price: DECIMAL(10,2)
FLOAT 부동 소수점 수 rate: FLOAT
DOUBLE 배정밀도 부동 소수점 measurement: DOUBLE
VARCHAR(n) 가변 길이 문자열 name: VARCHAR(100)
CHAR(n) 고정 길이 문자열 code: CHAR(10)
CLOB 문자 대형 객체 description: CLOB
BLOB 이진 대형 객체 image_data: BLOB
DATE 날짜 값 birth_date: DATE
TIME 시간 값 start_time: TIME
TIMESTAMP 날짜와 시간 created_at: TIMESTAMP
BOOLEAN 불리언 값 is_active: BOOLEAN
XML XML 문서 config: XML
GRAPHIC(n) 고정 길이 그래픽 문자열 unicode_text: GRAPHIC(50)
VARGRAPHIC(n) 가변 길이 그래픽 문자열 unicode_name: VARGRAPHIC(100)
DBCLOB 더블바이트 CLOB large_unicode: DBCLOB

Materialization 전략

ibm-dbt-db2 어댑터는 모든 표준 dbt materialization을 지원해요.

Table materialization

데이터베이스에 물리적 테이블을 만들어요. 지정하지 않으면 이게 기본 materialization이에요.

{{ config(materialized='table') }}

SELECT * FROM source_table

View materialization

데이터베이스 뷰를 만들어요. 뷰는 데이터를 물리적으로 저장하지 않는 가상 테이블이에요.

{{ config(materialized='view') }}

SELECT * FROM source_table

Incremental materialization

새 레코드나 변경된 레코드만 처리하며 테이블을 점진적으로 만들어요. ibm-dbt-db2 어댑터는 두 가지 incremental 전략을 지원해요.

Merge 전략 (기본값)

효율적인 upsert를 위해 Db2의 MERGE 문을 사용해요.

{{
  config(
    materialized='incremental',
    unique_key='id',
    incremental_strategy='merge'
  )
}}

SELECT * FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
Delete+insert 전략

일치하는 레코드를 삭제한 다음 새 레코드를 삽입해요.

{{
  config(
    materialized='incremental',
    unique_key='id',
    incremental_strategy='delete+insert'
  )
}}

SELECT * FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}

Ephemeral materialization

단일 dbt run이 진행되는 동안에만 존재하는 Common Table Expression(CTE)을 만들어요.

{{ config(materialized='ephemeral') }}

SELECT * FROM source_table

스냅샷

ibm-dbt-db2 어댑터는 느린 변화 차원(SCD Type 2) 추적을 위한 dbt 스냅샷을 지원해요. 스냅샷은 서로 다른 시점의 데이터 상태를 포착해요.

스냅샷 예시:

{% snapshot customers_snapshot %}

{{
  config(
    target_schema='snapshots',
    unique_key='id',
    strategy='timestamp',
    updated_at='updated_at'
  )
}}

SELECT * FROM {{ source('raw', 'customers') }}

{% endsnapshot %}

제약 조건

ibm-dbt-db2 어댑터는 모델에서 제약 조건 정의를 지원하지만, 적용(enforcement) 수준은 달라요.

제약 조건 유형 지원 수준 비고
NOT NULL ✅ 적용됨 Db2가 완전히 지원하고 적용해요
CHECK ⚠️ 미적용 dbt 컨텍스트에서는 정의만 되고 적용되진 않아요
UNIQUE ⚠️ 미적용 dbt 컨텍스트에서는 정의만 되고 적용되진 않아요
PRIMARY KEY ⚠️ 미적용 dbt 컨텍스트에서는 정의만 되고 적용되진 않아요
FOREIGN KEY ⚠️ 미적용 dbt 컨텍스트에서는 정의만 되고 적용되진 않아요

제약 조건을 포함한 예시:

{{
  config(
    materialized='table'
  )
}}

SELECT
  id,
  name,
  email,
  created_at
FROM source_table

스키마 YAML에서 제약 조건을 정의해요.

models:
  - name: customers
    columns:
      - name: id
        constraints:
          - type: not_null
          - type: primary_key
      - name: email
        constraints:
          - type: not_null

성능 최적화

인덱싱

dbt가 인덱스를 직접 관리하지는 않지만, post-hook을 사용해 만들 수 있어요.

{{
  config(
    materialized='table',
    post_hook=[
      "CREATE INDEX idx_customer_email ON {{ this }} (email)",
      "CREATE INDEX idx_customer_created ON {{ this }} (created_at)"
    ]
  )
}}

SELECT * FROM source_table

테이블 구성

Db2는 서로 다른 테이블 구성 유형을 지원해요. post-hook으로 지정할 수 있어요.

{{
  config(
    materialized='table',
    post_hook=[
      "ALTER TABLE {{ this }} ORGANIZE BY ROW"
    ]
  )
}}

SELECT * FROM source_table

권한 관리

ibm-dbt-db2 어댑터는 데이터베이스 객체에 권한(grants)을 관리하는 것을 지원해요.

{{
  config(
    materialized='table',
    grants={
      'select': ['reporting_role', 'analyst_user'],
      'insert': ['etl_role'],
      'update': ['etl_role']
    }
  )
}}

SELECT * FROM source_table

대소문자 처리

Db2는 기본적으로 따옴표 없이 쓴 식별자를 대문자로 바꿔요. 어댑터가 이를 자동으로 처리하지만, 다음을 기억해 두세요.

  • 따옴표 없이 쓴 테이블·컬럼 이름은 대문자로 바뀌어요.
  • 대소문자를 보존하려면 큰따옴표를 사용해요: "MyTable" vs MYTABLE
  • 어댑터는 dbt 작업을 위해 대소문자 변환을 자동으로 처리해요.

권장 사항

  • SQL 문서 확인: IBM Db2 SQL Reference를 검토해 플랫폼 특유의 기능과 제한을 이해해요.
  • Incremental 모델 사용: 대용량 데이터셋에서는 merge 전략과 함께 incremental materialization을 사용해 최적의 성능을 얻어요.
  • 명시적 데이터 타입: 올바른 데이터 로딩을 위해 시드 설정에서 데이터 타입을 항상 명시적으로 정의해요.
  • 연결 풀링: 프로파일에서 적절한 thread 수를 사용해 병렬 처리와 연결 오버헤드의 균형을 맞춰요.
  • 프로덕션에서 SSL/TLS: 전송 중 데이터를 보호하려면 프로덕션 데이터베이스에 SSL/TLS 보안을 활성화해요.
  • 성능 모니터링: Db2 내장 모니터링 도구로 쿼리 성능을 추적하고 모델을 최적화해요.
  • 점진적 테스트: incremental 모델을 개발할 때는 전체 데이터셋에 돌리기 전에 작은 데이터 샘플로 먼저 테스트해요.

더 알아보기 (Learn more)