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"vsMYTABLE - 어댑터는 dbt 작업을 위해 대소문자 변환을 자동으로 처리해요.
권장 사항
- SQL 문서 확인: IBM Db2 SQL Reference를 검토해 플랫폼 특유의 기능과 제한을 이해해요.
- Incremental 모델 사용: 대용량 데이터셋에서는
merge전략과 함께 incremental materialization을 사용해 최적의 성능을 얻어요. - 명시적 데이터 타입: 올바른 데이터 로딩을 위해 시드 설정에서 데이터 타입을 항상 명시적으로 정의해요.
- 연결 풀링: 프로파일에서 적절한 thread 수를 사용해 병렬 처리와 연결 오버헤드의 균형을 맞춰요.
- 프로덕션에서 SSL/TLS: 전송 중 데이터를 보호하려면 프로덕션 데이터베이스에 SSL/TLS 보안을 활성화해요.
- 성능 모니터링: Db2 내장 모니터링 도구로 쿼리 성능을 추적하고 모델을 최적화해요.
- 점진적 테스트: incremental 모델을 개발할 때는 전체 데이터셋에 돌리기 전에 작은 데이터 샘플로 먼저 테스트해요.
더 알아보기 (Learn more)
- IBM Db2 문서 — 공식 Db2 참고 자료
- dbt 시드 설정 — 시드 파일 구성 방법
- 모델 설정 (model configs) — 공통 모델 설정