배치관리
전용 사용자 API 키로 ContextMeta 코드값·표준정보를 조회하여 Oracle에 주기적으로 추가·수정합니다.
적용 환경
- ContextMeta 호스트 버전
- 0.1.0 이상 · 0.2.0 미만
- Plugin API / 패키지 형식
- API 2 · format 2
- 실행 환경
- 패키지 README에서 확인
설치 권한: ContextMeta system.admin
게시된 버전
API 2 · format 2 · ZIP 344 KB
SHA-256 76d88e51ac0f81685c093fc6867354a8cd8affd4991d2d6ceffccdb018c393ba
설치·롤백 안내
호환 환경·데이터 변경 범위를 확인한 뒤 ContextMeta 설정 → 환경설정 → 플러그인 관리에서 등록·설치하세요.
배치관리 1.0.0
기능
ContextMeta의 설정 → 배치관리에서 표준코드 값과 표준단어·용어·도메인을 Oracle에 주기적으로 맞춥니다. 현재 Oracle을 지원하며 PostgreSQL·MySQL은 후속 adapter 확장 대상입니다.
적용 대상
ContextMeta Plugin API 2 호스트와 Oracle 대상 DB를 사용합니다. 호스트 지원 및 아래 migration이 필요합니다.
설치 시 변경 사항
플러그인 설치 시 추가되는 소유 테이블: 없음. 아래의 3개 배치 저장소는 별도 호스트 migration086이 소유합니다.
- 호스트 migration
086_batch_management.sql,batchadapter,menuParent: settings및 native 연결 관리 bridge가 필요합니다. - 환경설정 → 플러그인 관리에서 이 ZIP을 등록하고 README 확인 후 설치합니다. 등록만으로 실행되지는 않습니다.
python -m app.plugin_worker를 실행합니다. 전체 개발 stacknpm run dev에도 포함됩니다.- 호스트의 기존
META_CATALOG_KEK또는 보호된 KEK 파일을 API와 worker가 함께 사용해야 합니다.
페이지·배치·연결 관리는 configuration.admin 권한이 필요합니다. 패키지 설치는 system.admin 권한입니다.
API 키 준비
설정 → 조직 및 사용자에서 배치 전용 사용자를 생성하고 그 사용자에게 API 키를 발급합니다.
권한 관리에서 standards.read를 부여하고 잠금 해제·API 사용 허용 상태를 확인합니다.
연결 관리의 API 키 입력란에 발급된 키를 넣습니다. 로그인 비밀번호나 브라우저 세션을 대신 사용하지 않습니다.
키 재발급·폐기·사용자 잠금 시 다음 조회는 실패합니다. API 키와 Oracle 비밀번호는 native 호스트 창에서만
입력하고 서버가 AES-256-GCM으로 암호화합니다. 플러그인 iframe·Python 명령·실행 원장에는 전달하지 않습니다.
배치 등록과 실행
- 연결 관리에서 실제 ContextMeta API 기본 URL(예:
http://서버:포트/api)과 Oracle 호스트·포트·Service Name·계정을 입력합니다. HTTP/HTTPS를 입력 그대로 사용하고 HTTPS의 정상 인증서 검증을 유지합니다. URL 변경 시 API 키를 다시 입력합니다. - 연결 테스트는 API 키 인증과 Oracle 접속만 확인합니다. 대상 테이블의 키·컬럼·타입 검증은 배치 미리보기로 확인합니다.
- 조회 API를 선택하고 표준분류 ID, 코드 도메인 ID로 범위를 제한할 수 있습니다. API 필드와 기존 대상 테이블 컬럼을 매핑합니다.
- 동기화 키는 Oracle의 활성·검증된 비지연 PK 또는 UNIQUE 제약의 전체 컬럼과 일치해야 합니다. 단일 코드 ID는 도메인 범위를 포함해 유일성을 확인하세요. 원본/매핑 키의 중복·빈 값은 반영 전에 거부합니다.
- 변환은 문자, 숫자(boolean은 1/0), 날짜(
YYYY-MM-DD), ISO 시각입니다. 코드값의 선행 0을 보존하려면 문자를 선택합니다. Oracle SQL의 빈 문자열=NULL 의미가 적용됩니다. quoted mixed-case 식별자·DB 링크·임의 SQL·테이블 생성은 지원하지 않습니다. - 미리보기는 API 전체 페이지와 변환·대상 구조를 검사하며 대상 DML을 실행하지 않습니다. 성공은 실제 쓰기 권한·제약 충족의 보증은 아닙니다.
- 실행은
MERGE로 추가·수정합니다. 삭제·TRUNCATE는 실행하지 않으며 API에 없는 대상 행은 유지합니다. 한 실행은 하나의 Oracle transaction이고 실패·취소 시 commit 이전 변경은 rollback합니다. - 예약은 5자리 cron과 IANA 시간대입니다. 기본은 예약 꺼짐이며 예:
0 * * * *(매시 정각),0 2 * * *(매일 02시). 브라우저를 닫아도 worker가 수행하며, 중복 실행을 막고 지나간 주기를 모두 소급 실행하지 않습니다.
실행 상태와 제한
최대 50,000행·32 MiB API 응답·300초, 활성 정의 200개·연결 100개·대기/실행 합계100개, 배치당 동시 실행1개입니다. 행은 API pagination으로 읽으며 단일 시점 DB snapshot을 보장하지 않습니다. 조회 도중 총건수 변경·누락·중복은 실패하며 수집 완료 후에만 Oracle 쓰기를 시작합니다. 주기적 추가·수정으로 변경사항을 다시 반영할 수 있습니다.
외부 DB commit과 ContextMeta 결과 원장은 서로 다른 transaction입니다. commit 응답 손실 또는 실행기 중단은
결과 미확정으로 기록하고 해당 예약을 정지합니다. 실행 이력과 대상 DB를 확인한 후 명시적으로 다시 실행하거나 예약을 재개하세요.
자동 재실행으로 정확히 한 번 반영을 보장한다고 주장하지 않습니다. 취소 요청은 이미 commit된 데이터를 되돌리지 않습니다.
사용자 잠금·권한 회수·플러그인 해제·세대 변경·연결 변경은 실행/최종 반영 경계에서 재검사합니다.
재설치 후에는 배치 설정을 다시 저장해야 새 세대에서 실행됩니다.
롤백 시 주의사항
- 플러그인 설치 시 추가되는 소유 테이블: 없음.
- 플러그인 롤백·제거 시 삭제되는 테이블: 없음.
- 호스트 migration086은
metafit_batch_connection,metafit_batch_definition,metafit_batch_run을 추가합니다. 연결 보안·예약 선출·실행 결과를 담당하는 호스트 저장소이며 플러그인 소유 테이블이 아닙니다. - 해제 시 실행 경로와 메뉴가 닫히며 위 호스트 데이터 및 외부 DB 반영 데이터는 보존됩니다. 배치 보관 처리도 실행 이력을 삭제하지 않습니다. 기존/core/타 플러그인 테이블을 변경·삭제하지 않습니다.
- 서버 배포는 migration086 → 호스트 → ZIP 설치 순서입니다. 구형 호스트는 새 capability/menuParent를 거부합니다. 호스트를 롤백하기 전 예약을 중지하고 실행을 확인하세요. ERFIT/model-core/Repository 버전·리비전·hash 변경은 없습니다.
빌드
저장소 루트에서 node plugins/batch-management/build.mjs를 실행합니다.
번들은 설치 시 다운로드 없이 동작하며 React·Ant Design 의존성의 원문 LICENSE/NOTICE를 JS에 동봉합니다.
포함된 UI 의존성
| 패키지 | 버전 | 라이선스 |
|---|---|---|
| @ant-design/colors | 7.2.1 | MIT |
| @ant-design/cssinjs-utils | 1.1.3 | MIT |
| @ant-design/cssinjs | 1.24.0 | MIT |
| @ant-design/fast-color | 2.0.6 | MIT |
| @ant-design/icons-svg | 4.6.0 | MIT |
| @ant-design/icons | 5.6.1 | MIT |
| @ant-design/react-slick | 1.1.2 | MIT |
| @babel/runtime | 7.29.7 | MIT |
| @emotion/hash | 0.8.0 | MIT |
| @emotion/unitless | 0.7.5 | MIT |
| @rc-component/async-validator | 5.1.2 | MIT |
| @rc-component/color-picker | 2.0.1 | MIT |
| @rc-component/context | 1.4.0 | MIT |
| @rc-component/mini-decimal | 1.1.4 | MIT |
| @rc-component/mutate-observer | 1.1.0 | MIT |
| @rc-component/portal | 1.1.2 | MIT |
| @rc-component/qrcode | 1.1.3 | MIT |
| @rc-component/tour | 1.15.1 | MIT |
| @rc-component/trigger | 2.3.1 | MIT |
| antd | 5.29.3 | MIT |
| classnames | 2.5.1 | MIT |
| compute-scroll-into-view | 3.1.1 | MIT |
| copy-to-clipboard | 3.3.3 | MIT |
| dayjs | 1.11.23 | MIT |
| json2mq | 0.2.0 | MIT |
| rc-cascader | 3.34.0 | MIT |
| rc-checkbox | 3.5.0 | MIT |
| rc-collapse | 3.9.0 | MIT |
| rc-dialog | 9.6.0 | MIT |
| rc-drawer | 7.3.0 | MIT |
| rc-dropdown | 4.2.1 | MIT |
| rc-field-form | 2.7.1 | MIT |
| rc-image | 7.12.0 | MIT |
| rc-input-number | 9.5.0 | MIT |
| rc-input | 1.8.0 | MIT |
| rc-mentions | 2.20.0 | MIT |
| rc-menu | 9.16.1 | MIT |
| rc-motion | 2.9.5 | MIT |
| rc-notification | 5.6.4 | MIT |
| rc-overflow | 1.5.0 | MIT |
| rc-pagination | 5.1.0 | MIT |
| rc-picker | 4.11.3 | MIT |
| rc-progress | 4.0.0 | MIT |
| rc-rate | 2.13.1 | MIT |
| rc-resize-observer | 1.4.3 | MIT |
| rc-segmented | 2.7.1 | MIT |
| rc-select | 14.16.8 | MIT |
| rc-slider | 11.1.9 | MIT |
| rc-steps | 6.0.1 | MIT |
| rc-switch | 4.1.0 | MIT |
| rc-table | 7.54.0 | MIT |
| rc-tabs | 15.7.0 | MIT |
| rc-textarea | 1.10.2 | MIT |
| rc-tooltip | 6.4.0 | MIT |
| rc-tree-select | 5.27.0 | MIT |
| rc-tree | 5.13.1 | MIT |
| rc-upload | 4.11.0 | MIT |
| rc-util | 5.44.4 | MIT |
| rc-virtual-list | 3.19.2 | MIT |
| react-dom | 18.3.1 | MIT |
| react-is | 18.3.1 | MIT |
| react | 18.3.1 | MIT |
| resize-observer-polyfill | 1.5.1 | MIT |
| scheduler | 0.23.2 | MIT |
| scroll-into-view-if-needed | 3.1.0 | MIT |
| string-convert | 0.2.1 | MIT |
| stylis | 4.4.0 | MIT |
| throttle-debounce | 5.0.2 | MIT |
| toggle-selection | 1.0.6 | MIT |