AWS DMS(Database Migration Service)의 Table Mapping JSON을 로컬에서 검증하는 데스크톱 GUI 툴. 작성일: 2026-06-17 · 상태: 초안(Draft)
AWS DMS 작업을 만들 때 사용하는 table-mapping JSON은 손으로 편집하는 경우가 많고, 오타·잘못된 enum 값·DMS 고유의 의미 규칙 위반(예: explicit 액션에 와일드카드 사용)을 AWS 콘솔/API에 올리기 전까지는 발견하기 어렵다. 이 툴은 AWS 자격증명 없이 로컬에서 table-mapping JSON을 즉시 검증해, AWS에 적용하기 전에 오류를 잡는 것을 목표로 한다.
- table-mapping JSON의 구조(structure)·타입·enum·필수값 검증
- DMS 고유의 의미(semantic)·교차 필드 규칙 검증 (예:
explicit는 단일 객체만, table-settings는 와일드카드 금지, LOB 모드 상호배타 등) - 오류 위치를 line/column + JSON Pointer로 정확히 지목하고, 에디터에 인라인 마킹
- 오프라인·로컬 전용. 입력 JSON을 외부로 전송하지 않음 (민감한 스키마/테이블명 보호)
- Task Settings JS(
ReplicationTaskSettings) 검증 — 추후 확장 후보 - 실제 AWS DMS API 호출을 통한 라이브 검증 — 추후 확장 후보
- 소스/타겟 DB에 실제 접속하여 스키마/테이블 존재 여부 확인
- JSON 자동 수정(auto-fix) — 추후 확장 후보 (경고만 제시)
| 항목 | 결정 |
|---|---|
| 검증 대상 | Table Mapping JSON (단일 종류) |
| 포함 룰 타입 | selection, transformation, table-settings, post-processing, object-mapping |
| 검증 깊이 | L0 구문 + L1 구조/스키마 + L2 의미/교차필드 (아래 §5) |
| 플랫폼/스택 | Tauri 데스크톱 앱 (Rust 검증 코어 + React/TS 프론트엔드) |
| 동작 모드 | 완전 로컬·오프라인 |
object-mapping 룰(Kinesis/Kafka/DynamoDB 스트리밍 타겟용)은 구조/enum 검증까지 포함하되, 깊은 의미 검증은 1차 범위에서는 기본 수준으로 둔다(§6.6). 사용자가 별도 심화 검증을 선택하지 않았으므로 Phase 2 후보.
| 용어 | 정의 |
|---|---|
| rule | rules 배열의 단일 항목. rule-type에 따라 동작이 다름 |
| object-locator | 룰이 적용될 소스 객체(스키마/테이블/컬럼)를 지정하는 객체 |
| wildcard | %(0+ 문자), _(1 문자), [ab](문자집합), [a-d](범위), [_](리터럴 _) |
| diagnostic | 검증 결과 1건 (severity + code + message + 위치) |
| JSON Pointer | RFC 6901 경로 (예: /rules/2/object-locator/schema-name) |
AWS DMS User Guide 기준. 부록 §A에 출처 URL.
{ "rules": [ { /* rule */ }, … ] }- 루트는 객체, 키
rules(필수)는 배열. - 최소 1개 이상의
selection룰이 있어야 함. 나머지 룰 타입은 선택. - DMS는 최대 2 MB의 table-mapping 파일만 처리.
| 필드 | 필수 | 타입 | 제약 |
|---|---|---|---|
rule-type |
✓ | string(enum) | selection·transformation·table-settings·post-processing·object-mapping |
rule-id |
✓ | string/number | 고유한 숫자값 (AWS 예시에서는 문자열 "1"로 표기) |
rule-name |
✓ | string | 고유한 alphanumeric 값 |
룰 타입별 상세 enum/필드는 §6 검증 규칙 카탈로그와 §A 부록에 정리한다. 핵심만:
- selection:
rule-action(include/exclude/explicit),object-locator{schema-name,table-name,table-type?},load-order?,filters? - transformation:
rule-action(18종, §6.3),rule-target(schema/table/column/table-tablespace/index-tablespace),object-locator, 조건부 필드(value,old-value,data-type,expression,primary-key-def,before-image-def) - table-settings:
object-locator(와일드카드 금지),parallel-load?,lob-settings? - post-processing:
rule-action(add-tag) — S3 타겟 전용 - object-mapping:
rule-action(map-record-to-record/map-record-to-document),target-table-name?,mapping-parameters?,kafka-target-topic?
검증은 단계별로 실행되며, 앞 단계가 실패하면 뒤 단계의 일부 검사는 건너뛴다(예: JSON 파싱 실패 시 구조 검증 불가).
| 레벨 | 이름 | 내용 | 실패 시 |
|---|---|---|---|
| L0 | 구문(Syntax) | JSON 파싱 가능 여부, 루트 타입, 2MB 한도, 중복 키 | 후속 레벨 중단 |
| L1 | 구조/스키마(Structure) | 필수 필드 유무, 타입, enum 값, 알 수 없는 필드 | 해당 룰의 L2 일부 스킵 |
| L2 | 의미/교차필드(Semantic) | DMS 고유 규칙: 고유성, 컨텍스트 제약, 상호배타, 와일드카드 허용 여부 등 | — |
| L3 | 베스트프랙티스(권고) | 경고/정보성 (성능·버전 게이팅 등) | — (warning/info) |
진단 심각도(severity): error(AWS가 거부할 항목) · warning(동작하나 위험/권고 위반) · info(참고).
각 규칙은 코드(DMS-xxx), 적용 대상, 심각도, 조건, 메시지를 가진다. 코드 prefix:
SYN(구문) · STR(구조) · SEM(의미) · BP(권고).
숫자 필드 표기 규칙: AWS 예시는 숫자 값을 JSON 숫자 또는 문자열로 표기한다(
"length":"4092","scale":"","bulk-max-size":"100000","load-order":"1"). 따라서 모든 숫자 검증은 숫자/숫자문자열(scale는 빈문자열 포함)을 동일하게 허용한다. 문서화되지 않은 범위(예:precision1–38,bulk-max-size상한)는 강제하지 않는다. 근거:docs/FIELD-CONSTRAINTS.md.
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
SYN001 |
error | JSON 파싱 실패. line/column 포함 메시지 |
SYN002 |
error | 루트가 객체가 아님 (배열/스칼라) |
SYN003 |
warning | 동일 객체 내 중복 키 (JSON 허용하나 모호) |
SYN004 |
error | 파일 크기 > 2 MB (DMS 한도 초과) |
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
STR001 |
error | rules 키 없음 |
STR002 |
error | rules가 배열이 아님 |
STR003 |
warning | rules가 빈 배열 |
STR010 |
error | 룰 항목이 객체가 아님 |
STR011 |
error | 룰에 rule-type 없음 |
STR012 |
error | rule-type 값이 enum 밖 |
STR013 |
error | 룰에 rule-id 없음 |
STR014 |
error | rule-id가 비숫자(예: "abc") — AWS는 "a unique numeric value"만 명시하므로 비숫자만 error |
STR015 |
error | 룰에 rule-name 없음 |
STR016 |
warning | 해당 룰 타입에서 알 수 없는/허용되지 않은 필드 |
STR017 |
warning | rule-id가 음수·소수·2,147,483,647 초과 (값 표시) — 최댓값/부호 규칙은 미문서라 warning |
STR018 |
error | rule-name이 문자열이 아님 |
SEM001 |
error | rule-id 중복 (둘 이상의 룰이 같은 id) |
SEM002 |
error | rule-name 중복 |
SEM003 |
error | selection 룰이 0개 (최소 1개 필요) |
BP001 |
info | 동일 객체를 겨냥한 transformation 룰이 둘 이상 → 낮은 rule-id가 적용됨을 안내 |
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
STR100 |
error | rule-action 없음 |
STR101 |
error | rule-action이 include/exclude/explicit 밖 |
STR102 |
error | object-locator 없음/객체 아님 |
STR103 |
error | object-locator.schema-name 없음 |
STR104 |
error | object-locator.table-name 없음 |
STR105 |
error | table-type가 table/view/all 밖 |
STR106 |
error | load-order가 양의 정수(1–2,147,483,647)가 아님 (숫자 문자열 허용) |
SEM100 |
error | rule-action: explicit인데 schema-name/table-name에 와일드카드 포함 (explicit은 정확한 단일 객체만) |
SEM101 |
warning | filters가 있는데 rule-action != include (필터는 include에서만 적용됨) |
SEM102 |
warning | explicit 액션이 여러 객체를 가리킬 소지 (와일드카드는 STR로 이미 error 처리; 여기선 보조 점검) |
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
STR110 |
error | filters 항목이 객체 아님 |
STR111 |
error | filter-type 값이 source 밖 |
STR112 |
error | column-name 없음 |
STR113 |
error | filter-conditions 없음/배열 아님 |
STR114 |
error | filter-operator 없음 |
STR115 |
error | filter-operator가 enum 밖 (eq,noteq,gte,lte,ste,between,notbetween,null,notnull) |
SEM110 |
error | between/notbetween인데 start-value 또는 end-value 누락 |
SEM111 |
error | null/notnull인데 value/start-value/end-value가 존재(불필요) |
SEM112 |
error | 단일값 연산자(eq,noteq,gte,lte,ste)인데 value 누락 |
SEM113 |
error | 필터 내 column-name/테이블에 와일드카드 사용 (필터는 정확한 이름만) |
BP110 |
warning | 혼합(긍정+부정) 연산자 사용 → DMS 3.5.0+ 필요 (버전 게이팅, §7.4) |
rule-action enum (18종): add-column, include-column, remove-column, rename, convert-lowercase, convert-uppercase, add-prefix, remove-prefix, replace-prefix, add-suffix, remove-suffix, replace-suffix, define-primary-key, change-data-type, add-before-image-columns, data-masking-digits-mask, data-masking-digits-randomize, data-masking-hash-mask.
rule-target enum: schema, table, column, table-tablespace, index-tablespace.
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
STR200 |
error | rule-action 없음 |
STR201 |
error | rule-action이 18종 밖 |
STR202 |
error | rule-target 없음 |
STR203 |
error | rule-target이 enum 밖 |
STR204 |
error | object-locator 없음/객체 아님 |
STR205 |
error | data-type 객체의 type이 DMS 타입 enum 밖 (§A.3) |
STR206 |
error | data-type.precision/scale/length가 음수가 아닌 정수가 아님 |
STR207 |
error | primary-key-def에 name 또는 columns(배열) 누락 |
STR208 |
error | primary-key-def.origin이 unique-index 밖(설정 시) |
STR209 |
error | before-image-def.column-filter가 pk-only/non-lob/all 밖 |
SEM200 |
error | change-data-type / data-masking-*인데 rule-target != column |
SEM201 |
error | add-column인데 value(새 컬럼명) 누락 |
SEM202 |
error | replace-prefix/replace-suffix인데 old-value 누락 |
SEM203 |
error | define-primary-key인데 schema-name/table-name에 와일드카드 사용(금지) |
SEM204 |
error | define-primary-key인데 rule-target != table |
SEM205 |
error | add-before-image-columns인데 rule-target != column |
SEM206 |
error | *-tablespace 타겟인데 table-tablespace-name/index-tablespace-name 동시 지정(상호배타) |
SEM207 |
warning | before-image-def의 column-prefix와 column-suffix가 둘 다 빈 문자열 |
SEM208 |
error | object-locator.column-name 없음인데 rule-target == column |
BP200 |
warning | 특수문자(#,\,/,-) 포함 컬럼에 transformation 적용 (DMS 미지원) |
BP201 |
warning | BLOB/CLOB 컬럼에 remove-column 외 액션 (미지원 가능) |
BP202 |
warning | data-masking-* 액션 → DMS 버전 게이팅 (§7.4) |
BP203 |
info | expression 내 $Column 참조/헤더변수/SQLite 함수 사용 안내 (정적 파싱은 best-effort, §6.3.1) |
BP204 |
warning | data-masking-digits-mask의 value가 단일 문자가 아님 |
expression 필드는 SQLite 식 + DMS 헤더/메타 변수를 포함한다. 완전 파싱은 비목표이나 다음은 점검:
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
BP210 |
warning | 알 수 없는 $AR_H_* / $AR_M_* 변수명 (오타 의심) |
BP211 |
info | 괄호 짝 불일치 등 명백한 구문 이상 (간이 검사) |
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
STR300 |
error | object-locator 없음 |
STR301 |
error | object-locator.schema-name/table-name 없음 |
STR310 |
error | parallel-load.type이 partitions-auto/subpartitions-auto/partitions-list/ranges 밖 |
STR311 |
error | type: ranges인데 columns/boundaries 누락 또는 배열 아님 |
STR312 |
error | type: partitions-list인데 partitions 배열 누락 |
STR313 |
error | lob-settings.mode가 limited/unlimited/none 밖 |
STR314 |
error | bulk-max-size가 음수가 아닌 정수가 아님 |
STR315 |
error | parallel-load의 숫자 옵션(number-of-partitions/max-records-skip-per-page/batch-size)이 음수가 아닌 정수가 아님 |
SEM300 |
error | object-locator.schema-name/table-name에 와일드카드(%) 사용 (table-settings는 정확한 이름만; AWS 검증 오류와 동일) |
SEM301 |
error | lob-settings.mode: limited인데 bulk-max-size가 0 또는 누락 (limited는 nonzero 필요) |
SEM302 |
warning | ranges의 columns가 10개 초과, 또는 DOUBLE/FLOAT/BLOB/CLOB/NCLOB 타입 사용 권고 위반 (타입 정보 있을 때) |
SEM303 |
warning | boundaries 각 내부 배열 길이가 columns 길이와 불일치 |
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
STR400 |
error | rule-action이 add-tag 밖 |
BP400 |
info | post-processing은 S3 타겟 전용임을 안내 |
| 코드 | 심각도 | 조건 / 메시지 |
|---|---|---|
STR500 |
error | rule-action이 map-record-to-record/map-record-to-document 밖 |
STR501 |
error | object-locator 없음 |
STR510 |
error | mapping-parameters.partition-key-type이 enum 밖 (schema-table,transaction-id,primary-key,constant,attribute-name) |
STR511 |
error | attribute-mappings[].attribute-type이 scalar/document 밖 |
STR512 |
error | attribute-mappings[].attribute-sub-type이 string/json 밖 |
SEM500 |
error | partition-key-type: attribute-name인데 partition-key-name 누락 |
BP500 |
warning | 동일 task에서 object-mapping과 transformation 룰 혼용 (Kafka에서 금지) — Phase 2에서 심화 |
검증 코어(Rust)와 프론트엔드(TS)가 공유하는 계약. JSON으로 직렬화되어 Tauri command 결과로 전달.
설계 요점:
- 모든 진단에
range(line/col) 를 부여해 에디터 인라인 마킹·클릭 점프 지원. 이를 위해 JSON 파서는 위치 정보를 보존하는 파서(예: Rustserde_json대신 위치 보존이 가능한 파서, 또는jsonc-parser류 토크나이저)를 사용한다. message(영문, AWS 용어 유지) +messageKo(한국어 설명) 동시 제공.- 각 진단에 가능한 경우 AWS 문서 URL을 연결(
docUrl).
┌─────────────────────────────────────────────┐
│ Tauri App │
│ │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ Frontend │ IPC │ Rust Core │ │
│ │ (React/TS) │◄──────►│ (validation) │ │
│ │ │ invoke │ │ │
│ │ - Monaco 에디터│ │ - 위치보존 파서 │ │
│ │ - 결과 패널 │ │ - L0~L2 검증 엔진 │ │
│ │ - 파일 I/O UI │ │ - 규칙 카탈로그 │ │
│ └──────────────┘ │ - 진단 생성 │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────┘
- 재사용성: 동일 코어를 추후 CLI(
dms-validate file.json)로 노출 가능 → CI 통합. - 단일 진실 공급원: 규칙 카탈로그(§6)를 Rust에 한 번만 구현.
- 테스트 용이: 코어를 순수 함수(
validate(text) -> ValidationReport)로 두어 픽스처 기반 단위 테스트. - 성능: 2MB 한도 내 문서를 즉시 검증.
- L1(구조/스키마): 정본(canonical) JSON Schema(Draft 2020-12) 를 작성해 문서·테스트의 기준으로 삼되, 사용자 대면 진단은 친화적 메시지 + 정확한 위치를 위해 Rust 커스텀 검증 패스로 생성한다. (제네릭 JSON Schema 오류는 위치/문구가 거칠어 UX가 떨어짐.)
- L2(의미): §6의 SEM/BP 규칙을 Rust로 구현. 각 규칙은 독립 함수로 두고 카탈로그 코드와 1:1 매핑.
#[tauri::command]
fn validate(content: String, target_dms_version: Option<String>) -> ValidationReport;
#[tauri::command]
fn list_rules() -> Vec<RuleDoc>; // 규칙 카탈로그(코드/설명/문서URL) 제공
// 파일 열기/저장은 Tauri dialog + fs 플러그인 사용┌────────────────────────────────────────────────────────┐
│ 툴바: [열기] [저장] [붙여넣기] [샘플▾] [검증] DMS버전[3.5.4▾]│
├──────────────────────────────┬─────────────────────────┤
│ │ 결과 패널 │
│ Monaco JSON 에디터 │ ┌─ Errors (3) ───────┐ │
│ (인라인 에러 밑줄/거터 마커) │ │ SEM100 /rules/2/... │ │
│ │ │ STR012 /rules/0/... │ │
│ │ └─────────────────────┘ │
│ │ ┌─ Warnings (1) ──────┐ │
│ │ └─────────────────────┘ │
├──────────────────────────────┴─────────────────────────┤
│ 상태바: ● 3 errors ▲ 1 warning 2MB 중 0.4MB │
└────────────────────────────────────────────────────────┘
| ID | 기능 | 설명 |
|---|---|---|
| UI-1 | 파일 열기 | Tauri dialog로 .json 열기, 드래그&드롭 지원 |
| UI-2 | 저장 | 현재 내용 저장 / 다른 이름으로 저장 |
| UI-3 | 붙여넣기/직접 편집 | 빈 상태에서 JSON 붙여넣기 |
| UI-4 | 라이브 검증 | 편집 시 디바운스(예: 400ms) 후 자동 검증, 또는 [검증] 버튼 수동 모드 토글 |
| UI-5 | 인라인 마킹 | error=빨강, warning=노랑 밑줄 + 거터 아이콘 + 호버 시 메시지(영/한) |
| UI-6 | 결과 클릭 점프 | 결과 패널 항목 클릭 → 에디터 해당 range로 스크롤·하이라이트 |
| UI-7 | 심각도 필터 | error/warning/info 토글 표시 |
| UI-8 | 샘플 템플릿 | selection/transformation 등 정상 예시 삽입 |
| UI-9 | DMS 버전 선택 | 버전 게이팅(§7.4) 기준 변경, 기본=최신 |
| UI-10 | 결과 복사/내보내기 | 진단 목록을 텍스트/JSON으로 복사 (이슈 공유용) |
| UI-11 | 룰 트리 뷰 (선택) | rules를 타입별로 접고 펼치는 구조 뷰 |
| UI-12 | 툴팁 | DMS 버전 선택 옆 ⓘ에 버전 게이팅 설명(데이터 마스킹 3.5.4+, 필터 혼합 3.5.0+, Kafka 멀티토픽 3.4.6+) 호버 툴팁. 툴바 버튼·진단 행에는 네이티브 title 툴팁 |
- 입력 JSON·검증 결과는 외부로 전송하지 않음. 텔레메트리 없음(또는 명시적 opt-in).
- 최근 파일 목록 등 로컬 설정만 디스크에 저장.
일부 기능은 DMS 엔진 버전에 따라 동작 여부가 달라진다. targetDmsVersion(기본=최신, 예 3.5.x)을 기준으로 다음을 warning으로 안내:
| 기능 | 최소 버전 | 관련 코드 |
|---|---|---|
| 필터 긍정+부정 연산자 혼합 | 3.5.0+ | BP110 |
data-masking-* transformation |
3.5.4+ | BP202 |
kafka-target-topic(멀티토픽) |
3.4.6+ | (object-mapping) |
TimeTravel RawDataFormat 등 |
3.5.0+ | (task settings — 범위 밖) |
버전별 정확한 매핑은 구현 단계에서 AWS 릴리스 노트로 확정. 미상 시 info로 강등.
| 영역 | 선택 | 비고 |
|---|---|---|
| 셸 | Tauri 2.x | 경량·단일 실행파일 |
| 프론트엔드 | React + TypeScript + Vite | rtzr 사내 친숙도 |
| 에디터 | Monaco Editor | JSON 하이라이트·마커·점프 기본 지원 |
| 검증 코어 | Rust | 위치보존 JSON 파서 + 커스텀 검증 |
| JSON 파싱(위치보존) | jsonc-parser 류 / 토크나이저 기반 |
line/col 진단 필수 |
| 정본 스키마 | JSON Schema 2020-12 | 문서/테스트 기준 |
| 패키징 | Tauri bundler (.dmg/.app) | macOS 우선, 추후 win/linux |
- 성능: 2MB 문서 검증 < 100ms (목표), 라이브 검증 디바운스로 입력 지연 없음.
- 정확성: §6 규칙은 AWS 문서를 단일 출처로 하고, 회귀 테스트 픽스처로 고정.
- 이식성: 코어는 GUI 비의존 → CLI 재사용 가능.
- 국제화: 진단 메시지 영/한 동시.
- 오프라인: 네트워크 불필요.
| 단계 | 산출물 |
|---|---|
| M0 | 본 스펙 확정 + 정본 JSON Schema + 샘플/픽스처 수집 |
| M1 | Rust 코어: 위치보존 파서 + L0·L1 검증 + ValidationReport + 단위테스트 |
| M2 | Rust 코어: L2 의미 규칙(§6.2~6.6) + 버전 게이팅 |
| M3 | Tauri 셸 + Monaco 에디터 + 결과 패널 + 인라인 마킹/점프 |
| M4 | 파일 I/O, 샘플 템플릿, 심각도 필터, 내보내기, 패키징(.app) |
| M5(후보) | CLI 노출, Task Settings 검증 확장, auto-fix, 라이브 AWS API 검증 |
- 라이브 검증 vs 수동 검증 기본값? (현재 제안: 라이브, 토글 제공)
- DMS 기본 타겟 버전 고정값? (현재 제안: 최신 안정 버전)
- object-mapping 심화 검증을 Phase 2로 미룰지 / 1차에 포함할지
- auto-fix(따옴표/enum 오타 자동 교정) 도입 여부
- CLI를 M1부터 같이 노출할지 (코어가 이미 분리되어 있어 저비용)
rule-action:include,exclude,explicittable-type:table,view,allfilter-type:sourcefilter-operator:eq,noteq,gte,lte,ste,between,notbetween,null,notnull- 값 카디널리티: 단일값(
eq,noteq,gte,lte,ste)→value; 범위(between,notbetween)→start-value+end-value; 무값(null,notnull) ⚠️ more/less는 DMS 연산자가 아님 → reject
- 값 카디널리티: 단일값(
rule-action(18):add-column,include-column,remove-column,rename,convert-lowercase,convert-uppercase,add-prefix,remove-prefix,replace-prefix,add-suffix,remove-suffix,replace-suffix,define-primary-key,change-data-type,add-before-image-columns,data-masking-digits-mask,data-masking-digits-randomize,data-masking-hash-maskrule-target:schema,table,column,table-tablespace,index-tablespacebefore-image-def.column-filter:pk-only,non-lob,allprimary-key-def.origin:unique-index(미지정 시 primary key)
bytes, date, time, datetime, int1, int2, int4, int8, numeric, real4, real8, string, uint1, uint2, uint4, uint8, wstring, blob, nclob, clob, boolean, set, list, map, tuple
- 포맷: DATE=
YYYY-MM-DD/YYYY:MM:DD, DATETIME=YYYY-MM-DD HH:MM:SS, TIME=HH:MM:SS
parallel-load.type:partitions-auto,subpartitions-auto(Oracle),partitions-list,rangeslob-settings.mode:limited,unlimited,none
rule-action:map-record-to-record,map-record-to-documentpartition-key-type:schema-table,transaction-id,primary-key,constant,attribute-nameattribute-type:scalar,documentattribute-sub-type:string,json
%(0+),_(1),[_](리터럴_),[ab](집합),[a-d](범위)- 금지 컨텍스트: filters,
define-primary-keyschema/table,explicitselection, table-settings object-locator, transformationobject-locator.data-type - 모든 schema/table/column 이름은 대소문자 구분 (Oracle/Db2는 UPPER)
- Table mapping (JSON):
…/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.html - Selection rules:
…/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Selections.html - Source filters:
…/CHAP_Tasks.CustomizingTasks.Filters.html - Transformation rules:
…/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html - Transformation expressions:
…/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.html - Table & collection settings:
…/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.html - Wildcards:
…/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Wildcards.html - Kinesis object mapping:
…/CHAP_Target.Kinesis.html· Kafka:…/CHAP_Target.Kafka.html
(베이스 URL: https://docs.aws.amazon.com/dms/latest/userguide/)