ERP-node/제어관리_외부커넥션_통합_기능_가이드.md

270 lines
9.0 KiB
Markdown
Raw Normal View History

# 🔧 제어관리 외부 커넥션 통합 기능 사용 가이드
## 📋 기능 개요
제어관리 시스템에 외부 데이터베이스 커넥션 연동 기능이 추가되었습니다. 이제 데이터 저장 액션에서 외부 DB나 자기 자신의 테이블에 INSERT, UPDATE, DELETE 작업을 수행할 수 있습니다.
## 🚀 주요 기능
### 1. **다중 커넥션 지원**
- 메인 데이터베이스 (현재 시스템)
- 외부 데이터베이스 (MySQL, PostgreSQL, Oracle, SQL Server 등)
- FROM/TO 커넥션을 독립적으로 선택 가능
### 2. **액션 타입별 지원**
- **INSERT**: 외부 DB에서 데이터 조회 → 다른 DB에 삽입
- **UPDATE**: 조건 확인 후 대상 테이블 업데이트
- **DELETE**: 조건 확인 후 대상 테이블 데이터 삭제
### 3. **자기 자신 테이블 작업**
- 같은 테이블 내에서 UPDATE/DELETE 작업 지원
- 강화된 안전장치로 데이터 손실 방지
## 📖 사용 방법
### 1단계: 커넥션 선택
제어관리에서 데이터 저장 액션을 생성할 때, 먼저 FROM/TO 커넥션을 선택합니다.
```
📍 커넥션 선택 화면
┌─────────────────────────────────────────────────────────┐
│ FROM 커넥션 (소스) │ TO 커넥션 (대상) │
│ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │
│ │ [현재 DB] 메인 시스템 │ │ │ [MySQL] 외부 DB 1 │ │
│ │ [PostgreSQL] 외부 DB 2 │ │ │ [Oracle] 외부 DB 3 │ │
│ └─────────────────────────┘ │ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 2단계: 테이블 선택
선택한 커넥션에서 사용할 테이블을 선택합니다.
```
📍 테이블 선택 화면
┌─────────────────────────────────────────────────────────┐
│ FROM 테이블 │ TO 테이블 │
│ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │
│ │ 🔍 [검색: user] │ │ │ 🔍 [검색: order] │ │
│ │ 📊 user_info (15 컬럼) │ │ │ 📊 order_log (8 컬럼) │ │
│ │ 📊 user_auth (5 컬럼) │ │ │ 📊 order_items (12 컬럼)│ │
│ └─────────────────────────┘ │ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 3단계: 액션별 설정
#### 🔄 INSERT 액션
FROM 테이블의 데이터를 TO 테이블에 삽입하는 필드 매핑을 설정합니다.
```
매핑 규칙:
✅ 1:1 매핑: FROM.user_id → TO.customer_id
✅ 1:N 매핑: FROM.name → TO.first_name, TO.display_name
❌ N:1 매핑: FROM.first_name, FROM.last_name → TO.name (금지)
```
#### 🔄 UPDATE 액션
3가지 설정 영역이 있습니다:
1. **업데이트 조건**: FROM 테이블에서 어떤 조건을 만족할 때 실행할지
2. **필드 매핑**: FROM 데이터를 TO 테이블의 어떤 필드에 업데이트할지
3. **WHERE 조건**: TO 테이블에서 어떤 레코드를 업데이트할지
```
예시 설정:
🔍 업데이트 조건: FROM.status = 'completed' AND FROM.updated_at > '2024-01-01'
📝 필드 매핑: FROM.result_value → TO.final_score
🎯 WHERE 조건: TO.user_id = FROM.user_id AND TO.status = 'pending'
```
#### 🔄 DELETE 액션
2가지 설정 영역과 안전장치가 있습니다:
1. **삭제 트리거 조건**: FROM 테이블에서 어떤 조건을 만족할 때 삭제할지
2. **WHERE 조건**: TO 테이블에서 어떤 레코드를 삭제할지
3. **안전장치**: 최대 삭제 개수, 확인 요구, Dry Run 등
```
예시 설정:
🔥 삭제 조건: FROM.is_expired = 'Y' AND FROM.cleanup_date < NOW()
🎯 WHERE 조건: TO.ref_id = FROM.id AND TO.status = 'inactive'
🛡️ 안전장치: 최대 100개, 확인 요구, Dry Run 실행
```
## ⚠️ 자기 자신 테이블 작업 주의사항
### UPDATE 작업 시
```
⚠️ 주의사항:
- WHERE 조건 필수 설정
- 업데이트 조건과 WHERE 조건 겹침 방지
- 무한 루프 위험 체크
✅ 안전한 예시:
UPDATE user_info
SET last_login = NOW(), login_count = login_count + 1
WHERE user_id = 'specific_user' AND status = 'active'
```
### DELETE 작업 시
```
🚨 강화된 안전장치:
- 최대 삭제 개수 10개로 제한
- 부정 조건(!=, NOT IN, NOT EXISTS) 금지
- WHERE 조건 2개 이상 권장
✅ 안전한 예시:
DELETE FROM temp_data
WHERE created_at < NOW() - INTERVAL '7 days'
AND status = 'processed'
AND batch_id = 'specific_batch'
LIMIT 10
```
## 🛠️ 실제 사용 시나리오
### 시나리오 1: 사용자 로그인 정보 업데이트
```
목적: 사용자 로그인 시 마지막 로그인 시간과 로그인 횟수 업데이트
설정:
- FROM: login_logs 테이블 (메인 DB)
- TO: user_info 테이블 (메인 DB)
- 액션: UPDATE
조건:
🔍 업데이트 조건: login_logs.status = 'success' AND login_logs.created_at > NOW() - INTERVAL '1 minute'
📝 필드 매핑:
- login_logs.created_at → user_info.last_login
- login_logs.user_agent → user_info.last_user_agent
🎯 WHERE 조건: user_info.user_id = login_logs.user_id
```
### 시나리오 2: 외부 시스템에서 주문 데이터 동기화
```
목적: 외부 쇼핑몰 시스템의 주문 데이터를 내부 ERP에 저장
설정:
- FROM: orders 테이블 (외부 MySQL DB)
- TO: erp_orders 테이블 (메인 PostgreSQL DB)
- 액션: INSERT
매핑:
✅ 필드 매핑:
- orders.order_id → erp_orders.external_order_id
- orders.customer_name → erp_orders.customer_name
- orders.total_amount → erp_orders.order_amount
- orders.order_date → erp_orders.received_date
```
### 시나리오 3: 만료된 임시 데이터 정리
```
목적: 배치 작업 완료 후 임시 처리 데이터 자동 삭제
설정:
- FROM: batch_jobs 테이블 (메인 DB)
- TO: temp_processing_data 테이블 (메인 DB)
- 액션: DELETE
조건:
🔥 삭제 조건: batch_jobs.status = 'completed' AND batch_jobs.completed_at < NOW() - INTERVAL '1 hour'
🎯 WHERE 조건:
- temp_processing_data.batch_id = batch_jobs.batch_id
- temp_processing_data.status = 'processed'
🛡️ 안전장치: 최대 100개, Dry Run 먼저 실행
```
## 🔧 API 사용법
### 활성 커넥션 조회
```typescript
import { getActiveConnections } from "@/lib/api/multiConnection";
const connections = await getActiveConnections();
// 결과: [{ id: 0, connection_name: '메인 데이터베이스' }, ...]
```
### 테이블 목록 조회
```typescript
import { getTablesFromConnection } from "@/lib/api/multiConnection";
const tables = await getTablesFromConnection(connectionId);
// 결과: [{ tableName: 'users', columnCount: 15 }, ...]
```
### 컬럼 정보 조회
```typescript
import { getColumnsFromConnection } from "@/lib/api/multiConnection";
const columns = await getColumnsFromConnection(connectionId, "users");
// 결과: [{ columnName: 'id', dataType: 'int', isPrimaryKey: true }, ...]
```
## 🚨 문제 해결
### 일반적인 오류
#### 1. 커넥션 연결 실패
```
오류: "커넥션을 찾을 수 없습니다"
해결: 외부 커넥션 관리에서 해당 커넥션이 활성 상태인지 확인
```
#### 2. 테이블 접근 권한 부족
```
오류: "테이블에 접근할 수 없습니다"
해결: 데이터베이스 사용자의 테이블 권한 확인
```
#### 3. 매핑 제약사항 위반
```
오류: "대상 컬럼이 이미 매핑되어 있습니다"
해결: N:1 매핑이 아닌 1:N 매핑으로 변경
```
#### 4. 자기 자신 테이블 작업 실패
```
오류: "WHERE 조건이 필수입니다"
해결: UPDATE/DELETE 작업 시 WHERE 조건 추가
```
### 성능 최적화
1. **인덱스 활용**: WHERE 조건에 사용되는 컬럼에 인덱스 생성
2. **배치 크기 조정**: 대량 데이터 처리 시 적절한 배치 크기 설정
3. **커넥션 풀링**: 외부 DB 연결 시 커넥션 풀 최적화
## 📞 지원
문제가 발생하거나 추가 기능이 필요한 경우:
1. **로그 확인**: 브라우저 개발자 도구의 콘솔 탭 확인
2. **에러 메시지**: 상세한 에러 메시지와 함께 문의
3. **설정 정보**: 사용한 커넥션, 테이블, 액션 타입 정보 제공
---
**📝 마지막 업데이트**: 2024년 12월
**🔧 버전**: v1.0.0
**📧 문의**: 시스템 관리자