7.0 KiB
7.0 KiB
외부호출 데이터 매핑 시스템 설계서
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 테이블 확장
ALTER TABLE external_call_configs ADD COLUMN IF NOT EXISTS data_mapping_config JSONB;
4.2 data_mapping_config JSON 구조
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
interface DataMappingSettingsProps {
config: DataMappingConfig;
onConfigChange: (config: DataMappingConfig) => void;
httpMethod: string;
availableTables: TableInfo[];
}
// 주요 기능:
// - 방향 선택 (inbound/outbound/bidirectional)
// - 소스/타겟 테이블 선택
// - 필드 매핑 에디터
// - 데이터 변환 설정
5.2 FieldMappingEditor.tsx
interface FieldMappingEditorProps {
mappings: FieldMapping[];
sourceFields: FieldInfo[];
targetFields: FieldInfo[];
onMappingsChange: (mappings: FieldMapping[]) => void;
}
// 주요 기능:
// - 드래그 앤 드롭으로 필드 매핑
// - 데이터 타입 자동 추론
// - 변환 함수 설정
// - 필수 필드 검증
5.3 DataTransformEditor.tsx
// 데이터 변환 규칙 설정
// - 상수값 할당
// - 날짜 포맷 변환
// - 문자열 변환 (대소문자, 트림 등)
// - 커스텀 함수 적용
6. 백엔드 서비스 확장
6.1 ExternalCallExecutor 확장
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 (신규)
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주)
- 데이터베이스 스키마 확장
- DataMappingSettings 컴포넌트 개발
- 기본 필드 매핑 기능
- GET 요청 응답 데이터 저장
Phase 2: 고급 매핑 기능 (1-2주)
- POST 요청 데이터 송신
- 필드 변환 기능
- upsert/update 모드
- 배치 처리
Phase 3: UI/UX 개선 (1주)
- 드래그 앤 드롭 매핑 에디터
- 실시간 미리보기
- 매핑 템플릿
- 에러 처리 및 로깅
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. 다음 단계
- 우선순위 결정: GET/POST 중 어느 것부터 구현할지
- 테이블 선택: 매핑할 주요 테이블들 식별
- 프로토타입: 간단한 매핑 시나리오로 POC 개발
- 점진적 확장: 기본 → 고급 기능 순서로 개발
이 설계서를 바탕으로 단계별로 구현해 나가면 됩니다. 어떤 부분부터 시작하고 싶으신가요?