294 lines
7.0 KiB
Markdown
294 lines
7.0 KiB
Markdown
|
|
# 외부호출 데이터 매핑 시스템 설계서
|
||
|
|
|
||
|
|
## 1. 개요
|
||
|
|
|
||
|
|
외부 API 호출 시 데이터를 송수신하고, 이를 내부 테이블과 매핑하는 시스템을 구현합니다.
|
||
|
|
|
||
|
|
## 2. 현재 상황 분석
|
||
|
|
|
||
|
|
### 2.1 기존 기능
|
||
|
|
|
||
|
|
- ✅ REST API 호출 기본 기능
|
||
|
|
- ✅ 인증 처리 (API Key, Basic, Bearer 등)
|
||
|
|
- ✅ 요청/응답 테스트 기능
|
||
|
|
- ✅ 외부호출 설정 저장
|
||
|
|
|
||
|
|
### 2.2 필요한 확장 기능
|
||
|
|
|
||
|
|
- 🔄 GET 요청 시 응답 데이터를 내부 테이블에 저장
|
||
|
|
- 🔄 POST 요청 시 내부 테이블 데이터를 외부로 전송
|
||
|
|
- 🔄 필드 매핑 설정 (외부 필드 ↔ 내부 필드)
|
||
|
|
- 🔄 데이터 변환 및 검증
|
||
|
|
|
||
|
|
## 3. 시스템 아키텍처
|
||
|
|
|
||
|
|
### 3.1 데이터 플로우
|
||
|
|
|
||
|
|
```
|
||
|
|
GET 요청 플로우:
|
||
|
|
내부 이벤트 → 외부 API 호출 → 응답 데이터 → 필드 매핑 → 내부 테이블 저장
|
||
|
|
|
||
|
|
POST 요청 플로우:
|
||
|
|
내부 이벤트 → 내부 테이블 조회 → 필드 매핑 → 외부 API 전송 → 응답 처리
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.2 컴포넌트 구조
|
||
|
|
|
||
|
|
```
|
||
|
|
ExternalCallPanel
|
||
|
|
├── RestApiSettings (기존)
|
||
|
|
├── DataMappingSettings (신규)
|
||
|
|
│ ├── SourceTableSelector
|
||
|
|
│ ├── TargetTableSelector
|
||
|
|
│ ├── FieldMappingEditor
|
||
|
|
│ └── DataTransformEditor
|
||
|
|
└── ExternalCallTestPanel (확장)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 4. 데이터베이스 스키마 확장
|
||
|
|
|
||
|
|
### 4.1 external_call_configs 테이블 확장
|
||
|
|
|
||
|
|
```sql
|
||
|
|
ALTER TABLE external_call_configs ADD COLUMN IF NOT EXISTS data_mapping_config JSONB;
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4.2 data_mapping_config JSON 구조
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
interface DataMappingConfig {
|
||
|
|
direction: "inbound" | "outbound" | "bidirectional";
|
||
|
|
|
||
|
|
// GET 요청용 - 외부 → 내부
|
||
|
|
inboundMapping?: {
|
||
|
|
targetTable: string;
|
||
|
|
targetSchema?: string;
|
||
|
|
fieldMappings: FieldMapping[];
|
||
|
|
insertMode: "insert" | "upsert" | "update";
|
||
|
|
keyFields?: string[]; // upsert/update 시 키 필드
|
||
|
|
};
|
||
|
|
|
||
|
|
// POST 요청용 - 내부 → 외부
|
||
|
|
outboundMapping?: {
|
||
|
|
sourceTable: string;
|
||
|
|
sourceSchema?: string;
|
||
|
|
sourceFilter?: string; // WHERE 조건
|
||
|
|
fieldMappings: FieldMapping[];
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
interface FieldMapping {
|
||
|
|
sourceField: string; // 외부 API 필드명 또는 내부 테이블 컬럼명
|
||
|
|
targetField: string; // 내부 테이블 컬럼명 또는 외부 API 필드명
|
||
|
|
dataType: "string" | "number" | "boolean" | "date" | "json";
|
||
|
|
transform?: {
|
||
|
|
type: "none" | "constant" | "format" | "function";
|
||
|
|
value?: any;
|
||
|
|
format?: string; // 날짜 포맷 등
|
||
|
|
functionName?: string; // 커스텀 변환 함수
|
||
|
|
};
|
||
|
|
required?: boolean;
|
||
|
|
defaultValue?: any;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 5. 프론트엔드 컴포넌트 설계
|
||
|
|
|
||
|
|
### 5.1 DataMappingSettings.tsx
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
interface DataMappingSettingsProps {
|
||
|
|
config: DataMappingConfig;
|
||
|
|
onConfigChange: (config: DataMappingConfig) => void;
|
||
|
|
httpMethod: string;
|
||
|
|
availableTables: TableInfo[];
|
||
|
|
}
|
||
|
|
|
||
|
|
// 주요 기능:
|
||
|
|
// - 방향 선택 (inbound/outbound/bidirectional)
|
||
|
|
// - 소스/타겟 테이블 선택
|
||
|
|
// - 필드 매핑 에디터
|
||
|
|
// - 데이터 변환 설정
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5.2 FieldMappingEditor.tsx
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
interface FieldMappingEditorProps {
|
||
|
|
mappings: FieldMapping[];
|
||
|
|
sourceFields: FieldInfo[];
|
||
|
|
targetFields: FieldInfo[];
|
||
|
|
onMappingsChange: (mappings: FieldMapping[]) => void;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 주요 기능:
|
||
|
|
// - 드래그 앤 드롭으로 필드 매핑
|
||
|
|
// - 데이터 타입 자동 추론
|
||
|
|
// - 변환 함수 설정
|
||
|
|
// - 필수 필드 검증
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5.3 DataTransformEditor.tsx
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// 데이터 변환 규칙 설정
|
||
|
|
// - 상수값 할당
|
||
|
|
// - 날짜 포맷 변환
|
||
|
|
// - 문자열 변환 (대소문자, 트림 등)
|
||
|
|
// - 커스텀 함수 적용
|
||
|
|
```
|
||
|
|
|
||
|
|
## 6. 백엔드 서비스 확장
|
||
|
|
|
||
|
|
### 6.1 ExternalCallExecutor 확장
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
class ExternalCallExecutor {
|
||
|
|
async executeWithDataMapping(
|
||
|
|
config: ExternalCallConfig,
|
||
|
|
triggerData?: any
|
||
|
|
): Promise<ExternalCallResult> {
|
||
|
|
const result = await this.executeApiCall(config);
|
||
|
|
|
||
|
|
if (result.success && config.dataMappingConfig) {
|
||
|
|
if (config.restApiSettings.httpMethod === "GET") {
|
||
|
|
await this.processInboundData(result, config.dataMappingConfig);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
private async processInboundData(
|
||
|
|
result: ExternalCallResult,
|
||
|
|
mappingConfig: DataMappingConfig
|
||
|
|
) {
|
||
|
|
// 1. 응답 데이터 파싱
|
||
|
|
// 2. 필드 매핑 적용
|
||
|
|
// 3. 데이터 변환
|
||
|
|
// 4. 데이터베이스 저장
|
||
|
|
}
|
||
|
|
|
||
|
|
private async prepareOutboundData(
|
||
|
|
mappingConfig: DataMappingConfig,
|
||
|
|
triggerData?: any
|
||
|
|
): Promise<any> {
|
||
|
|
// 1. 소스 테이블 조회
|
||
|
|
// 2. 필드 매핑 적용
|
||
|
|
// 3. 데이터 변환
|
||
|
|
// 4. API 요청 바디 생성
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6.2 DataMappingService.ts (신규)
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
class DataMappingService {
|
||
|
|
async mapInboundData(
|
||
|
|
sourceData: any,
|
||
|
|
mapping: InboundMapping
|
||
|
|
): Promise<any[]> {
|
||
|
|
// 외부 데이터 → 내부 테이블 매핑
|
||
|
|
}
|
||
|
|
|
||
|
|
async mapOutboundData(
|
||
|
|
sourceTable: string,
|
||
|
|
mapping: OutboundMapping,
|
||
|
|
filter?: any
|
||
|
|
): Promise<any> {
|
||
|
|
// 내부 테이블 → 외부 API 매핑
|
||
|
|
}
|
||
|
|
|
||
|
|
private transformFieldValue(value: any, transform: FieldTransform): any {
|
||
|
|
// 필드 변환 로직
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 7. 구현 단계
|
||
|
|
|
||
|
|
### Phase 1: 기본 매핑 시스템 (1-2주)
|
||
|
|
|
||
|
|
1. 데이터베이스 스키마 확장
|
||
|
|
2. DataMappingSettings 컴포넌트 개발
|
||
|
|
3. 기본 필드 매핑 기능
|
||
|
|
4. GET 요청 응답 데이터 저장
|
||
|
|
|
||
|
|
### Phase 2: 고급 매핑 기능 (1-2주)
|
||
|
|
|
||
|
|
1. POST 요청 데이터 송신
|
||
|
|
2. 필드 변환 기능
|
||
|
|
3. upsert/update 모드
|
||
|
|
4. 배치 처리
|
||
|
|
|
||
|
|
### Phase 3: UI/UX 개선 (1주)
|
||
|
|
|
||
|
|
1. 드래그 앤 드롭 매핑 에디터
|
||
|
|
2. 실시간 미리보기
|
||
|
|
3. 매핑 템플릿
|
||
|
|
4. 에러 처리 및 로깅
|
||
|
|
|
||
|
|
## 8. 사용 시나리오
|
||
|
|
|
||
|
|
### 8.1 외부 API에서 데이터 가져오기 (GET)
|
||
|
|
|
||
|
|
```
|
||
|
|
고객사 API → 우리 customer 테이블
|
||
|
|
- 고객 정보 동기화
|
||
|
|
- 주문 정보 수집
|
||
|
|
- 재고 정보 업데이트
|
||
|
|
```
|
||
|
|
|
||
|
|
### 8.2 외부 API로 데이터 보내기 (POST)
|
||
|
|
|
||
|
|
```
|
||
|
|
우리 order 테이블 → 배송사 API
|
||
|
|
- 주문 정보 전달
|
||
|
|
- 재고 변동 알림
|
||
|
|
- 상태 업데이트 전송
|
||
|
|
```
|
||
|
|
|
||
|
|
## 9. 기술적 고려사항
|
||
|
|
|
||
|
|
### 9.1 데이터 일관성
|
||
|
|
|
||
|
|
- 트랜잭션 처리
|
||
|
|
- 롤백 메커니즘
|
||
|
|
- 중복 데이터 처리
|
||
|
|
|
||
|
|
### 9.2 성능 최적화
|
||
|
|
|
||
|
|
- 배치 처리
|
||
|
|
- 비동기 처리
|
||
|
|
- 캐싱 전략
|
||
|
|
|
||
|
|
### 9.3 보안
|
||
|
|
|
||
|
|
- 데이터 검증
|
||
|
|
- SQL 인젝션 방지
|
||
|
|
- 민감 데이터 마스킹
|
||
|
|
|
||
|
|
### 9.4 모니터링
|
||
|
|
|
||
|
|
- 매핑 실행 로그
|
||
|
|
- 에러 추적
|
||
|
|
- 성능 메트릭
|
||
|
|
|
||
|
|
## 10. 성공 지표
|
||
|
|
|
||
|
|
- ✅ 외부 API 응답 데이터를 내부 테이블에 정확히 저장
|
||
|
|
- ✅ 내부 테이블 데이터를 외부 API로 정확히 전송
|
||
|
|
- ✅ 필드 매핑 설정이 직관적이고 사용하기 쉬움
|
||
|
|
- ✅ 데이터 변환이 정확하고 안정적
|
||
|
|
- ✅ 에러 발생 시 적절한 처리 및 알림
|
||
|
|
|
||
|
|
## 11. 다음 단계
|
||
|
|
|
||
|
|
1. **우선순위 결정**: GET/POST 중 어느 것부터 구현할지
|
||
|
|
2. **테이블 선택**: 매핑할 주요 테이블들 식별
|
||
|
|
3. **프로토타입**: 간단한 매핑 시나리오로 POC 개발
|
||
|
|
4. **점진적 확장**: 기본 → 고급 기능 순서로 개발
|
||
|
|
|
||
|
|
이 설계서를 바탕으로 단계별로 구현해 나가면 됩니다. 어떤 부분부터 시작하고 싶으신가요?
|