# ๐Ÿ’ป Developer โ€” Mock API ๋ฐ ํƒ€์ž… ์ •์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹ค์ œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ, AO/TTV ์ง€ํ‘œ๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Mock-up)์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ธฐ๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋ผ. ๐Ÿ’ป Developer: ์ž‘์—… ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. CEO ์ง€์‹œ์— ๋”ฐ๋ผ, Mock API ๋ฐ ํƒ€์ž… ์ •์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ AO/TTV ์ง€ํ‘œ ์ธก์ •์ด ๊ฐ€๋Šฅํ•œ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Mock-up)์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ์‚ฐ์ถœ๋ฌผ์€ TypeScript ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ๊ณผ API ํ†ตํ•ฉ ๋Šฅ๋ ฅ์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ## ๐Ÿ› ๏ธ Mock-up ํ”„๋ ˆ์ž„์›Œํฌ ๊ตฌํ˜„ (TypeScript/Node.js ๊ธฐ๋ฐ˜) ๋‹ค์Œ์€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ •์˜, Mock API ๋ ˆ์ด์–ด, ๊ทธ๋ฆฌ๊ณ  ์„ฑ๋Šฅ ์ง€ํ‘œ ๊ณ„์‚ฐ ๋กœ์ง์„ ํ†ตํ•ฉํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ### 1. ํƒ€์ž… ์ •์˜ (Type Definitions) ๋ฐ์ดํ„ฐ์˜ ๋ช…ํ™•์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๊ตฌ์กฐ์  ํƒ€์ดํ•‘(Discriminated Unions ํŒจํ„ด์„ ์—ผ๋‘์— ๋‘” ๋ช…ํ™•ํ•œ ํƒ€์ž…)์„ ์‚ฌ์šฉํ•˜์—ฌ API ์‘๋‹ต๊ณผ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ```typescript // src/types.ts /** * API ํ˜ธ์ถœ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ํŒ๋ณ„์ž (Discriminant) ์—ญํ•  */ export type ApiStatus = 'SUCCESS' | 'RATE_LIMITED' | 'ERROR'; /** * Mock API์˜ ํ‘œ์ค€ ์‘๋‹ต ๊ตฌ์กฐ (API Design for AI Services ์ค€์ˆ˜) */ export interface MockApiResponse { id: string; status: ApiStatus; data: any; // ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Œ latencyMs: number; // ์‘๋‹ต ์ง€์—ฐ ์‹œ๊ฐ„ ์ธก์ •์šฉ } /** * ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ฒ˜๋ฆฌ์˜ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๊ตฌ์กฐ */ export interface ProcessingInput { inputData: string; contextId: string; } export interface ProcessedResult { success: boolean; processedValue: number; // ์ฒ˜๋ฆฌ๋œ ํ•ต์‹ฌ ๊ฐ’ analysisScore: number; // AO/TTV ์‚ฐ์ถœ์— ์‚ฌ์šฉ๋  ์ค‘๊ฐ„ ์ ์ˆ˜ executionTimeMs: number; // ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ •์šฉ } /** * ์ตœ์ข… ์„ฑ๋Šฅ ์ง€ํ‘œ ๊ฒฐ๊ณผ ๊ตฌ์กฐ (AO/TTV ์ธก์ • ๋ชฉํ‘œ) */ export interface PerformanceMetrics { aoScore: number; // Algorithm Optimization Score (์˜ˆ: ์ •ํ™•๋„ ๊ธฐ๋ฐ˜) ttvScore: number; // Time-to-Value Score (์˜ˆ: ํšจ์œจ์„ฑ ๊ธฐ๋ฐ˜) combinedScore: number; // AO์™€ TTV๋ฅผ ๊ฒฐํ•ฉํ•œ ์ตœ์ข… ์ง€ํ‘œ executionDuration: number; // ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์†Œ์š” ์‹œ๊ฐ„ (ms) } ``` ### 2. Mock API ์„œ๋น„์Šค ๋ ˆ์ด์–ด ์‹ค์ œ ์™ธ๋ถ€ API ํ˜ธ์ถœ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋ฉฐ, ์˜๋„์ ์œผ๋กœ ์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ์˜ค๋ฅ˜๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์•ˆ์ •์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ```typescript // src/mockApi.ts import { MockApiResponse } from './types'; /** * ์™ธ๋ถ€ API ํ˜ธ์ถœ์„ ๋ชจ์˜ํ•˜๋Š” ์„œ๋น„์Šค ๋ ˆ์ด์–ด. * ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ๊ธฐ์— HTTP ํด๋ผ์ด์–ธํŠธ(Axios ๋“ฑ)๋ฅผ ํ†ตํ•ฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. */ export class MockApiService { /** * ์ฃผ์–ด์ง„ ID๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , ์ƒํƒœ์— ๋”ฐ๋ผ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * @param endpoint - ์š”์ฒญํ•  ์—”๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ * @returns MockApiResponse */ public async fetchData(endpoint: string): Promise { console.log(`[MOCK API] Requesting data from: ${endpoint}`); // 1. ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋œ ์ง€์—ฐ ์‹œ๊ฐ„ ๋ถ€์—ฌ const latency = Math.floor(Math.random() * 500) + 100; // 100ms ~ 600ms ๋žœ๋ค ์ง€์—ฐ // 2. ์˜๋„์  ์˜ค๋ฅ˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (์˜ˆ: 10% ํ™•๋ฅ ๋กœ Rate Limit ๋ฐœ์ƒ) if (Math.random() < 0.1) { return { id: 'mock-fail', status: 'RATE_LIMITED', data: { message: 'Too many requests' }, latencyMs: latency, }; } // 3. ์„ฑ๊ณต ์‘๋‹ต ๋ฐ˜ํ™˜ return { id: `data-${Date.now()}`, status: 'SUCCESS', data: { value: Math.random() * 100, complexity: Math.floor(Math.random() * 10) + 1 }, latencyMs: latency, }; } } ``` ### 3. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ์ง€ํ‘œ ๊ณ„์‚ฐ ๋กœ์ง ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ Mock API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜์—ฌ ์ตœ์ข… ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค. ```typescript // src/pipeline.ts import { MockApiService } from './mockApi'; import { ProcessingInput, ProcessedResult, PerformanceMetrics } from './types'; /** * ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ํ•ต์‹ฌ ๋กœ์ง. API ํ˜ธ์ถœ, ์ฒ˜๋ฆฌ ๋ฐ ์ง€ํ‘œ ๊ณ„์‚ฐ์„ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. */ export class DataPipeline { private apiService = new MockApiService(); /** * ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ณ  ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * @param input - ํŒŒ์ดํ”„๋ผ์ธ์— ์ž…๋ ฅ๋  ๋ฐ์ดํ„ฐ ์ปจํ…์ŠคํŠธ * @returns ์ตœ์ข… ์„ฑ๋Šฅ ์ง€ํ‘œ ๊ฐ์ฒด */ public async runPipeline(input: ProcessingInput): Promise { const startTime = Date.now(); try { // 1. Mock API ํ˜ธ์ถœ (API ํ†ตํ•ฉ) const apiResponse = await this.apiService.fetchData(`endpoint/${input.contextId}`); // 2. ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง (AI Code Assurance ๊ด€์ ์˜ ์ •๋ฐ€ ์ฒ˜๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜) const processedValue = apiResponse.data.value * apiResponse.data.complexity; // 3. ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์ƒ์„ฑ const result: ProcessedResult = { success: apiResponse.status === 'SUCCESS', processedValue: processedValue, analysisScore: Math.min(100, Math.max(0, processedValue / 50)), // ์ž„์˜์˜ ๋ถ„์„ ์ ์ˆ˜ ์‚ฐ์ถœ executionTimeMs: apiResponse.latencyMs, // API ์‘๋‹ต ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์œผ๋กœ ํ™œ์šฉ }; // 4. ์ตœ์ข… ์„ฑ๋Šฅ ์ง€ํ‘œ ๊ณ„์‚ฐ (AO/TTV ๊ธฐ๋ฐ˜) const executionDuration = Date.now() - startTime; // AO/TTV ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋กœ์ง (๊ฐ€์ • ๊ธฐ๋ฐ˜) const aoScore = result.analysisScore * 0.6; // ์ •ํ™•๋„ ์ค‘์‹ฌ const ttvScore = (100 - (executionDuration / 1000)) * 0.4; // ์†๋„ ์ค‘์‹ฌ const metrics: PerformanceMetrics = { aoScore: aoScore, ttvScore: ttvScore, combinedScore: aoScore + ttvScore, // AO์™€ TTV์˜ ๊ฐ€์ค‘ ํ‰๊ท  executionDuration: executionDuration, }; return metrics; } catch (error) { console.error("Pipeline Execution Error:", error); return { aoScore: 0, ttvScore: 0, combinedScore: 0, executionDuration: Date.now() - startTime, }; } } } ``` ### 4. ์‹คํ–‰ ์˜ˆ์‹œ (Execution Example) ๋‹ค์Œ์€ ์œ„์—์„œ ๊ตฌํ˜„๋œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. (Node.js ํ™˜๊ฒฝ ๊ฐ€์ •) ```typescript // index.ts (์‹คํ–‰ ํŒŒ์ผ ์˜ˆ์‹œ) import { DataPipeline } from './pipeline'; import { ProcessingInput, PerformanceMetrics } from './types'; async function main() { console.log("========================================="); console.log("๐Ÿš€ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ Mock-up ์‹คํ–‰ ์‹œ์ž‘"); console.log("========================================="); const pipeline = new DataPipeline(); // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 1: ์ •์ƒ์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ const input1: ProcessingInput = { inputData: "Test_Case_A", contextId: "CTX-001-VALID", }; console.log("\n--- Test Case 1: Valid Flow ---"); const metrics1 = await pipeline.runPipeline(input1); console.log("\nโœ… ์ตœ์ข… ์„ฑ๋Šฅ ์ง€ํ‘œ (Test Case 1):"); console.log(`AO Score: ${metrics1.aoScore.toFixed(2)}`); console.log(`TTV Score: ${metrics1.ttvScore.toFixed(2)}`); console.log(`Combined Score: ${metrics1.combinedScore.toFixed(2)}`); console.log(`Execution Time: ${metrics1.executionDuration} ms`); // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 2: ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (๋ฐ˜๋ณต ์‹คํ–‰ํ•˜์—ฌ ์•ˆ์ •์„ฑ ๊ฒ€์ฆ) const input2: ProcessingInput = { inputData: "Test_Case_B", contextId: "CTX-002-FAIL_TEST", }; console.log("\n--- Test Case 2: Error/Rate Limit Simulation ---"); const metrics2 = await pipeline.runPipeline(input2); console.log("\nโš ๏ธ ์ตœ์ข… ์„ฑ๋Šฅ ์ง€ํ‘œ (Test Case 2):"); console.log(`AO Score: ${metrics2.aoScore.toFixed(2)}`); console.log(`TTV Score: ${metrics2.ttvScore.toFixed(2)}`); console.log(`Combined Score: ${metrics2.combinedScore.toFixed(2)}`); console.log(`Execution Time: ${metrics2.executionDuration} ms`); console.log("\n========================================="); console.log("โœจ Mock-up ํ…Œ์ŠคํŠธ ์™„๋ฃŒ."); } main(); ``` ### ๐Ÿ’ก ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋ฐ ์‹คํ–‰ ๊ฐ€์ด๋“œ 1. **ํ™˜๊ฒฝ ์„ค์ •:** Node.js ํ™˜๊ฒฝ์—์„œ ์œ„ ํŒŒ์ผ๋“ค์„ ์ ์ ˆํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  `npm install typescript ts-node` ๋“ฑ์œผ๋กœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 2. **์‹คํ–‰:** `ts-node index.ts` ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. 3. **๊ฒ€์ฆ:** ์ถœ๋ ฅ๋˜๋Š” `Combined Score`์™€ `Execution Time`์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ, Mock API์˜ ์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์˜๋„๋Œ€๋กœ ์„ฑ๋Šฅ ์ง€ํ‘œ์— ๋ฐ˜์˜๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“Š ํ‰๊ฐ€: ์™„๋ฃŒ โ€” CEO์˜ ์š”์ฒญ์‚ฌํ•ญ์ธ Mock API ๋ฐ ํƒ€์ž… ์ •์˜๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ AO/TTV ์ธก์ •์ด ๊ฐ€๋Šฅํ•œ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌํ˜„ ์™„๋ฃŒํ•จ. ๐Ÿ“ ๋‹ค์Œ ๋‹จ๊ณ„: Mock-up์˜ ํ•ต์‹ฌ ๋กœ์ง์— ๋Œ€ํ•ด AI Code Assurance ๊ด€์ ์—์„œ ์ •์  ๋ถ„์„ ๋ฐ ์ž ์žฌ์  ๋ฒ„๊ทธ ๋ฆฌ๋ทฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ๋ณด๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.