docs: [db] codebridge DB 분리 문서에 크로스 DB FK 제거 내용 추가
- 깨진 FK 제약조건 52개 제거 (users, tenants 등 참조) 문서화 - 운영 서버 적용 절차 5단계 → 6단계로 개정 (API 마이그레이션 단계 추가)
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
> **작성일**: 2026-03-07
|
||||
> **상태**: 로컬/개발 서버 적용 완료, **운영 서버 코드 revert 상태 — DB 선행 작업 필요**
|
||||
> **최종 수정**: 2026-03-09 — API 사용 테이블 점검, 로컬/개발 samdb 삭제 완료, 운영 코드 revert
|
||||
> **최종 수정**: 2026-03-11 — 크로스 DB FK 제약조건 52개 제거 (개발+운영 적용 완료)
|
||||
|
||||
---
|
||||
|
||||
@@ -247,7 +247,53 @@ SAM 프로젝트의 DB를 **서비스용**과 **내부 관리용**으로 분리
|
||||
> - kent가 main에서 revert 2건 push → 운영 서버 정상 복구
|
||||
> - **교훈: 운영 서버는 반드시 DB 선행 작업(1~2단계) 완료 후 코드 배포(3단계)**
|
||||
|
||||
### 4.2 코드 변경 사항
|
||||
### 4.2 크로스 DB FK 제약조건 제거 (2026-03-11)
|
||||
|
||||
> **문제**: codebridge 테이블의 FK 제약조건이 sam DB의 `users`, `tenants` 등을 참조하여 INSERT 실패 발생.
|
||||
> **증상**: `esign_field_templates` INSERT 시 `SQLSTATE[23000]` FK violation (created_by → users(id))
|
||||
> **원인**: sam → codebridge로 테이블 이동 시, FK 제약조건은 이동되지 않고 sam의 테이블을 계속 참조.
|
||||
> **해결**: 마이그레이션으로 codebridge DB의 깨진 FK 52개 일괄 제거.
|
||||
|
||||
| 참조 테이블 (sam에만 존재) | FK 수 | 영향 테이블 예시 |
|
||||
|---|---|---|
|
||||
| `users` | 27개 | esign_*, admin_*, business_income_payments, sales_* |
|
||||
| `tenants` | 16개 | account_codes, esign_*, barobill_*, hometax_invoices |
|
||||
| `departments` | 1개 | admin_pm_issues |
|
||||
| `processes` | 1개 | equipment_process |
|
||||
| `prospects` | 1개 | demo_links |
|
||||
| `clients` | 1개 | expense_accounts |
|
||||
| `barobill_card_transactions` | 1개 | barobill_card_transaction_amount_logs |
|
||||
| **합계** | **48개** | |
|
||||
|
||||
> **참고**: FK 제거는 데이터 조회(JOIN/SELECT)에 영향 없음. FK는 INSERT/UPDATE 시 참조 무결성 검증만 수행하며, 실제 데이터 조회는 코드 레벨(Eloquent 관계)에서 처리한다.
|
||||
|
||||
**마이그레이션 파일**: `api/database/migrations/2026_03_11_100000_drop_broken_foreign_keys_from_codebridge.php`
|
||||
|
||||
```php
|
||||
// 안전한 FK 삭제: 존재 여부 확인 후 제거
|
||||
private function dropForeignKeySafe(string $connection, string $table, string $foreignKey): void
|
||||
{
|
||||
$exists = DB::connection($connection)->select("
|
||||
SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = ? AND CONSTRAINT_NAME = ?
|
||||
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
|
||||
", [$table, $foreignKey]);
|
||||
|
||||
if (! empty($exists)) {
|
||||
DB::connection($connection)->statement(
|
||||
"ALTER TABLE `{$table}` DROP FOREIGN KEY `{$foreignKey}`"
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| 환경 | 적용 상태 |
|
||||
|------|----------|
|
||||
| 개발 서버 | ✅ 2026-03-11 마이그레이션 실행 완료 (7초) |
|
||||
| 운영 서버 | ✅ 2026-03-11 cherry-pick → main push 완료 |
|
||||
|
||||
### 4.3 코드 변경 사항
|
||||
|
||||
**config/database.php** — `codebridge` connection 추가:
|
||||
|
||||
@@ -282,7 +328,7 @@ class SalesPartner extends Model
|
||||
|
||||
> **주의**: API 사용 테이블 22개에 해당하는 MNG 모델은 `$connection = 'codebridge'`를 설정하지 않는다. 기본 samdb connection을 사용해야 API와 동일한 데이터를 참조한다.
|
||||
|
||||
### 4.3 samdb 테이블 삭제 절차 (개발 서버 완료)
|
||||
### 4.4 samdb 테이블 삭제 절차 (개발 서버 완료)
|
||||
|
||||
> Sales 테이블 그룹은 FK 상호 참조가 있어 `FOREIGN_KEY_CHECKS = 0`으로 일괄 삭제.
|
||||
|
||||
@@ -309,7 +355,7 @@ SET FOREIGN_KEY_CHECKS = 1;
|
||||
> **현재 상태**: 운영 서버 main 코드는 revert 상태 (codebridge 코드 없음). DB 작업 완료 후 코드 재배포 필요.
|
||||
> **⚠️ 교훈**: 2026-03-09에 DB 없이 코드만 배포하여 장애 위험 발생 → **반드시 DB 선행 후 코드 배포**
|
||||
|
||||
### 순서 (반드시 1 → 2 → 3 → 4 → 5 순서로)
|
||||
### 순서 (반드시 1 → 2 → 3 → 4 → 5 → 6 순서로)
|
||||
|
||||
**1단계: 운영 sam DB 백업**
|
||||
|
||||
@@ -357,7 +403,18 @@ echo 'CODEBRIDGE_DB_DATABASE=codebridge' >> /home/webservice/mng/.env
|
||||
cd /home/webservice/mng && php artisan config:clear
|
||||
```
|
||||
|
||||
**4단계: MNG 코드 재배포 (main cherry-pick)**
|
||||
**4단계: API 마이그레이션 실행 (크로스 DB FK 제거)**
|
||||
|
||||
> codebridge 테이블이 sam의 users, tenants 등을 참조하는 깨진 FK 52개를 제거한다.
|
||||
> 이 마이그레이션은 이미 API main 브랜치에 포함되어 있다.
|
||||
|
||||
```bash
|
||||
cd /home/webservice/api
|
||||
git pull origin main
|
||||
php artisan migrate --force
|
||||
```
|
||||
|
||||
**5단계: MNG 코드 재배포 (main cherry-pick)**
|
||||
|
||||
> develop에 codebridge 코드가 있으므로, revert 커밋 이후 develop의 최신 커밋을 cherry-pick.
|
||||
> 또는 develop의 해당 커밋을 다시 cherry-pick하여 main에 push.
|
||||
@@ -371,7 +428,7 @@ git push origin main
|
||||
git checkout develop
|
||||
```
|
||||
|
||||
**5단계: 동작 확인 + samdb 테이블 삭제 (선택)**
|
||||
**6단계: 동작 확인 + samdb 테이블 삭제 (선택)**
|
||||
|
||||
MNG 관리자 페이지에서 영업관리, 설비, 재무 등 주요 메뉴 동작 확인 후, 문제없으면 sam DB에서 59개 테이블 삭제.
|
||||
|
||||
@@ -399,9 +456,10 @@ SET FOREIGN_KEY_CHECKS = 1;
|
||||
```
|
||||
|
||||
> **⚠️ 핵심 주의사항**:
|
||||
> - 반드시 **1→2→3→4** 순서 (DB 먼저, 코드 나중)
|
||||
> - 4단계(코드 배포) 전에 3단계(.env)까지 완료되어야 함
|
||||
> - 5단계(samdb 삭제)는 4단계 동작 확인 후 선택적 수행
|
||||
> - 반드시 **1→2→3→4→5→6** 순서 (DB 먼저, 코드 나중)
|
||||
> - 4단계(FK 제거) 전에 3단계(.env)까지 완료되어야 함
|
||||
> - 5단계(MNG 코드 배포) 전에 4단계(API 마이그레이션)까지 완료되어야 함
|
||||
> - 6단계(samdb 삭제)는 5단계 동작 확인 후 선택적 수행
|
||||
|
||||
---
|
||||
|
||||
@@ -440,4 +498,4 @@ SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
---
|
||||
|
||||
**최종 업데이트**: 2026-03-09 (운영 revert 반영, 적용 절차 5단계로 개정)
|
||||
**최종 업데이트**: 2026-03-11 (크로스 DB FK 52개 제거, 적용 절차 6단계로 개정)
|
||||
|
||||
Reference in New Issue
Block a user