From 1b800d44983da47119e775ce834a90d9e3c0b907 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Wed, 17 Sep 2025 10:07:57 +0900 Subject: [PATCH] =?UTF-8?q?=EC=99=B8=EB=B6=80=20=ED=98=B8=EC=B6=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EA=B3=84=ED=9A=8D?= =?UTF-8?q?=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/external-call-implementation-plan.md | 604 ++++++++++++++++++++++ 1 file changed, 604 insertions(+) create mode 100644 docs/external-call-implementation-plan.md diff --git a/docs/external-call-implementation-plan.md b/docs/external-call-implementation-plan.md new file mode 100644 index 00000000..276e4f19 --- /dev/null +++ b/docs/external-call-implementation-plan.md @@ -0,0 +1,604 @@ +# 외부 호출 기능 구현 계획서 + +## 📋 개요 + +데이터플로우 다이어그램에서 외부 시스템 호출 기능을 구현하여, 데이터 처리 완료 시 다양한 외부 서비스로 알림이나 데이터를 전송할 수 있도록 합니다. + +## 🎯 목표 + +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" && ( + <> + + +