Scrambling Guide¶
개요¶
Datatrans의 스크램블링은 **파이썬 함수(Function) 기반**으로 동작합니다.
스크램블링 적용 흐름은 다음과 같습니다.
- 스크램블링 함수 작성
- 함수를 도메인(domain)으로 등록
- YAML로 테이블/컬럼에 도메인 적용
- 전송 실행 시
scrambles파라미터로 YAML 지정
1. 스크램블링 함수 작성¶
1.1 작성 위치¶
스크램블링 함수는 $DATATRANS_HOME/rule/ 하위에 .py 파일로 작성합니다.
1.2 함수 작성 규칙¶
Datatrans는 도메인에 등록된 파이썬 함수를 동적으로 로드하여 실행합니다.
- 함수는 반드시 실제로 존재해야 합니다.
- 도메인 등록 시 지정한 함수명과 정확히 일치해야 합니다.
- 함수 시그니처(인자 개수)에 따라 입력값 전달 방식이 달라집니다.
| 인자 개수 | 동작 |
|---|---|
| 0개 | 입력값 없이 호출 |
| 1개 이상 | YAML에서 지정한 args 또는 columns의 현재 값이 순서대로 positional 인자로 전달 |
1.3 예시: rules.py¶
# $DATATRANS_HOME/rule/rules.py
import random
import string
def get_name(*_):
# 예시: 임의 이름 생성
names = ["KIM", "LEE", "PARK", "CHOI", "JUNG"]
return random.choice(names)
def generate_token(prefix="T"):
# 예시: 토큰 생성
suffix = "".join(random.choices(string.ascii_uppercase + string.digits, k=10))
return f"{prefix}_{suffix}"
def mask_email(local, domain):
# 예시: email을 두 컬럼(local/domain) 입력값으로 받아 1개의 변환값을 반환
return f"user_{abs(hash(local)) % 100000}@{domain}"
2. 스크램블링 함수를 도메인(domain)으로 등록¶
2.1 작성 위치¶
도메인 등록 정보는 아래 위치에 작성합니다.
2.2 작성 방식¶
아래 형식으로 한 줄에 하나씩 작성합니다.
$DATATRANS_HOME 표기는 내부에서 실제 경로로 치환됩니다.
예시:
SC_NAME > $DATATRANS_HOME/rule/rules.py get_name
SC_TOKEN > $DATATRANS_HOME/rule/rules.py generate_token
SC_EMAIL > $DATATRANS_HOME/rule/rules.py mask_email
2.3 도메인의 의미¶
여기서 도메인(domain)은 Datatrans에서 스크램블링 규칙을 지칭하는 별칭입니다.
- YAML의
rules:에는 함수명이 아니라 도메인명을 작성합니다. - 예:
SC_NAME
2.4 주의사항¶
주의
- 도메인명은 중복되지 않게 관리하는 것을 권장합니다.
- 파일 경로 또는 함수명이 잘못되면 해당 도메인은 로드되지 않습니다.
3. YAML로 스크램블링 도메인 적용¶
3.1 파일 형식¶
스크램블링 규칙은 .yaml 파일로 작성합니다.
최상위 키는 Target 기준 SCHEMA.TABLE 형식입니다.
3.2 기본 필드¶
각 규칙 항목에서 주로 사용하는 필드는 아래와 같습니다.
columns (필수)¶
스크램블링 결과를 적용할 대상 컬럼입니다.
여러 컬럼은 콤마(,)로 구분하여 나열합니다.
주의
columns가 여러 개인데 함수가 단일 값만 반환하면 첫 번째 컬럼만 변경되고 나머지는 유지될 수 있습니다.- 여러 컬럼을 동시에 채우려면 함수가
list또는tuple형태로 동일 개수의 값을 반환하도록 작성하는 것을 권장합니다.
rules (필수)¶
적용할 도메인명입니다.
여러 도메인을 콤마로 나열하면 순차 적용할 수 있습니다.
3.3 고급 옵션: sets (UNIQUE / CONSISTENT)¶
sets를 지정하면 Datatrans가 스크램블 값 생성 시 유일성 또는 일관성을 보장하도록 동작할 수 있습니다.
UNIQUE¶
생성되는 스크램블 값이 중복되지 않도록 보장합니다.
권장 사용 예:
- 토큰
- 가상 키
- 식별자 생성
주의
가능한 값의 공간이 좁으면 고유값이 빨리 고갈되어 오류가 발생할 수 있습니다. 예: 4자리 숫자만 사용하는 경우
CONSISTENT¶
같은 입력값(before value)에 대해 항상 같은 스크램블 값이 생성되도록 보장합니다.
- 내부적으로
rule_name + before_value를 기준으로 값을 저장하고 재사용합니다.
위 예시는 EMP_ID가 같으면 항상 같은 EMP_NAME이 생성되도록 합니다.
주의
UNIQUE와 CONSISTENT는 동시에 지정하지 않는 것을 권장합니다. 내부 동작상 UNIQUE가 우선 분기될 수 있으므로 의도와 다르게 동작할 수 있습니다.
3.4 고급 옵션: args (입력값 지정)¶
기본적으로 Datatrans는 스크램블 함수의 입력값(before value)을 columns의 기존 값에서 가져옵니다.
하지만 args를 지정하면, 함수 입력값을 args에 명시한 컬럼들에서 가져옵니다.
의미:
| 필드 | 역할 |
|---|---|
columns | 변경 결과를 적용할 대상 컬럼 |
args | 함수에 전달할 입력 컬럼 |
4. 전송 실행 시 스크램블링 적용¶
전송 실행 시 scrambles 파라미터에 YAML 파일 경로를 지정하면 됩니다.
5. 전체 예시¶
5.1 함수 파일¶
# $DATATRANS_HOME/rule/rules.py
import random
import string
import hashlib
def get_name(*_):
names = ["KIM", "LEE", "PARK", "CHOI", "JUNG", "KANG", "CHO"]
return random.choice(names)
def generate_token(prefix="T"):
suffix = "".join(random.choices(string.ascii_uppercase + string.digits, k=10))
return f"{prefix}_{suffix}"
def mask_phone(phone):
if not phone:
return "010-****-****"
return phone[:3] + "-****-" + phone[-4:]
def hash_email(email):
if not email:
return "anonymous@example.com"
hashed = hashlib.md5(email.encode()).hexdigest()[:8]
return f"user_{hashed}@masked.com"
5.2 도메인 등록 파일¶
# $DATATRANS_HOME/rule_define
SC_NAME > $DATATRANS_HOME/rule/rules.py get_name
SC_TOKEN > $DATATRANS_HOME/rule/rules.py generate_token
SC_PHONE > $DATATRANS_HOME/rule/rules.py mask_phone
SC_EMAIL > $DATATRANS_HOME/rule/rules.py hash_email
5.3 스크램블 YAML¶
# scramble_rule.yaml
USR_TARGET.EMPLOYEES:
- columns: EMP_NAME
rules: SC_NAME
- columns: PHONE
rules: SC_PHONE
- columns: EMAIL
rules: SC_EMAIL
USR_TARGET.API_TOKENS:
- columns: TOKEN
rules: SC_TOKEN
sets: [UNIQUE]
USR_TARGET.CUSTOMERS:
- columns: CUSTOMER_NAME
rules: SC_NAME
sets: [CONSISTENT]
args: CUSTOMER_ID
5.4 실행 명령¶
datatrans \
source=APP_SOURCE/password@192.168.0.10:1521/SOURCEPDB \
target=APP_TARGET/password@192.168.0.20:1521/TARGETPDB \
schemas=USR_SOURCE \
scrambles=/home/user/scramble_rule.yaml \
degree=4 \
table_action=TRUNCATE \
jobname=scramble_job
6. 운영 시 확인할 사항¶
체크리스트
- 함수 파일 경로와 함수명이 정확한지 확인하십시오.
- YAML의
rules:에는 함수명이 아니라 도메인명을 사용해야 합니다. - 여러 컬럼을 한 번에 변경할 때는 함수 반환값 개수를 점검하십시오.
UNIQUE사용 시 값 공간이 충분한지 확인하십시오.CONSISTENT사용 시 어떤 입력 컬럼을 기준으로 일관성을 유지할지args를 명확히 지정하십시오.