# 🌐 μ œμ–΄κ΄€λ¦¬ μ™ΈλΆ€ν˜ΈμΆœ REST API κΈ°λŠ₯ κ΅¬ν˜„ κ³„νšμ„œ ## πŸ“‹ ν”„λ‘œμ νŠΈ κ°œμš” ### λͺ©μ  μ œμ–΄κ΄€λ¦¬ μ‹œμŠ€ν…œμ—μ„œ 관계 생성 μ‹œ μ—°κ²°νƒ€μž…μœΌλ‘œ "μ™ΈλΆ€ν˜ΈμΆœ"을 μ„ νƒν•˜λ©΄ REST API 호좜 κΈ°λŠ₯을 μ„€μ •ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•©λ‹ˆλ‹€. ### ν˜„μž¬ 상황 뢄석 #### κΈ°μ‘΄ μ—°κ²°νƒ€μž… ꡬ쑰 - **데이터 μ €μž₯**: INSERT/UPDATE/DELETE μž‘μ—… 지원 - **μ™ΈλΆ€ 호좜**: κΈ°λ³Έ κ΅¬μ‘°λŠ” μžˆμœΌλ‚˜ REST API μ „μš© μ„€μ • UI ν•„μš” #### κΈ°μ‘΄ μ™ΈλΆ€ν˜ΈμΆœ κΈ°λŠ₯ - `ExternalCallSettings.tsx`: 볡합적인 μ™ΈλΆ€ν˜ΈμΆœ μ„€μ • (REST API, 이메일, FTP, 큐) - `SimpleExternalCallSettings.tsx`: κΈ°μ‘΄ 섀정을 μž¬μ‚¬μš©ν•˜λŠ” λ‹¨μˆœν™”λœ 버전 - `ExternalCallAPI`: REST API ν…ŒμŠ€νŠΈ/μ‹€ν–‰ κΈ°λŠ₯ μ™„λ£Œ - `ExternalCallService`: λ°±μ—”λ“œ 둜직 μ™„λ£Œ ## 🎯 κ΅¬ν˜„ λͺ©ν‘œ ### 1단계: REST API μ „μš© μ„€μ • μ»΄ν¬λ„ŒνŠΈ 개발 κΈ°μ‘΄ 볡합 μ„€μ •μ—μ„œ REST API λΆ€λΆ„λ§Œ μΆ”μΆœν•˜μ—¬ μ „μš© μ»΄ν¬λ„ŒνŠΈ 생성 ### 2단계: μ—°κ²°νƒ€μž… 선택 μ‹œ REST API μ„€μ • 연동 ConnectionTypeSelectorμ—μ„œ "μ™ΈλΆ€ν˜ΈμΆœ" 선택 μ‹œ REST API μ„€μ • νŒ¨λ„ ν‘œμ‹œ ### 3단계: μ„€μ • μ €μž₯ 및 μ‹€ν–‰ 둜직 연동 관계 데이터에 REST API μ„€μ • μ €μž₯ 및 μ‹€ν–‰ μ‹œμ  연동 ## πŸ—οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ 섀계 ### 1. λΆ„λ¦¬λœ μ™ΈλΆ€ν˜ΈμΆœ μ»΄ν¬λ„ŒνŠΈ ꡬ쑰 #### πŸ”„ 섀계 μ² ν•™: μ™„μ „ λΆ„λ¦¬ν˜• μ•„ν‚€ν…μ²˜ κΈ°μ‘΄ 데이터 μ €μž₯ κΈ°λŠ₯κ³Ό μ™„μ „νžˆ λ…λ¦½λœ μ™ΈλΆ€ν˜ΈμΆœ μ „μš© μ»΄ν¬λ„ŒνŠΈλ“€μ„ κ΅¬μ„±ν•˜μ—¬ 각각의 μ±…μž„μ„ λͺ…ν™•νžˆ λΆ„λ¦¬ν•©λ‹ˆλ‹€. #### ExternalCallPanel.tsx (μ‹ κ·œ 생성 - 메인 νŒ¨λ„) ```typescript interface ExternalCallPanelProps { relationshipId: string; onSettingsChange: (settings: ExternalCallConfig) => void; initialSettings?: ExternalCallConfig; } // μ™ΈλΆ€ν˜ΈμΆœ μ „μš© μ„€μ • ꡬ쑰 interface ExternalCallConfig { callType: "rest-api"; // ν–₯ν›„ ν™•μž₯ κ°€λŠ₯ restApiSettings: RestApiSettings; } ``` #### RestApiSettings.tsx (μ‹ κ·œ 생성 - REST API μ „μš©) ```typescript interface RestApiSettingsProps { settings: RestApiSettings; onSettingsChange: (settings: RestApiSettings) => void; } interface RestApiSettings { apiUrl: string; httpMethod: "GET" | "POST" | "PUT" | "DELETE"; headers: Record; bodyTemplate: string; authentication?: { type: "none" | "bearer" | "basic" | "api-key"; token?: string; username?: string; password?: string; apiKey?: string; apiKeyHeader?: string; }; timeout?: number; retryCount?: number; } ``` #### ExternalCallTestPanel.tsx (μ‹ κ·œ 생성 - ν…ŒμŠ€νŠΈ μ „μš©) ```typescript interface ExternalCallTestPanelProps { settings: RestApiSettings; onTestResult: (result: TestResult) => void; } ``` #### μ£Όμš” κΈ°λŠ₯ - **URL μ„€μ •**: API μ—”λ“œν¬μΈνŠΈ URL μž…λ ₯ - **HTTP λ©”μ„œλ“œ**: GET, POST, PUT, DELETE 선택 - **헀더 μ„€μ •**: Content-Type, Authorization λ“± μ»€μŠ€ν…€ 헀더 - **λ°”λ”” ν…œν”Œλ¦Ώ**: POST/PUT μš”μ²­ μ‹œ JSON λ°”λ”” ν…œν”Œλ¦Ώ - **인증 μ„€μ •**: Bearer Token, Basic Auth, API Key 지원 - **κ³ κΈ‰ μ„€μ •**: νƒ€μž„μ•„μ›ƒ, μž¬μ‹œλ„ 횟수 - **ν…ŒμŠ€νŠΈ κΈ°λŠ₯**: μ„€μ •ν•œ API μ‹€μ œ 호좜 ν…ŒμŠ€νŠΈ ### 2. μ—°κ²°νƒ€μž… 선택 ν”Œλ‘œμš° κ°œμ„  #### ConnectionTypeSelector μˆ˜μ • ```typescript // κΈ°μ‘΄ μ½”λ“œ μœ μ§€, μ™ΈλΆ€ν˜ΈμΆœ 선택 μ‹œ 이벀트 처리만 μΆ”κ°€ const connectionTypes: ConnectionType[] = [ { id: "data_save", label: "데이터 μ €μž₯", description: "INSERT/UPDATE/DELETE μž‘μ—…", icon: , }, { id: "external_call", label: "μ™ΈλΆ€ 호좜", description: "REST API 호좜", // μ„€λͺ… μ—…λ°μ΄νŠΈ icon: , }, ]; ``` #### ConnectionSetupModal μˆ˜μ • ```typescript // μ™ΈλΆ€ν˜ΈμΆœ 선택 μ‹œ μ™„μ „ λΆ„λ¦¬λœ ExternalCallPanel ν‘œμ‹œ { selectedConnectionType === "external_call" && ( ); } // 데이터 μ €μž₯ 선택 μ‹œ κΈ°μ‘΄ DataSavePanel ν‘œμ‹œ { selectedConnectionType === "data_save" && ( ); } ``` ### 3. 데이터 ꡬ쑰 ν™•μž₯ #### 관계 데이터 μŠ€ν‚€λ§ˆ ν™•μž₯ ```sql -- relationships ν…Œμ΄λΈ”μ— rest_api_settings 컬럼 μΆ”κ°€ (JSON νƒ€μž…) ALTER TABLE relationships ADD COLUMN rest_api_settings JSONB; -- 인덱슀 μΆ”κ°€ (μ„±λŠ₯ μ΅œμ ν™”) CREATE INDEX idx_relationships_rest_api_settings ON relationships USING GIN (rest_api_settings); ``` #### TypeScript νƒ€μž… μ •μ˜ ```typescript // types/connectionTypes.ts ν™•μž₯ export interface RelationshipData { id: string; sourceNodeId: string; targetNodeId: string; connectionType: "data_save" | "external_call"; // κΈ°μ‘΄ ν•„λ“œλ“€... dataSaveSettings?: DataSaveSettings; // μƒˆλ‘œ μΆ”κ°€ restApiSettings?: RestApiSettings; } ``` ## πŸ“± UI/UX 섀계 ### 1. REST API μ„€μ • νŒ¨λ„ λ ˆμ΄μ•„μ›ƒ ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 🌐 REST API μ„€μ • [ν…ŒμŠ€νŠΈ] λ²„νŠΌ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ API URL β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ https://api.example.com/webhook β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ HTTP λ©”μ„œλ“œ β”‚ 인증 방식 β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ POST β–Ό β”‚ β”‚ β”‚ Bearer Token β–Ό β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ 헀더 μ„€μ • β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Content-Type: application/json β”‚ β”‚ β”‚ β”‚ Authorization: Bearer {token} β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ μš”μ²­ λ°”λ”” ν…œν”Œλ¦Ώ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ { β”‚ β”‚ β”‚ β”‚ "message": "{{message}}", β”‚ β”‚ β”‚ β”‚ "data": {{sourceData}}, β”‚ β”‚ β”‚ β”‚ "timestamp": "{{timestamp}}" β”‚ β”‚ β”‚ β”‚ } β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ κ³ κΈ‰ μ„€μ • β”‚ β”‚ νƒ€μž„μ•„μ›ƒ: [30] 초 μž¬μ‹œλ„: [3] 회 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### 2. ν…œν”Œλ¦Ώ λ³€μˆ˜ 지원 #### μ‚¬μš© κ°€λŠ₯ν•œ ν…œν”Œλ¦Ώ λ³€μˆ˜ - `{{sourceData}}`: μ†ŒμŠ€ λ…Έλ“œμ˜ 전체 데이터 - `{{targetData}}`: νƒ€κ²Ÿ λ…Έλ“œμ˜ 데이터 (μžˆλŠ” 경우) - `{{timestamp}}`: ν˜„μž¬ νƒ€μž„μŠ€νƒ¬ν”„ - `{{relationshipId}}`: 관계 ID - `{{diagramId}}`: λ‹€μ΄μ–΄κ·Έλž¨ ID - `{{userId}}`: ν˜„μž¬ μ‚¬μš©μž ID #### ν…œν”Œλ¦Ώ λ„μš°λ―Έ UI ```typescript const TemplateHelper = () => (
μ‚¬μš© κ°€λŠ₯ν•œ ν…œν”Œλ¦Ώ λ³€μˆ˜
{"{{sourceData}}"} - μ†ŒμŠ€ λ…Έλ“œ 데이터
{"{{timestamp}}"} - ν˜„μž¬ μ‹œκ°„
{"{{relationshipId}}"} - 관계 ID
); ``` ## πŸ”§ κ΅¬ν˜„ 단계별 κ³„νš ### Phase 1: κΈ°λ³Έ REST API μ„€μ • μ»΄ν¬λ„ŒνŠΈ (1-2일) #### 1.1 λΆ„λ¦¬λœ μ»΄ν¬λ„ŒνŠΈ ꡬ쑰 생성 - [ ] **ExternalCallPanel.tsx**: μ™ΈλΆ€ν˜ΈμΆœ 메인 νŒ¨λ„ μ»΄ν¬λ„ŒνŠΈ - [ ] **RestApiSettings.tsx**: REST API μ „μš© μ„€μ • μ»΄ν¬λ„ŒνŠΈ - [ ] **ExternalCallTestPanel.tsx**: API ν…ŒμŠ€νŠΈ μ „μš© μ»΄ν¬λ„ŒνŠΈ - [ ] **μ™ΈλΆ€ν˜ΈμΆœ μ „μš© 디렉토리**: `components/dataflow/external-call/` 생성 #### 1.2 νƒ€μž… μ •μ˜ 뢄리 - [ ] **ExternalCallTypes.ts**: μ™ΈλΆ€ν˜ΈμΆœ μ „μš© νƒ€μž… μ •μ˜ 파일 생성 - [ ] **RestApiTypes.ts**: REST API μ „μš© νƒ€μž… μ •μ˜ - [ ] κΈ°μ‘΄ `connectionTypes.ts`와 μ™„μ „ λΆ„λ¦¬ν•˜μ—¬ 독립성 확보 ### Phase 2: μ—°κ²°νƒ€μž… 선택 연동 (1일) #### 2.1 ConnectionSetupModal μˆ˜μ • - [ ] μ™ΈλΆ€ν˜ΈμΆœ 선택 μ‹œ RestApiSettings μ»΄ν¬λ„ŒνŠΈ ν‘œμ‹œ - [ ] μƒνƒœ 관리 둜직 μΆ”κ°€ - [ ] μ„€μ • μ €μž₯/뢈러였기 연동 #### 2.2 ConnectionTypeSelector μ„€λͺ… μ—…λ°μ΄νŠΈ - [ ] μ™ΈλΆ€ν˜ΈμΆœ μ„€λͺ…을 "REST API 호좜"둜 λͺ…ν™•ν™” ### Phase 3: 인증 및 κ³ κΈ‰ κΈ°λŠ₯ (2-3일) #### 3.1 인증 방식 지원 - [ ] Bearer Token 인증 - [ ] Basic Authentication - [ ] API Key 인증 (헀더/쿼리 νŒŒλΌλ―Έν„°) - [ ] 인증 정보 μ•”ν˜Έν™” μ €μž₯ #### 3.2 κ³ κΈ‰ μ„€μ • - [ ] νƒ€μž„μ•„μ›ƒ μ„€μ • - [ ] μž¬μ‹œλ„ 둜직 - [ ] 응닡 검증 κ·œμΉ™ ### Phase 4: ν…ŒμŠ€νŠΈ 및 μ‹€ν–‰ κΈ°λŠ₯ (1-2일) #### 4.1 ν…ŒμŠ€νŠΈ κΈ°λŠ₯ κ΅¬ν˜„ - [ ] μ„€μ •ν•œ API μ‹€μ œ 호좜 ν…ŒμŠ€νŠΈ - [ ] 응닡 κ²°κ³Ό ν‘œμ‹œ - [ ] 였λ₯˜ λ©”μ‹œμ§€ 상세 ν‘œμ‹œ #### 4.2 μ‹€ν–‰ 둜직 연동 - [ ] 관계 μ‹€ν–‰ μ‹œ REST API 호좜 - [ ] ν…œν”Œλ¦Ώ λ³€μˆ˜ μΉ˜ν™˜ - [ ] μ‹€ν–‰ κ²°κ³Ό λ‘œκΉ… ### Phase 5: ν…œν”Œλ¦Ώ μ‹œμŠ€ν…œ 고도화 (2-3일) #### 5.1 ν…œν”Œλ¦Ώ λ³€μˆ˜ ν™•μž₯ - [ ] μ†ŒμŠ€/νƒ€κ²Ÿ 데이터 μ ‘κ·Ό - [ ] 쑰건뢀 ν…œν”Œλ¦Ώ (if/else) - [ ] 반볡 ν…œν”Œλ¦Ώ (for loop) #### 5.2 ν…œν”Œλ¦Ώ 에디터 κ°œμ„  - [ ] 문법 ν•˜μ΄λΌμ΄νŒ… - [ ] μžλ™μ™„μ„± - [ ] μ‹€μ‹œκ°„ 미리보기 ### Phase 6: λ°μ΄ν„°λ² μ΄μŠ€ 및 λ°±μ—”λ“œ 연동 (1일) #### 6.1 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ μ—…λ°μ΄νŠΈ - [ ] relationships ν…Œμ΄λΈ”μ— rest_api_settings 컬럼 μΆ”κ°€ - [ ] λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 슀크립트 μž‘μ„± #### 6.2 λ°±μ—”λ“œ API μˆ˜μ • - [ ] 관계 μ €μž₯ μ‹œ REST API μ„€μ • μ €μž₯ - [ ] 관계 μ‹€ν–‰ μ‹œ REST API 호좜 둜직 ## πŸ§ͺ ν…ŒμŠ€νŠΈ κ³„νš ### 1. λ‹¨μœ„ ν…ŒμŠ€νŠΈ - [ ] RestApiSettings μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§ ν…ŒμŠ€νŠΈ - [ ] μž…λ ₯κ°’ 검증 둜직 ν…ŒμŠ€νŠΈ - [ ] ν…œν”Œλ¦Ώ λ³€μˆ˜ μΉ˜ν™˜ ν…ŒμŠ€νŠΈ ### 2. 톡합 ν…ŒμŠ€νŠΈ - [ ] μ—°κ²°νƒ€μž… 선택 β†’ REST API μ„€μ • ν”Œλ‘œμš° - [ ] μ„€μ • μ €μž₯ β†’ 뢈러였기 ν…ŒμŠ€νŠΈ - [ ] API 호좜 β†’ 응닡 처리 ν…ŒμŠ€νŠΈ ### 3. E2E ν…ŒμŠ€νŠΈ - [ ] 전체 관계 생성 β†’ μ‹€ν–‰ ν”Œλ‘œμš° - [ ] λ‹€μ–‘ν•œ API μ„œλΉ„μŠ€μ™€μ˜ 연동 ν…ŒμŠ€νŠΈ - [ ] 였λ₯˜ 상황 처리 ν…ŒμŠ€νŠΈ ## πŸ”’ λ³΄μ•ˆ 고렀사항 ### 1. 인증 정보 보호 - [ ] API ν‚€, 토큰 λ“± 민감 정보 μ•”ν˜Έν™” μ €μž₯ - [ ] ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ 민감 정보 λ§ˆμŠ€ν‚Ή ν‘œμ‹œ - [ ] λ‘œκ·Έμ— 민감 정보 λ…ΈμΆœ λ°©μ§€ ### 2. API 호좜 μ œν•œ - [ ] 호좜 λΉˆλ„ μ œν•œ (Rate Limiting) - [ ] ν—ˆμš©λœ λ„λ©”μΈλ§Œ 호좜 κ°€λŠ₯ν•˜λ„λ‘ μ œν•œ - [ ] νƒ€μž„μ•„μ›ƒ μ„€μ •μœΌλ‘œ λ¬΄ν•œ λŒ€κΈ° λ°©μ§€ ### 3. μž…λ ₯κ°’ 검증 - [ ] URL ν˜•μ‹ 검증 - [ ] JSON ν…œν”Œλ¦Ώ 문법 검증 - [ ] XSS, μΈμ μ…˜ 곡격 λ°©μ§€ ## πŸ“Š μ„±λŠ₯ μ΅œμ ν™” ### 1. ν”„λ‘ νŠΈμ—”λ“œ μ΅œμ ν™” - [ ] μ»΄ν¬λ„ŒνŠΈ μ§€μ—° λ‘œλ”© (Lazy Loading) - [ ] μ„€μ • λ³€κ²½ μ‹œ λ””λ°”μš΄μ‹± 적용 - [ ] λ©”λͺ¨μ΄μ œμ΄μ…˜μœΌλ‘œ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§ λ°©μ§€ ### 2. λ°±μ—”λ“œ μ΅œμ ν™” - [ ] API 호좜 κ²°κ³Ό 캐싱 - [ ] 비동기 처리둜 응닡 μ‹œκ°„ 단좕 - [ ] μ—°κ²° ν’€λ§μœΌλ‘œ λ¦¬μ†ŒμŠ€ νš¨μœ¨ν™” ## πŸš€ 배포 및 λͺ¨λ‹ˆν„°λ§ ### 1. 배포 μ „λž΅ - [ ] κΈ°λŠ₯ ν”Œλž˜κ·Έλ‘œ 점진적 배포 - [ ] A/B ν…ŒμŠ€νŠΈλ‘œ μ‚¬μš©μ„± 검증 - [ ] λ‘€λ°± κ³„νš 수립 ### 2. λͺ¨λ‹ˆν„°λ§ - [ ] API 호좜 성곡/μ‹€νŒ¨μœ¨ λͺ¨λ‹ˆν„°λ§ - [ ] 응닡 μ‹œκ°„ 좔적 - [ ] 였λ₯˜ 둜그 μˆ˜μ§‘ 및 μ•Œλ¦Ό ## πŸ“ λ¬Έμ„œν™” ### 1. μ‚¬μš©μž κ°€μ΄λ“œ - [ ] REST API μ„€μ • 방법 κ°€μ΄λ“œ - [ ] ν…œν”Œλ¦Ώ λ³€μˆ˜ μ‚¬μš©λ²• - [ ] 일반적인 API 연동 예제 ### 2. 개발자 λ¬Έμ„œ - [ ] μ»΄ν¬λ„ŒνŠΈ API λ¬Έμ„œ - [ ] λ°±μ—”λ“œ API λͺ…μ„Έ - [ ] ν™•μž₯ κ°€μ΄λ“œ ## 🎯 성곡 μ§€ν‘œ ### 1. κΈ°λŠ₯적 μ§€ν‘œ - [ ] REST API μ„€μ • μ™„λ£Œμœ¨ > 95% - [ ] API 호좜 성곡λ₯  > 98% - [ ] μ„€μ • μ €μž₯/뢈러였기 성곡λ₯  > 99% ### 2. μ‚¬μš©μ„± μ§€ν‘œ - [ ] μ„€μ • μ™„λ£Œ μ‹œκ°„ < 5λΆ„ - [ ] μ‚¬μš©μž λ§Œμ‘±λ„ > 4.0/5.0 - [ ] 지원 μš”μ²­ κ°μ†Œμœ¨ > 30% ## πŸ“… 일정 κ³„νš | 단계 | κΈ°κ°„ | μ£Όμš” μž‘μ—… | | ----------- | ---------- | ---------------------------------- | | Phase 1 | 1-2일 | RestApiSettings μ»΄ν¬λ„ŒνŠΈ κΈ°λ³Έ κ΅¬ν˜„ | | Phase 2 | 1일 | μ—°κ²°νƒ€μž… 선택 연동 | | Phase 3 | 2-3일 | 인증 및 κ³ κΈ‰ κΈ°λŠ₯ | | Phase 4 | 1-2일 | ν…ŒμŠ€νŠΈ 및 μ‹€ν–‰ κΈ°λŠ₯ | | Phase 5 | 2-3일 | ν…œν”Œλ¦Ώ μ‹œμŠ€ν…œ 고도화 | | Phase 6 | 1일 | λ°μ΄ν„°λ² μ΄μŠ€ 및 λ°±μ—”λ“œ 연동 | | **총 κΈ°κ°„** | **8-12일** | **전체 κΈ°λŠ₯ μ™„μ„±** | ## πŸ”„ ν–₯ν›„ ν™•μž₯ κ³„νš ### 1. μΆ”κ°€ ν”„λ‘œν† μ½œ 지원 - [ ] GraphQL API 지원 - [ ] WebSocket μ—°κ²° - [ ] gRPC 호좜 ### 2. κ³ κΈ‰ κΈ°λŠ₯ - [ ] API 응닡 기반 쑰건뢀 μ‹€ν–‰ - [ ] μ—¬λŸ¬ API 순차/병렬 호좜 - [ ] API 응닡 데이터 νŒŒμ‹± 및 μ €μž₯ ### 3. 톡합 κΈ°λŠ₯ - [ ] μ™ΈλΆ€ API λ¬Έμ„œ μžλ™ κ°€μ Έμ˜€κΈ° - [ ] Postman μ»¬λ ‰μ…˜ μž„ν¬νŠΈ - [ ] OpenAPI μŠ€νŽ™ 지원 --- 이 κ³„νšμ„œλ₯Ό λ°”νƒ•μœΌλ‘œ λ‹¨κ³„λ³„λ‘œ κ΅¬ν˜„μ„ μ§„ν–‰ν•˜λ©΄ μ•ˆμ •μ μ΄κ³  μ‚¬μš©μž μΉœν™”μ μΈ REST API μ™ΈλΆ€ν˜ΈμΆœ κΈ°λŠ₯을 μ™„μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.