# 외부 호출 기능 구현 계획서 ## 📋 개요 데이터플로우 다이어그램에서 외부 시스템 호출 기능을 구현하여, 데이터 처리 완료 시 다양한 외부 서비스로 알림이나 데이터를 전송할 수 있도록 합니다. ## 🎯 목표 1. **무료/저렴한 알림 방법** 우선 구현 2. **확장 가능한 구조** 설계 3. **사용자 친화적 UI** 제공 4. **안정적인 오류 처리** 구현 --- ## 🚀 Phase 1: 기본 외부 호출 기능 (무료) ### 1.1 REST API 호출 🚧 **현재 상태**: UI만 구현됨 (실제 호출 기능 없음) - ✅ 설정 UI: HTTP 메서드, 헤더, 페이로드 입력 가능 - ❌ 실제 HTTP 요청 전송 기능 없음 - ❌ 백엔드 서비스 구현 필요 ### 1.2 웹훅 호출 🚧 **현재 상태**: UI만 구현됨 (실제 호출 기능 없음) - ✅ 설정 UI: 웹훅 URL 입력 가능 - ❌ 실제 웹훅 전송 기능 없음 - ❌ 백엔드 서비스 구현 필요 ### 1.3 이메일 알림 🔄 **현재 상태**: Java 기반 구현됨 (Node.js 연동 필요) - ✅ Java MailUtil 클래스 구현됨 - ✅ SMTP 설정 및 발송 기능 있음 - ❌ 데이터플로우와 연동 안됨 ### 1.4 통합된 REST API 호출 시스템 🆕 **새로운 중첩 드롭다운 구조로 개선** - **1단계**: 호출 유형 (`REST API 호출`, `이메일 전송`, `FTP 업로드`) - **2단계**: REST API 세부 종류 (`슬랙`, `카카오톡`, `디스코드`, `기타`) - **3단계**: 각 종류별 맞춤 설정 UI ```typescript // ExternalCallService.ts - 통합 구조 class ExternalCallService { // 공통 REST API 호출 메서드 private async callRestApi(config: RestApiConfig) { return await fetch(config.url, { method: config.method, headers: config.headers, body: config.body, }); } // 슬랙 (REST API의 특수 케이스) async sendSlackMessage(settings: SlackSettings) { return await this.callRestApi({ url: settings.slackWebhookUrl, method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: settings.slackMessage, channel: settings.slackChannel, }), }); } // 카카오톡 (REST API의 특수 케이스) async sendKakaoTalk(settings: KakaoSettings) { return await this.callRestApi({ url: "https://kapi.kakao.com/v2/api/talk/memo/default/send", method: "POST", headers: { Authorization: `Bearer ${settings.kakaoAccessToken}` }, body: this.buildKakaoBody(settings.kakaoMessage), }); } // 일반 API (사용자 정의) async callGenericApi(settings: GenericApiSettings) { return await this.callRestApi({ url: settings.apiUrl, method: settings.httpMethod, headers: JSON.parse(settings.headers || "{}"), body: settings.bodyTemplate, }); } } ``` --- ## 🔧 Phase 2: UI/UX 개선 ### 2.1 중첩 드롭다운 구조로 외부 호출 타입 개선 **파일**: `frontend/types/connectionTypes.ts` ```typescript export interface ExternalCallSettings { callType: "rest-api" | "email" | "ftp" | "queue"; // REST API 세부 종류 (중첩 드롭다운) apiType?: "slack" | "kakao-talk" | "discord" | "generic"; // 일반 REST API 설정 (기타 선택 시) apiUrl?: string; httpMethod?: "GET" | "POST" | "PUT" | "DELETE"; headers?: string; bodyTemplate?: string; // 슬랙 전용 설정 slackWebhookUrl?: string; slackChannel?: string; slackMessage?: string; // 카카오톡 전용 설정 kakaoAccessToken?: string; kakaoMessage?: string; // 디스코드 전용 설정 discordWebhookUrl?: string; discordMessage?: string; // 이메일 설정 smtpHost?: string; smtpPort?: number; smtpUser?: string; smtpPass?: string; fromEmail?: string; toEmail?: string; subject?: string; emailBody?: string; } ``` #### **중첩 드롭다운 구조**: 1. **1단계**: 호출 유형 선택 (`REST API 호출`, `이메일 전송`, `FTP 업로드`, `메시지 큐`) 2. **2단계**: REST API 세부 종류 선택 (`슬랙`, `카카오톡`, `디스코드`, `기타`) 3. **3단계**: 각 종류별 맞춤 설정 UI 표시 ### 2.2 중첩 드롭다운 UI 구현 **파일**: `frontend/components/dataflow/connection/ExternalCallSettings.tsx` #### 1단계: 호출 유형 선택 ```tsx ``` #### 2단계: REST API 세부 종류 선택 ```tsx { settings.callType === "rest-api" && ( ); } ``` #### 3단계: 각 종류별 맞춤 설정 ```tsx { /* 슬랙 설정 */ } { settings.apiType === "slack" && ( <>