마스터 데이터 동기화 스크립트 계획
작성일: 2026-03-17
목적: 기초 데이터(마스터)를 환경 간 동기화하여 운영 초기 셋업 및 환경 복제 지원
기준 문서: docs/dev/dev_plans/local-to-dev-data-sync-plan.md (전체 동기화 v1)
상태: ⏳ 설계 확정 대기
대상: 31개 테이블 (Direct 27 + FK 4), DB만
📍 현재 진행 상태
| 항목 |
내용 |
| 마지막 완료 작업 |
테이블 분류 및 설계 검토 |
| 다음 작업 |
사용자 검토 → 스크립트 구현 |
| 진행률 |
0/3 (0%) |
| 마지막 업데이트 |
2026-03-17 |
1. 개요
1.1 배경
SAM 시스템은 다음 환경을 사용한다:
| 환경 |
DB명 |
접근 방식 |
역할 |
| 로컬 (Docker) |
samdb |
docker exec sam-mysql-1 |
개발/테스트 |
| 개발 서버 |
sam |
SSH hskwon@114.203.209.83 |
스테이징 |
| 운영 서버 |
sam_prod |
SSH sam-prod |
정식 서비스 |
문제: 스키마는 php artisan migrate로 올라가지만, 기초 데이터 없으면 시스템이 동작 안 함.
품목 893개, 단가 780개, 공정 4개, 문서양식 28개 등 마스터 데이터가 있어야 견적/수주/생산 기능이 작동한다.
기존 스크립트와의 관계:
| 스크립트 |
용도 |
대상 |
scripts/data-sync.sh (v1) |
전체 동기화 — 개발 테스트용 |
62개 테이블 + 파일 |
scripts/data-sync-master.sh (v2, 신규) |
기초정보만 — 환경 초기화/운영 셋업 |
31개 테이블, DB만 |
1.2 핵심 설계 원칙
1.3 변경 승인 정책
| 분류 |
예시 |
승인 |
| ✅ 즉시 가능 |
테이블 추가/제거, 옵션 추가 |
불필요 |
| ⚠️ 컨펌 필요 |
운영 대상 실행, DELETE 로직 변경 |
필수 |
| 🔴 금지 |
트랜잭션 테이블 포함, 운영 DB 직접 수정 |
별도 협의 |
2. 대상 테이블 (31개)
2.1 분류 기준
- ✅ 포함: 시스템 동작에 필수인 설정/마스터 데이터
- ❌ 제외: 사용자 행위로 생성되는 트랜잭션 데이터
2.2 포함 테이블 (Direct 27개 + FK 4개)
| # |
카테고리 |
테이블 |
유형 |
설명 |
|
기준 정보 |
|
|
|
| 1 |
카테고리 |
categories |
direct |
품목 분류 체계 |
| 2 |
품목 |
items |
direct |
품목 마스터 |
| 3 |
부서 |
departments |
direct |
조직 구조 |
| 4 |
거래처 |
clients |
direct |
거래처 마스터 |
| 5 |
거래처 그룹 |
client_groups |
direct |
거래처 분류 |
| 6 |
공통 코드 |
common_codes |
direct |
시스템 코드 |
| 7 |
계정 코드 |
account_codes |
direct |
회계 계정 |
| 8 |
카테고리 그룹 |
category_groups |
direct |
카테고리 분류 |
| 9 |
직위 |
positions |
direct |
직위 마스터 (대리, 과장 등) |
| 10 |
테넌트 설정 |
tenant_settings |
direct |
테넌트 기본 설정값 |
|
품목 하위 |
|
|
|
| 11 |
품목 필드 |
item_fields |
direct |
동적 필드 정의 |
| 12 |
품목 섹션 |
item_sections |
direct |
필드 그룹 |
| 13 |
품목 페이지 |
item_pages |
direct |
섹션 그룹 |
| 14 |
BOM 구성 |
item_bom_items |
direct |
BOM 마스터 |
| 15 |
단가 |
prices |
direct |
품목 단가 |
| 16 |
엔티티 관계 |
entity_relationships |
direct |
page→section→field 매핑 |
| 17 |
품목 상세 |
item_details |
FK |
item_id → items. 단가 조회 핵심 (EstimatePriceService) |
|
공정 |
|
|
|
| 18 |
공정 |
processes |
direct |
공정 마스터 |
| 19 |
공정 단계 |
process_steps |
FK |
process_id → processes |
| 20 |
분류 규칙 |
process_classification_rules |
FK |
process_id → processes |
| 21 |
공정-품목 매핑 |
process_items |
FK |
process_id → processes. 품목별 공정 배정 |
|
설정/양식 |
|
|
|
| 22 |
문서 양식 |
document_templates |
direct |
검사/작업일지 양식 |
| 23 |
체크리스트 템플릿 |
checklist_templates |
direct |
QMS 템플릿 |
| 24 |
근무 설정 |
work_settings |
direct |
근무시간/요일 |
| 25 |
채번 규칙 |
numbering_rules |
direct |
번호 생성 패턴 |
| 26 |
폴더 구조 |
folders |
direct |
문서 폴더 |
| 27 |
파일 |
files |
direct |
품목 이미지, 양식 첨부 등 설정 파일 |
|
심사 체계 |
|
|
|
| 28 |
심사 체크리스트 |
audit_checklists |
direct |
|
| 29 |
심사 카테고리 |
audit_checklist_categories |
direct |
|
| 30 |
심사 항목 |
audit_checklist_items |
direct |
|
| 31 |
심사 표준문서 |
audit_standard_documents |
direct |
|
2.3 제외 테이블 (트랜잭션/행위 데이터)
| 카테고리 |
제외 테이블 |
사유 |
| 견적 |
quotes, quote_items, quote_revisions |
견적 행위 |
| 수주 |
orders, order_items, order_nodes, order_histories, order_item_components |
수주 행위 |
| 생산 |
work_orders, work_order_items, work_order_step_progress, work_order_assignees, work_order_material_inputs, work_order_issues, work_order_bending_details, work_results |
생산 행위 |
| 출하 |
shipments, shipment_items, shipment_vehicle_dispatches |
출하 행위 |
| 재고 |
stocks, stock_lots, stock_transactions, receivings |
재고 행위 |
| 품질 |
inspections, quality_documents, quality_document_orders, quality_document_locations, performance_reports |
검사 행위 |
| 문서 |
documents, document_data, document_approvals, document_attachments |
문서 행위 |
| 매출 |
sales |
매출 행위 |
| 사용자 |
users, user_tenants, tenant_user_profiles |
환경에 이미 존재 전제 (운영자/테스트 계정) |
| 메뉴 |
menus, permission_overrides |
동기화 시 권한 설정 초기화 위험 (CLAUDE.md 규칙) |
| 채번 |
numbering_sequences |
환경별 독립 (UPSERT 자동 생성) |
| 감사 |
audit_logs |
환경별 독립 |
3. 스크립트 설계
3.1 사용법
3.2 환경 설정
| 환경 |
식별자 |
DB 접근 |
.env 위치 |
| 로컬 |
local |
docker exec sam-mysql-1 mysql ... |
api/.env |
| 개발 |
dev |
ssh sam-dev "mysql ..." |
/home/webservice/api/.env |
| 운영 |
prod |
ssh sam-prod "mysql ..." |
/home/webservice/api/.env |
- DB 접속 정보는 각 환경의
api/.env에서 자동 읽기 (하드코딩 금지)
- 운영 대상 시
--prod-confirm 자동 요구 (이중 확인)
3.3 실행 흐름
3.4 안전장치
| 장치 |
설명 |
FOREIGN_KEY_CHECKS = 0 |
DELETE/INSERT 시 FK 제약 임시 해제 |
tenant_id 필터 |
모든 DELETE에 WHERE tenant_id = ? → 다른 테넌트 보호 |
--complete-insert |
ID 값 포함 → auto_increment 충돌 방지 |
--prod-confirm |
운영 대상 시 이중 확인 |
--dry-run |
실제 실행 없이 대상 확인 |
--no-create-info |
데이터만 동기화, 스키마 변경 없음 |
3.5 운영 배포 시나리오
4. 작업 단계
Phase 1: 스크립트 구현
| # |
작업 항목 |
상태 |
비고 |
| 1.1 |
scripts/data-sync-master.sh 작성 |
⏳ |
옵션 파싱, 환경 자동 감지 |
| 1.2 |
source/target별 DB 접근 함수 |
⏳ |
local=docker, dev/prod=ssh |
| 1.3 |
덤프/DELETE/임포트 로직 |
⏳ |
31개 테이블 |
| 1.4 |
운영 안전장치 |
⏳ |
--prod-confirm, 이중 확인 |
| 1.5 |
검증 및 리포트 |
⏳ |
건수 비교 출력 |
Phase 2: 테스트
| # |
작업 항목 |
상태 |
비고 |
| 2.1 |
--dry-run 테스트 |
⏳ |
모든 방향 |
| 2.2 |
로컬 → 개발 실행 테스트 |
⏳ |
|
| 2.3 |
개발 → 운영 시뮬레이션 |
⏳ |
dry-run으로 |
Phase 3: 문서 정비
| # |
작업 항목 |
상태 |
비고 |
| 3.1 |
기존 local-to-dev-data-sync-plan.md에서 분리 명시 |
⏳ |
|
| 3.2 |
docs/INDEX.md에 등록 |
⏳ |
|
| 3.3 |
운영 배포 매뉴얼에 연결 |
⏳ |
|
5. 기존 스크립트와의 관계
v1은 유지 — 개발 테스트 시 트랜잭션 데이터까지 필요한 경우 사용.
v2가 운영 배포의 핵심 — 한번 셋팅하면 운영에 그대로 반영.
6. 향후 확장
| 항목 |
설명 |
우선순위 |
| 테이블 추가 |
새 마스터 테이블 발생 시 |
필요시 |
| 다중 테넌트 |
한 번에 여러 테넌트 동기화 |
낮음 |
| 롤백 |
동기화 전 자동 백업 + 복원 스크립트 |
중간 |
| 변경 감지 |
source/target 차이만 보여주는 diff 모드 |
낮음 |
7. 참고 문서
- 전체 동기화 계획:
docs/dev/dev_plans/local-to-dev-data-sync-plan.md
- 서버 운영 매뉴얼:
docs/dev/deploys/ops-manual/README.md
- 서버 접근 관리:
docs/system/server-access-management.md
- 운영 배포 계획:
docs/dev/dev_plans/production-deployment-plan.md
- DB 구조:
docs/system/database/README.md
변경 로그
| 날짜 |
작업 |
비고 |
| 2026-03-17 |
최초 작성 |
소스 코드 belongsTo 기준 FK 전수 분석, 27개 마스터 테이블 선정 |
| 2026-03-17 |
MCP 검토 반영 |
Sequential Thinking 검토: item_details(단가 조회 핵심), process_items(공정-품목 매핑), positions(직위), tenant_settings(테넌트 설정) 4개 추가 → 31개. menus 제외 사유 명시 |