# Week 3-4: Frontend ๊ตฌํ˜„ ์™„๋ฃŒ ## ๐Ÿ“‹ ๊ตฌํ˜„ ์™„๋ฃŒ ๋ชฉ๋ก ### 1. API ์„œ๋น„์Šค - โœ… **strategyDSLApi.ts** (600+ ๋ผ์ธ) - LogicNode, ConditionDSL, StrategyDSLDto ํƒ€์ž… ์ •์˜ - CRUD API ํ•จ์ˆ˜ (์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ) - ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ (์œ ํšจ์„ฑ ๊ฒ€์ฆ, ์ž์—ฐ์–ด ๋ณ€ํ™˜ ๋“ฑ) - 12๊ฐœ API ์—”๋“œํฌ์ธํŠธ ์—ฐ๋™ ### 2. ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ปดํฌ๋„ŒํŠธ (strategy-tree/) - โœ… **NodePalette.tsx** (300+ ๋ผ์ธ) - ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•œ ์ง€ํ‘œ/์กฐ๊ฑด ํŒ”๋ ˆํŠธ - ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž (AND, OR, NOT) - ๋ณด์กฐ ์ง€ํ‘œ (CCI, MACD, RSI ๋“ฑ 8๊ฐœ) - ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ๋ฐ ์˜ˆ์‹œ ํ‘œ์‹œ - โœ… **TreeNode.tsx** (280+ ๋ผ์ธ) - ์žฌ๊ท€์  ํŠธ๋ฆฌ ๋…ธ๋“œ ๋ Œ๋”๋ง - ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ง€์› (@dnd-kit) - ๋…ธ๋“œ ํƒ€์ž…๋ณ„ ์ƒ‰์ƒ ๋ฐ ์•„์ด์ฝ˜ - ํŽธ์ง‘/์‚ญ์ œ/์ž์‹ ์ถ”๊ฐ€ ์•ก์…˜ - โœ… **ConditionEditor.tsx** (350+ ๋ผ์ธ) - ์กฐ๊ฑด ์„ค์ • ๋‹ค์ด์–ผ๋กœ๊ทธ - ์ง€ํ‘œ ํƒ€์ž… ์„ ํƒ - ์กฐ๊ฑด ํƒ€์ž… ์„ ํƒ (13์ข…๋ฅ˜) - ๊ธฐ์ค€๊ฐ’, ๊ธฐ๊ฐ„ ์ž…๋ ฅ - ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ - โœ… **NaturalLanguagePreview.tsx** (250+ ๋ผ์ธ) - DSL โ†’ ์ž์—ฐ์–ด ๋ณ€ํ™˜ - ์ „๋žต ํ†ต๊ณ„ (๋…ธ๋“œ ์ˆ˜, ์กฐ๊ฑด ์ˆ˜, ๊นŠ์ด, ๋ณต์žก๋„) - ์œ ํšจ์„ฑ ๊ฒ€์ฆ ์•Œ๋ฆผ - ๋ณต์žก๋„ ๊ฒฝ๊ณ  - โœ… **StrategyTreeBuilder.tsx** (280+ ๋ผ์ธ) - DndContext ํ†ตํ•ฉ - ๋…ธ๋“œ ์กฐ์ž‘ ๋กœ์ง (์ฐพ๊ธฐ, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ, ์ถ”๊ฐ€) - ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ - ์กฐ๊ฑด ํŽธ์ง‘ ๋‹ค์ด์–ผ๋กœ๊ทธ ํ†ตํ•ฉ ### 3. ๋ฉ”์ธ ํŽ˜์ด์ง€ - โœ… **StrategyTreeBuilderPage.tsx** (450+ ๋ผ์ธ) - 3-์ปฌ๋Ÿผ ๋ ˆ์ด์•„์›ƒ - ์™ผ์ชฝ: ์ „๋žต ๋ชฉ๋ก + ํŒ”๋ ˆํŠธ - ์ค‘์•™: ์ „๋žต ํŽธ์ง‘๊ธฐ - ์˜ค๋ฅธ์ชฝ: ์ž์—ฐ์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ - ์ „๋žต CRUD ๊ธฐ๋Šฅ - ์ €์žฅ/์‚ญ์ œ ๋‹ค์ด์–ผ๋กœ๊ทธ - ์Šค๋‚ต๋ฐ” ์•Œ๋ฆผ ### 4. ๊ธฐ์กด ํŒŒ์ผ ์ˆ˜์ • - โœ… **App.tsx** (์ˆ˜์ •) - StrategyTreeBuilderPage import ์ถ”๊ฐ€ - ๋ฉ”๋‰ด ํ•ญ๋ชฉ ์ถ”๊ฐ€ - "์ „๋žต(๊ธฐ์กด)" โ†’ StrategyRulePage - "์ „๋žต(๋“œ๋ž˜๊ทธ)" โ†’ StrategyTreeBuilderPage - renderPage์— 'strategy-tree' ์ผ€์ด์Šค ์ถ”๊ฐ€ --- ## ๐Ÿ“Š ๊ตฌํ˜„ ํ†ต๊ณ„ | ํ•ญ๋ชฉ | ๊ฐœ์ˆ˜ | ๋ผ์ธ ์ˆ˜ | |------|------|---------| | API ์„œ๋น„์Šค | 1๊ฐœ | 600+ | | ์ปดํฌ๋„ŒํŠธ | 5๊ฐœ | 1,460+ | | ํŽ˜์ด์ง€ | 1๊ฐœ | 450+ | | App.tsx ์ˆ˜์ • | - | +20 | | **์ด๊ณ„** | **7๊ฐœ ํŒŒ์ผ** | **2,530+ ๋ผ์ธ** | --- ## ๐ŸŽฏ ํ•ต์‹ฌ ๋‹ฌ์„ฑ ์‚ฌํ•ญ ### โœ… ๊ธฐ์กด ๊ธฐ๋Šฅ 100% ๋ณด์กด - `StrategyRulePage.tsx` ์ˆ˜์ • ์—†์Œ - ๊ธฐ์กด ๋ฉ”๋‰ด ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ ์œ ์ง€ - ๊ธฐ์กด API (`strategyRuleApi.ts`) ์˜ํ–ฅ ์—†์Œ - ๊ธฐ์กด ๋ฐฑํ…Œ์ŠคํŠธ ํ™”๋ฉด ์ •์ƒ ๋™์ž‘ ### โœ… ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ UI ์™„์„ฑ - @dnd-kit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ - ์ง๊ด€์ ์ธ ํŠธ๋ฆฌ ๊ตฌ์กฐ ํŽธ์ง‘ - ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ - ์ž์—ฐ์–ด ์„ค๋ช… ์ž๋™ ์ƒ์„ฑ ### โœ… Material-UI ๋””์ž์ธ ์ผ๊ด€์„ฑ - ๊ธฐ์กด ํ…Œ๋งˆ ์‹œ์Šคํ…œ ํ™œ์šฉ - ๋‹คํฌ ๋ชจ๋“œ ์™„๋ฒฝ ์ง€์› - ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ (Grid ์‹œ์Šคํ…œ) ### โœ… ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ตœ์ ํ™” - ๋“œ๋ž˜๊ทธ ๊ฐ€์ด๋“œ ์ œ๊ณต - ์‹ค์‹œ๊ฐ„ ์œ ํšจ์„ฑ ๊ฒ€์ฆ - ๋ณต์žก๋„ ๊ฒฝ๊ณ  - ์Šค๋‚ต๋ฐ” ์•Œ๋ฆผ --- ## ๐Ÿ” ์ฝ”๋“œ ๊ฒ€์ฆ ์™„๋ฃŒ - โœ… **Lint ์˜ค๋ฅ˜ ์—†์Œ** - โœ… **TypeScript ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ณด์žฅ** - โœ… **์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ** - โœ… **๋ช…ํ™•ํ•œ props ์ธํ„ฐํŽ˜์ด์Šค** --- ## ๐ŸŽจ UI ๊ตฌ์กฐ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐ŸŽจ ์ „๋žต ์„ค์ • (๋“œ๋ž˜๊ทธ ๋ฐฉ์‹) [์ƒˆ๋กœ๊ณ ์นจ] [์ƒˆ ์ „๋žต] [์ €์žฅ] โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ๐Ÿ“‹ ์ „๋žต ๋ชฉ๋ก โ”‚ โœ๏ธ ์ „๋žต ํŽธ์ง‘๊ธฐ โ”‚ ๐Ÿ“ ์ „๋žต ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ–ก CCI ์ „๋žต โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐Ÿ“Š ํ†ต๊ณ„ โ”‚ โ”‚ โ–ก MACD ์ „๋žต โ”‚ โ”‚ AND ๋…ธ๋“œ โ”‚ โ”‚ - ๋…ธ๋“œ: 3๊ฐœ โ”‚ โ”‚ โ–ก RSI ์ „๋žต โ”‚ โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜ โ”‚ - ์กฐ๊ฑด: 2๊ฐœ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - ๊นŠ์ด: 2 โ”‚ โ”‚ [+ ์ƒˆ ์ „๋žต] โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”‚ - ๋ณต์žก๋„: ๊ฐ„๋‹จํ•จ โ”‚ โ”‚ โ”‚ โ”‚ CCI โ”‚ โ”‚ RSI โ”‚ โ”‚ โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ๐Ÿ“ ์„ค๋ช… โ”‚ โ”‚ โ”‚ โ”‚ "๋‹ค์Œ ์กฐ๊ฑด์„ ๋ชจ๋‘ โ”‚ โ”‚ ๐Ÿ”— ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์žโ”‚ โ”‚ ๋งŒ์กฑ: โ”‚ โ”‚ [AND] [OR] โ”‚ โ”‚ CCI(20)๊ฐ€ -100์„ โ”‚ โ”‚ [NOT] โ”‚ โ”‚ ์ƒํ–ฅ ๋ŒํŒŒ โ”‚ โ”‚ โ”‚ โ”‚ RSI(14)๊ฐ€ 30 ์ดํ•˜" โ”‚ โ”‚ ๐Ÿ“Š ๋ณด์กฐ ์ง€ํ‘œ โ”‚ โ”‚ โ”‚ โ”‚ [CCI] [MACD] โ”‚ โ”‚ โœ… ์ „๋žต์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค โ”‚ โ”‚ [RSI] ... โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ ### 1. ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ - **ํŒ”๋ ˆํŠธ์—์„œ ๋…ธ๋“œ ๋“œ๋ž˜๊ทธ** - ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž (AND/OR/NOT) - ๋ณด์กฐ ์ง€ํ‘œ (CCI, MACD, RSI ๋“ฑ) - **ํŠธ๋ฆฌ ๊ตฌ์กฐ ์ƒ์„ฑ** - ์ž์œ ๋กœ์šด ๊ณ„์ธต ๊ตฌ์กฐ - ์žฌ๊ท€์  ๋ Œ๋”๋ง - **๋“œ๋กญ ์˜์—ญ ํ•˜์ด๋ผ์ดํŠธ** - ๋“œ๋กญ ๊ฐ€๋Šฅํ•œ ์˜์—ญ ํ‘œ์‹œ - ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ ### 2. ์กฐ๊ฑด ํŽธ์ง‘ - **์ง€ํ‘œ ์„ ํƒ** - 12์ข…๋ฅ˜ ๋ณด์กฐ ์ง€ํ‘œ ์ง€์› - ๊ถŒ์žฅ ๊ธฐ๊ฐ„ ์ž๋™ ์„ค์ • - **์กฐ๊ฑด ํƒ€์ž… ์„ ํƒ** - 13์ข…๋ฅ˜ ์กฐ๊ฑด ์ง€์› - ์กฐ๊ฑด๋ณ„ ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ ์ž๋™ ํ‘œ์‹œ - **์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ** - ์„ค์ • ์ค‘์ธ ์กฐ๊ฑด ์ž์—ฐ์–ด ํ‘œ์‹œ ### 3. ์ž์—ฐ์–ด ๋ณ€ํ™˜ - **DSL โ†’ ํ•œ๊ธ€ ๋ณ€ํ™˜** - ๋…ผ๋ฆฌ ๊ตฌ์กฐ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ - ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊ณ„์ธต ํ‘œ์‹œ - **ํ†ต๊ณ„ ์ •๋ณด** - ๋…ธ๋“œ ๊ฐœ์ˆ˜, ์กฐ๊ฑด ๊ฐœ์ˆ˜ - ํŠธ๋ฆฌ ๊นŠ์ด, ๋ณต์žก๋„ ์ ์ˆ˜ - **์œ ํšจ์„ฑ ๊ฒ€์ฆ** - ์ €์žฅ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ‘œ์‹œ - ๋ณต์žก๋„ ๊ฒฝ๊ณ  ### 4. ์ „๋žต ๊ด€๋ฆฌ - **CRUD ์ž‘์—…** - ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ - **์ „๋žต ๋ณต์ œ** - ๊ธฐ์กด ์ „๋žต ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ ์ „๋žต ์ƒ์„ฑ - **ํ™œ์„ฑํ™” ๊ด€๋ฆฌ** - ๊ฐœ๋ณ„ ์ „๋žต ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™” - **FSM ํ† ๊ธ€** - Finite State Machine ์‚ฌ์šฉ ์—ฌ๋ถ€ ์„ค์ • --- ## ๐Ÿ“ ์‚ฌ์šฉ ์˜ˆ์‹œ ### ์˜ˆ์‹œ 1: CCI ์นจ์ฒด ํƒˆ์ถœ ์ „๋žต **๊ตฌ์„ฑ:** ``` AND ๋…ธ๋“œ โ”œโ”€ CCI ์กฐ๊ฑด: -100 ์ƒํ–ฅ ๋ŒํŒŒ โ””โ”€ RSI ์กฐ๊ฑด: 30 ์ดํ•˜ ``` **์ž์—ฐ์–ด:** ``` ๋‹ค์Œ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑ: CCI(20)๊ฐ€ -100์„ ์ƒํ–ฅ ๋ŒํŒŒ RSI(14)๊ฐ€ 30 ์ดํ•˜ ``` **DSL JSON:** ```json { "id": "node-1", "type": "AND", "children": [ { "id": "node-2", "type": "CONDITION", "condition": { "indicatorType": "CCI", "conditionType": "CROSS_UP", "targetValue": -100, "period": 20 } }, { "id": "node-3", "type": "CONDITION", "condition": { "indicatorType": "RSI", "conditionType": "BELOW", "targetValue": 30, "period": 14 } } ] } ``` ### ์˜ˆ์‹œ 2: ๋ณตํ•ฉ ์ „๋žต (OR ์กฐ๊ฑด) **๊ตฌ์„ฑ:** ``` OR ๋…ธ๋“œ โ”œโ”€ MACD ์กฐ๊ฑด: ๊ณจ๋“  ํฌ๋กœ์Šค โ””โ”€ Stochastic ์กฐ๊ฑด: ๊ณผ๋งค๋„ ``` **์ž์—ฐ์–ด:** ``` ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜ ์ด์ƒ ๋งŒ์กฑ: MACD(12) ๊ณจ๋“  ํฌ๋กœ์Šค Stochastic(14) ๊ณผ๋งค๋„ ๊ตฌ๊ฐ„ ``` --- ## ๐Ÿ”„ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ### ์ „๋žต ์ƒ์„ฑ ํ๋ฆ„ ``` 1. ์‚ฌ์šฉ์ž: ํŒ”๋ ˆํŠธ์—์„œ AND ๋…ธ๋“œ ๋“œ๋ž˜๊ทธ โ†“ 2. Frontend: LogicNode ์ƒ์„ฑ (type: "AND") โ†“ 3. ์‚ฌ์šฉ์ž: CCI ์ง€ํ‘œ ๋“œ๋ž˜๊ทธ โ†’ AND ๋…ธ๋“œ์— ๋“œ๋กญ โ†“ 4. Frontend: CONDITION ๋…ธ๋“œ ์ƒ์„ฑ โ†’ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€ โ†“ 5. ์‚ฌ์šฉ์ž: ์กฐ๊ฑด ํŽธ์ง‘ (๊ธฐ์ค€๊ฐ’ -100, ๊ธฐ๊ฐ„ 20) โ†“ 6. Frontend: ConditionDSL ์—…๋ฐ์ดํŠธ โ†“ 7. ์‚ฌ์šฉ์ž: ์ €์žฅ ๋ฒ„ํŠผ ํด๋ฆญ โ†“ 8. Frontend: LogicNode โ†’ JSON.stringify โ†“ 9. Backend API: POST /api/strategies/dsl โ†“ 10. Backend: DSL โ†’ Legacy ๋ณ€ํ™˜ (StrategyConverterService) โ†“ 11. Database: strategy_rule ํ…Œ์ด๋ธ”์— ์ €์žฅ โ†“ 12. Frontend: ์Šค๋‚ต๋ฐ” "์ „๋žต์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ํ‘œ์‹œ ``` ### ๋ฐฑํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ๋ฆ„ ``` 1. ์‚ฌ์šฉ์ž: ํˆฌ์ž๋ถ„์„ ํ™”๋ฉด์—์„œ ์ „๋žต ์„ ํƒ (DSL ์ „๋žต) โ†“ 2. Frontend: ๋ฐฑํ…Œ์ŠคํŠธ ์š”์ฒญ โ†“ 3. Backend: StrategyRule ์กฐํšŒ (dsl_json ํฌํ•จ) โ†“ 4. Backend: ๊ธฐ์กด BacktestService ์‚ฌ์šฉ (๋ณ€๊ฒฝ ์—†์Œ) โ†“ 5. Backend: ConditionGroup, StrategyCondition ๊ธฐ๋ฐ˜ ํ‰๊ฐ€ โ†“ 6. Frontend: ๋งค์ˆ˜/๋งค๋„ ๋งˆ์ปค ํ‘œ์‹œ ``` --- ## ๐ŸŽ“ ๊ธฐ์ˆ  ์Šคํƒ | ํ•ญ๋ชฉ | ๊ธฐ์ˆ  | |------|------| | ์–ธ์–ด | TypeScript | | UI ํ”„๋ ˆ์ž„์›Œํฌ | React 18 | | ๋””์ž์ธ ์‹œ์Šคํ…œ | Material-UI 5 | | ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ | @dnd-kit | | ์ƒํƒœ ๊ด€๋ฆฌ | React Hooks (useState, useEffect) | | API ํ†ต์‹  | Axios | | ๋ผ์šฐํŒ… | ์—†์Œ (๋‹จ์ผ ํŽ˜์ด์ง€ ์•ฑ ๋‚ด ํŽ˜์ด์ง€ ์ „ํ™˜) | --- ## โœ… ๊ฒ€์ฆ ํ•ญ๋ชฉ - [x] ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋™์ž‘ - [x] API ํ†ต์‹  (CRUD) - [x] ์ž์—ฐ์–ด ๋ณ€ํ™˜ - [x] ์ „๋žต ์ €์žฅ/๋กœ๋“œ - [x] ๊ธฐ์กด ํ™”๋ฉด ์ •์ƒ ๋™์ž‘ - [x] ๋‹คํฌ ๋ชจ๋“œ ์ง€์› - [x] ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ - [x] TypeScript ํƒ€์ž… ์•ˆ์ •์„ฑ - [x] Lint ์˜ค๋ฅ˜ ์—†์Œ --- ## ๐Ÿ“ฆ ํŒŒ์ผ ๊ตฌ์กฐ ``` frontend/src/ โ”œโ”€โ”€ services/ โ”‚ โ””โ”€โ”€ strategyDSLApi.ts (์‹ ๊ทœ) โ”œโ”€โ”€ components/ โ”‚ โ””โ”€โ”€ strategy-tree/ (์‹ ๊ทœ) โ”‚ โ”œโ”€โ”€ NodePalette.tsx โ”‚ โ”œโ”€โ”€ TreeNode.tsx โ”‚ โ”œโ”€โ”€ ConditionEditor.tsx โ”‚ โ”œโ”€โ”€ NaturalLanguagePreview.tsx โ”‚ โ””โ”€โ”€ StrategyTreeBuilder.tsx โ”œโ”€โ”€ pages/ โ”‚ โ”œโ”€โ”€ StrategyRulePage.tsx (๊ธฐ์กด, ์ˆ˜์ • ์—†์Œ) โ”‚ โ””โ”€โ”€ StrategyTreeBuilderPage.tsx (์‹ ๊ทœ) โ””โ”€โ”€ App.tsx (์ˆ˜์ •) ``` --- ## ๐Ÿ”ง ๋‹ค์Œ ๋‹จ๊ณ„ (์„ ํƒ์‚ฌํ•ญ) ### Week 5-6: ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (์„ ํƒ) 1. **์ „๋žต ํ…œํ”Œ๋ฆฟ** - ์‚ฌ์ „ ์ •์˜๋œ ์ „๋žต ํ…œํ”Œ๋ฆฟ ์ œ๊ณต - ํ•œ ํด๋ฆญ์œผ๋กœ ์ ์šฉ 2. **์ „๋žต ์‹œ๋ฎฌ๋ ˆ์ด์…˜** - ๋“œ๋ž˜๊ทธ ํ™”๋ฉด์—์„œ ๋ฐ”๋กœ ๋ฐฑํ…Œ์ŠคํŠธ - ์‹ค์‹œ๊ฐ„ ์„ฑ๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ 3. **์ „๋žต ๊ณต์œ ** - ์ „๋žต ๋‚ด๋ณด๋‚ด๊ธฐ/๊ฐ€์ ธ์˜ค๊ธฐ (JSON) - ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „๋žต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ### Week 7-8: FSM ์—”์ง„ ํ†ตํ•ฉ (์„ ํƒ) 1. **Indicator FSM ํ™œ์„ฑํ™”** - useFsm ํ”Œ๋ž˜๊ทธ ํ™œ์šฉ - ์„ฑ๋Šฅ ๋น„๊ต ๋Œ€์‹œ๋ณด๋“œ 2. **์‹ค์‹œ๊ฐ„ ์ƒํƒœ ์ถ”์ ** - FSM ์ƒํƒœ ์‹œ๊ฐํ™” - ๋””๋ฒ„๊น… ๋„๊ตฌ --- ## ๐ŸŽ‰ Week 3-4 ๊ตฌํ˜„ ์™„๋ฃŒ! **๋ชจ๋“  Frontend ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.** - โœ… ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ UI ์™„์„ฑ - โœ… DSL API ํ†ตํ•ฉ ์™„๋ฃŒ - โœ… ๊ธฐ์กด ๊ธฐ๋Šฅ 100% ๋ณด์กด - โœ… ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ตœ์ ํ™” **์‚ฌ์šฉ์ž๋Š” ์ด์ œ:** - ๊ธฐ์กด ํผ ๋ฐฉ์‹ (StrategyRulePage) - ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋ฐฉ์‹ (StrategyTreeBuilderPage) **๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ „๋žต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!** ๋ชจ๋“  ์ „๋žต์€ ๋™์ผํ•œ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜๋ฉฐ, ๊ธฐ์กด ๋ฐฑํ…Œ์ŠคํŠธ ์—”์ง„์—์„œ ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.