콘텐츠로 이동

Scrambling Guide

개요

Datatrans의 스크램블링은 **파이썬 함수(Function) 기반**으로 동작합니다.

스크램블링 적용 흐름은 다음과 같습니다.

  1. 스크램블링 함수 작성
  2. 함수를 도메인(domain)으로 등록
  3. YAML로 테이블/컬럼에 도메인 적용
  4. 전송 실행 시 scrambles 파라미터로 YAML 지정

1. 스크램블링 함수 작성

1.1 작성 위치

스크램블링 함수는 $DATATRANS_HOME/rule/ 하위에 .py 파일로 작성합니다.

$DATATRANS_HOME/rule/rules.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 작성 위치

도메인 등록 정보는 아래 위치에 작성합니다.

$DATATRANS_HOME/rule_define

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 형식입니다.

USR_TARGET.EMP:
  - columns: COL_A
    rules: SC_NAME

3.2 기본 필드

각 규칙 항목에서 주로 사용하는 필드는 아래와 같습니다.

columns (필수)

스크램블링 결과를 적용할 대상 컬럼입니다.

여러 컬럼은 콤마(,)로 구분하여 나열합니다.

- columns: FIRST_NAME,LAST_NAME
  rules: SC_NAME

주의

  • columns가 여러 개인데 함수가 단일 값만 반환하면 첫 번째 컬럼만 변경되고 나머지는 유지될 수 있습니다.
  • 여러 컬럼을 동시에 채우려면 함수가 list 또는 tuple 형태로 동일 개수의 값을 반환하도록 작성하는 것을 권장합니다.

rules (필수)

적용할 도메인명입니다.

여러 도메인을 콤마로 나열하면 순차 적용할 수 있습니다.

- columns: EMP_NAME
  rules: SC_NAME

3.3 고급 옵션: sets (UNIQUE / CONSISTENT)

sets를 지정하면 Datatrans가 스크램블 값 생성 시 유일성 또는 일관성을 보장하도록 동작할 수 있습니다.

UNIQUE

생성되는 스크램블 값이 중복되지 않도록 보장합니다.

USR_TARGET.EMP:
  - columns: API_TOKEN
    rules: SC_TOKEN
    sets: [UNIQUE]

권장 사용 예:

  • 토큰
  • 가상 키
  • 식별자 생성

주의

가능한 값의 공간이 좁으면 고유값이 빨리 고갈되어 오류가 발생할 수 있습니다. 예: 4자리 숫자만 사용하는 경우

CONSISTENT

같은 입력값(before value)에 대해 항상 같은 스크램블 값이 생성되도록 보장합니다.

  • 내부적으로 rule_name + before_value를 기준으로 값을 저장하고 재사용합니다.
USR_TARGET.EMP:
  - columns: EMP_NAME
    rules: SC_NAME
    sets: [CONSISTENT]
    args: EMP_ID

위 예시는 EMP_ID가 같으면 항상 같은 EMP_NAME이 생성되도록 합니다.

주의

UNIQUECONSISTENT는 동시에 지정하지 않는 것을 권장합니다. 내부 동작상 UNIQUE가 우선 분기될 수 있으므로 의도와 다르게 동작할 수 있습니다.


3.4 고급 옵션: args (입력값 지정)

기본적으로 Datatrans는 스크램블 함수의 입력값(before value)을 columns의 기존 값에서 가져옵니다.

하지만 args를 지정하면, 함수 입력값을 args에 명시한 컬럼들에서 가져옵니다.

USR_TARGET.EMP:
  - columns: EMAIL
    rules: SC_EMAIL
    args: EMAIL_LOCAL,EMAIL_DOMAIN

의미:

필드 역할
columns 변경 결과를 적용할 대상 컬럼
args 함수에 전달할 입력 컬럼

4. 전송 실행 시 스크램블링 적용

전송 실행 시 scrambles 파라미터에 YAML 파일 경로를 지정하면 됩니다.

scrambles=/path/to/scramble_rule.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. 운영 시 확인할 사항

체크리스트

  1. 함수 파일 경로와 함수명이 정확한지 확인하십시오.
  2. YAML의 rules:에는 함수명이 아니라 도메인명을 사용해야 합니다.
  3. 여러 컬럼을 한 번에 변경할 때는 함수 반환값 개수를 점검하십시오.
  4. UNIQUE 사용 시 값 공간이 충분한지 확인하십시오.
  5. CONSISTENT 사용 시 어떤 입력 컬럼을 기준으로 일관성을 유지할지 args를 명확히 지정하십시오.