docs:테이블 전체 동기화 프롬프트 추가 (로컬→서버, 서버→로컬)
This commit is contained in:
@@ -2,6 +2,7 @@ # MNG 서버 ↔ 로컬 데이터 동기화 가이드
|
||||
|
||||
> **적용 범위: MNG 프로젝트(`/home/aweso/sam/mng`)에만 해당**
|
||||
> API 프로젝트는 별도 환경이므로 이 가이드를 적용하지 않습니다.
|
||||
> **시더(Seeder)는 사용하지 않습니다.** tinker + 임시 PHP 스크립트 방식으로 동기화합니다.
|
||||
|
||||
## 핵심 원리
|
||||
|
||||
@@ -20,6 +21,7 @@ ### 왜 이 방식인가?
|
||||
| 서버 storage는 `www-data` 소유 → SSH(`pro`)로 직접 접근 불가 | `public/`에 임시 PHP 스크립트 → curl로 실행 (www-data 권한) |
|
||||
| 로컬 앱은 Docker 컨테이너 안에 있음 | `docker exec sam-mng-1 php artisan tinker`로 DB 조작 |
|
||||
| SCP로 storage 디렉토리에 직접 쓰기 불가 | base64 인코딩 → PHP `Storage::put()`으로 저장 |
|
||||
| 시더 사용 금지 (권한 초기화 위험) | tinker 또는 임시 PHP 스크립트로 개별 INSERT |
|
||||
|
||||
## MNG 환경 정보
|
||||
|
||||
@@ -33,12 +35,14 @@ ## MNG 환경 정보
|
||||
| 로컬 Storage 경로 | `/var/www/mng/storage/app/private/` |
|
||||
| 서버 Storage 경로 | `/home/webservice/mng/storage/app/private/` |
|
||||
|
||||
## 프롬프트 템플릿
|
||||
---
|
||||
|
||||
### 서버 → 로컬 (서버 데이터를 로컬로 가져오기)
|
||||
## 1. 특정 레코드 동기화 (조건부)
|
||||
|
||||
### 서버 → 로컬
|
||||
|
||||
```
|
||||
서버(mng.codebridge-x.com)의 [테이블명/기능명]에서 [조건]에 해당하는 데이터를
|
||||
서버(mng.codebridge-x.com)의 [테이블명]에서 [조건]에 해당하는 데이터를
|
||||
로컬 Docker(sam-mng-1)로 복사해줘.
|
||||
|
||||
절차:
|
||||
@@ -48,10 +52,10 @@ ### 서버 → 로컬 (서버 데이터를 로컬로 가져오기)
|
||||
4. 임시 파일 모두 삭제
|
||||
```
|
||||
|
||||
### 로컬 → 서버 (로컬 데이터를 서버로 올리기)
|
||||
### 로컬 → 서버
|
||||
|
||||
```
|
||||
로컬 Docker(sam-mng-1)의 [테이블명/기능명]에서 [조건]에 해당하는 데이터를
|
||||
로컬 Docker(sam-mng-1)의 [테이블명]에서 [조건]에 해당하는 데이터를
|
||||
서버(mng.codebridge-x.com)로 복사해줘.
|
||||
|
||||
절차:
|
||||
@@ -61,24 +65,93 @@ ### 로컬 → 서버 (로컬 데이터를 서버로 올리기)
|
||||
4. 임시 파일 모두 삭제
|
||||
```
|
||||
|
||||
## 사용 예시
|
||||
---
|
||||
|
||||
## 2. 테이블 전체 동기화 (로컬 → 서버)
|
||||
|
||||
> 로컬에서 개발/테스트한 데이터를 서버에 그대로 적용할 때 사용합니다.
|
||||
> 서버에 이미 데이터가 있으면 **중복 방지 전략**을 선택해야 합니다.
|
||||
|
||||
### 프롬프트
|
||||
|
||||
```
|
||||
# 템플릿 동기화 (DB + PDF 파일)
|
||||
서버의 esign_field_templates에서 name='영업파트너 계약서(단체용)'인
|
||||
템플릿과 관련 items, PDF 파일을 로컬로 복사해줘.
|
||||
로컬(sam-mng-1)의 [테이블명] 테이블 데이터를 서버에 동기화해줘.
|
||||
|
||||
# 여러 건 동기화
|
||||
로컬의 esign_field_templates에서 ID 4,5,6번 템플릿 3개와
|
||||
관련 items, PDF 파일을 서버로 복사해줘.
|
||||
동기화 방식: [아래에서 선택]
|
||||
- 서버 비어있음 → 전체 INSERT
|
||||
- 서버에 기존 데이터 있음 → 로컬 기준으로 덮어쓰기 (서버 데이터 TRUNCATE 후 INSERT)
|
||||
- 서버에 기존 데이터 있음 → 로컬에만 있는 것만 추가 (중복 제외 INSERT)
|
||||
- 서버에 기존 데이터 있음 → upsert (있으면 UPDATE, 없으면 INSERT)
|
||||
|
||||
# DB만 동기화 (파일 없음)
|
||||
서버의 tenant_prospects 테이블 전체 데이터를 로컬 DB로 동기화해줘.
|
||||
관련 테이블: [자식 테이블이 있으면 명시, 예: esign_field_template_items]
|
||||
Storage 파일: [연관 파일이 있으면 경로 패턴 명시, 예: esign/1/templates/*.pdf]
|
||||
중복 판단 기준: [어떤 컬럼으로 같은 레코드인지 판단, 예: name, business_number 등]
|
||||
```
|
||||
|
||||
### 사용 예시
|
||||
|
||||
```
|
||||
로컬의 esign_field_templates 테이블 전체를 서버에 동기화해줘.
|
||||
|
||||
동기화 방식: 서버 비어있음 → 전체 INSERT
|
||||
관련 테이블: esign_field_template_items (template_id FK)
|
||||
Storage 파일: esign/1/templates/*.pdf (file_path 컬럼 참조)
|
||||
```
|
||||
|
||||
```
|
||||
로컬의 clients 테이블 데이터를 서버에 동기화해줘.
|
||||
|
||||
동기화 방식: 로컬에만 있는 것만 추가
|
||||
관련 테이블: 없음
|
||||
Storage 파일: 없음
|
||||
중복 판단 기준: client_code
|
||||
```
|
||||
|
||||
```
|
||||
로컬의 menus 테이블을 서버와 동기화해줘.
|
||||
|
||||
동기화 방식: upsert (id 기준, 있으면 UPDATE, 없으면 INSERT)
|
||||
관련 테이블: 없음
|
||||
Storage 파일: 없음
|
||||
중복 판단 기준: id
|
||||
주의: permission_overrides 테이블은 건드리지 말 것
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 테이블 전체 동기화 (서버 → 로컬)
|
||||
|
||||
> 서버의 운영 데이터를 로컬 개발환경에서 테스트하고 싶을 때 사용합니다.
|
||||
|
||||
### 프롬프트
|
||||
|
||||
```
|
||||
서버(mng.codebridge-x.com)의 [테이블명] 테이블 데이터를 로컬로 동기화해줘.
|
||||
|
||||
동기화 방식: [위와 동일한 옵션]
|
||||
관련 테이블: [자식 테이블]
|
||||
Storage 파일: [연관 파일 경로]
|
||||
중복 판단 기준: [컬럼명]
|
||||
```
|
||||
|
||||
### 사용 예시
|
||||
|
||||
```
|
||||
서버의 tenant_prospects 테이블 전체를 로컬로 동기화해줘.
|
||||
|
||||
동기화 방식: 로컬 비어있음 → 전체 INSERT
|
||||
관련 테이블: 없음
|
||||
Storage 파일: prospect/ 하위 이미지 (business_card_path, id_card_path, bankbook_path)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 주의사항
|
||||
|
||||
- 작업 후 `public/`의 임시 PHP 스크립트는 **반드시 삭제** (보안)
|
||||
- ID는 서버/로컬이 다를 수 있으므로 **이름/조건 기반**으로 매칭
|
||||
- 관계 테이블(FK)이 있으면 부모 먼저 생성 후 자식 INSERT
|
||||
- 대량 데이터는 트랜잭션(`DB::beginTransaction`)으로 원자성 보장
|
||||
- FK가 있는 자식 테이블은 부모 먼저 생성 후 새 ID로 자식 INSERT
|
||||
- 대량 데이터는 `DB::beginTransaction()`으로 원자성 보장
|
||||
- `menus` 테이블 동기화 시 `permission_overrides`는 절대 건드리지 않음
|
||||
- TRUNCATE는 신중하게 — 서버 운영 데이터 삭제 전 반드시 확인
|
||||
- 동기화 전 서버/로컬 양쪽의 현재 레코드 수를 먼저 확인하고 보고
|
||||
|
||||
Reference in New Issue
Block a user