From cd096b1af3fc0650ddcf33f4c1ca3f032e6374a5 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Sat, 29 Nov 2025 11:55:43 +0900 Subject: [PATCH] Update IR valuation documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove duplicate design review file - Update frontend setup documentation ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../251128_ir_valuation_design_review.md | 125 ---------- .../251128_ir_valuation_frontend_setup.md | 224 ++++-------------- 2 files changed, 47 insertions(+), 302 deletions(-) delete mode 100644 journey/troubleshooting/251128_ir_valuation_design_review.md diff --git a/journey/troubleshooting/251128_ir_valuation_design_review.md b/journey/troubleshooting/251128_ir_valuation_design_review.md deleted file mode 100644 index 47bd7da..0000000 --- a/journey/troubleshooting/251128_ir_valuation_design_review.md +++ /dev/null @@ -1,125 +0,0 @@ -# IR Deck ํ‰๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋””์ž์ธ ๊ฒ€ํ†  - -**๋‚ ์งœ**: 2025-11-28 -**์ž‘์„ฑ์ž**: Claude (AI) -**๊ด€๋ จ ํŒŒ์ผ**: -- `frontend-ir-valuation/src/pages/ir-valuation.tsx` - ---- - -## ๋””์ž์ธ ๊ฒ€ํ†  ๊ฒฐ๊ณผ - -### ํ˜„์žฌ ์ƒํƒœ - -**๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ**: -- ๋ฉ”์ธ ์ฑ„ํŒ… ์˜์—ญ (flex-1) + ํ‰๊ฐ€ ๊ฒฐ๊ณผ ์‚ฌ์ด๋“œ๋ฐ” (w-96 ๊ณ ์ •) -- `flex h-screen` ๋ ˆ์ด์•„์›ƒ -- ChatGPT ์Šคํƒ€์ผ UI - -### ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ์  - -#### 1. ๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• ๋ฏธ๊ตฌํ˜„ - -**๋ฌธ์ œ**: -- ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ `w-96` (384px) ๊ณ ์ • ๋„ˆ๋น„๋กœ ๋ชจ๋ฐ”์ผ ํ™”๋ฉด์„ ๊ฐ€๋ฆผ -- `flex` ๋ ˆ์ด์•„์›ƒ์ด ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๊ฐ€๋กœ ๋ฐฐ์น˜ ์œ ์ง€ -- ๋ฐ˜์‘ํ˜• ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ (`sm:`, `md:`, `lg:`) ํด๋ž˜์Šค ์—†์Œ - -**์˜ํ–ฅ**: -- ๋ชจ๋ฐ”์ผ(320-768px)์—์„œ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์ฑ„ํŒ… ์˜์—ญ์„ ๊ฐ€๋ฆผ -- ์‚ฌ์šฉ์ž๊ฐ€ ํ‰๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์–ด๋ ค์›€ -- ์Šคํฌ๋กค/ํƒญ ์ „ํ™˜์ด ์—†์–ด UX ์ €ํ•˜ - -#### 2. ๋””์ž์ธ ํƒ€๋‹น์„ฑ - -**๊ธ์ •์  ์ธก๋ฉด**: -- โœ… ChatGPT ์Šคํƒ€์ผ UI๋กœ ์ง๊ด€์  -- โœ… ์ฑ„ํŒ… ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™” ํ๋ฆ„ -- โœ… ์—…๋กœ๋“œ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ๋กœ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต -- โœ… ํŽ˜์ด์ง€๋ณ„ ํ‰๊ฐ€ ๊ฒฐ๊ณผ ์ƒ์„ธ ํ‘œ์‹œ - -**๊ฐœ์„  ํ•„์š” ์ธก๋ฉด**: -- โŒ ๋ชจ๋ฐ”์ผ์—์„œ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ํ•ญ์ƒ ํ‘œ์‹œ๋˜์–ด ๊ณต๊ฐ„ ๋‚ญ๋น„ -- โŒ ํ‰๊ฐ€ ๊ฒฐ๊ณผ์™€ ์ฑ„ํŒ…์ด ๋™์‹œ์— ๋ณด์ด์ง€ ์•Š์•„ ์ปจํ…์ŠคํŠธ ์ „ํ™˜ ํ•„์š” -- โŒ ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ UI๊ฐ€ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์Œ (๋ฌธ์„œํ™”๋งŒ ๋จ) - -### ๊ฐœ์„  ๋ฐฉ์•ˆ - -#### 1. ๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„ - -**์ œ์•ˆ**: -```tsx -// ๋ชจ๋ฐ”์ผ: ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ํ•˜๋‹จ ์‹œํŠธ ๋˜๋Š” ๋ชจ๋‹ฌ๋กœ ๋ณ€๊ฒฝ -// ๋ฐ์Šคํฌํ†ฑ: ๊ธฐ์กด ์‚ฌ์ด๋“œ๋ฐ” ์œ ์ง€ - -
- {/* ๋ฉ”์ธ ์ฑ„ํŒ… ์˜์—ญ */} -
- {/* ... */} -
- - {/* ํ‰๊ฐ€ ๊ฒฐ๊ณผ - ๋ชจ๋ฐ”์ผ: ํ•˜๋‹จ ์‹œํŠธ, ๋ฐ์Šคํฌํ†ฑ: ์‚ฌ์ด๋“œ๋ฐ” */} - {evaluationResult && ( - <> - {/* ๋ชจ๋ฐ”์ผ: ํ•˜๋‹จ ๊ณ ์ • ๋ฒ„ํŠผ */} -
- -
- - {/* ๋ชจ๋ฐ”์ผ: ์‹œํŠธ */} - - - {/* ํ‰๊ฐ€ ๊ฒฐ๊ณผ ๋‚ด์šฉ */} - - - - {/* ๋ฐ์Šคํฌํ†ฑ: ์‚ฌ์ด๋“œ๋ฐ” */} -
- {/* ํ‰๊ฐ€ ๊ฒฐ๊ณผ ๋‚ด์šฉ */} -
- - )} -
-``` - -**๋ฐ˜์‘ํ˜• ํด๋ž˜์Šค ์ถ”๊ฐ€**: -- `md:flex-row` - ๋ฐ์Šคํฌํ†ฑ์—์„œ ๊ฐ€๋กœ ๋ฐฐ์น˜ -- `md:w-96` - ๋ฐ์Šคํฌํ†ฑ์—์„œ๋งŒ ๊ณ ์ • ๋„ˆ๋น„ -- `md:hidden` / `hidden md:block` - ๋ชจ๋ฐ”์ผ/๋ฐ์Šคํฌํ†ฑ ์ „ํ™˜ - -#### 2. ๋””์ž์ธ ๊ฐœ์„  - -**์ œ์•ˆ**: -1. **๋ชจ๋ฐ”์ผ ์šฐ์„  ์„ค๊ณ„**: ๋ชจ๋ฐ”์ผ์—์„œ ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ํ•˜๋‹จ ์‹œํŠธ ๋˜๋Š” ๋“œ๋กœ์–ด๋กœ ๋ณ€๊ฒฝ -2. **ํƒญ ์ „ํ™˜**: ๋ชจ๋ฐ”์ผ์—์„œ "์ฑ„ํŒ…" / "ํ‰๊ฐ€ ๊ฒฐ๊ณผ" ํƒญ์œผ๋กœ ์ „ํ™˜ -3. **ํ”ผ๋“œ๋ฐฑ UI ์ถ”๊ฐ€**: ํ‰๊ฐ€ ๊ฒฐ๊ณผ ํ•˜๋‹จ์— ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ ์„น์…˜ ์ถ”๊ฐ€ -4. **ํ—ค๋” ์ตœ์ ํ™”**: ๋ชจ๋ฐ”์ผ์—์„œ ํ—ค๋” ๋†’์ด ์ถ•์†Œ - -### ๊ถŒ์žฅ ๊ตฌํ˜„ ์ˆœ์„œ - -1. **๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •** (์šฐ์„ ์ˆœ์œ„ ๋†’์Œ) - - ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ๋ชจ๋ฐ”์ผ์—์„œ ์‹œํŠธ/๋“œ๋กœ์–ด๋กœ ๋ณ€๊ฒฝ - - ๋ฐ˜์‘ํ˜• ํด๋ž˜์Šค ์ถ”๊ฐ€ - -2. **ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ UI ๊ตฌํ˜„** - - ํ‰๊ฐ€ ๊ฒฐ๊ณผ ํ•˜๋‹จ์— ํ”ผ๋“œ๋ฐฑ ์„น์…˜ ์ถ”๊ฐ€ - - ๋“ฑ๊ธ‰ ์„ ํƒ ๋“œ๋กญ๋‹ค์šด - - ์ œ์ถœ ๋ฒ„ํŠผ - -3. **UX ๊ฐœ์„ ** - - ๋ชจ๋ฐ”์ผ์—์„œ ํ‰๊ฐ€ ๊ฒฐ๊ณผ ๋ณด๊ธฐ ๋ฒ„ํŠผ ์ถ”๊ฐ€ - - ์Šคํฌ๋กค ์ตœ์ ํ™” - - ๋กœ๋”ฉ ์ƒํƒœ ๊ฐœ์„  - -## ๊ตํ›ˆ - -- **๋ชจ๋ฐ”์ผ ์šฐ์„  ์„ค๊ณ„**: ๋ฐ์Šคํฌํ†ฑ ์ค‘์‹ฌ ์„ค๊ณ„๋Š” ๋ชจ๋ฐ”์ผ์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ -- **๋ฐ˜์‘ํ˜• ํด๋ž˜์Šค ํ•„์ˆ˜**: TailwindCSS์˜ `sm:`, `md:`, `lg:` ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ ํ™œ์šฉ -- **์‚ฌ์ด๋“œ๋ฐ” ํŒจํ„ด**: ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์‹œํŠธ/๋“œ๋กœ์–ด, ๋ฐ์Šคํฌํ†ฑ์—์„œ๋Š” ์‚ฌ์ด๋“œ๋ฐ”๋กœ ๋ถ„๊ธฐ ํ•„์š” - ---- - -๋ฌธ์„œ ๊ทœ์น™: `DOCS/book/300_architecture/312_๋ฌธ์„œ_์ž‘์„ฑ_์›์น™.md` ์ค€์ˆ˜ - diff --git a/journey/troubleshooting/251128_ir_valuation_frontend_setup.md b/journey/troubleshooting/251128_ir_valuation_frontend_setup.md index 63f1a21..12204e5 100644 --- a/journey/troubleshooting/251128_ir_valuation_frontend_setup.md +++ b/journey/troubleshooting/251128_ir_valuation_frontend_setup.md @@ -2,7 +2,7 @@ **๋‚ ์งœ**: 2025-11-28 **์ž‘์„ฑ์ž**: Claude (AI) -**๊ด€๋ จ ํŒŒ์ผ**: +**๊ด€๋ จ ํŒŒ์ผ**: - `frontend-ir-valuation/src/pages/ir-valuation.tsx` - `nginx-infra/server-nginx-default` - `https://git.ro-being.com/ivada_Ro-being/frontend-ir-valuation.git` @@ -10,199 +10,69 @@ --- ## ๋ชฉ์  +Sequoia Capital IR ๊ธฐ์ค€์œผ๋กœ IR Deck์„ ํ‰๊ฐ€ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŽ˜์ด์ง€ ๊ตฌ์ถ• (ChatGPT ์Šคํƒ€์ผ UI). -Sequoia Capital IR ๊ณต์‹ ๊ธฐ์ค€์œผ๋กœ IR Deck์„ ํ‰๊ฐ€ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŽ˜์ด์ง€ ๊ตฌ์ถ•. ChatGPT ์Šคํƒ€์ผ UI๋กœ PDF ์—…๋กœ๋“œ ๋ฐ ๋ถ„์„ ๊ฒฐ๊ณผ ํ‘œ์‹œ. +## ๊ตฌํ˜„ ์š”์•ฝ +- **์Šคํƒ**: Vite + React + TypeScript, TailwindCSS, wouter, @tanstack/react-query. +- **์ฃผ์š” ๊ธฐ๋Šฅ**: PDF ์—…๋กœ๋“œ, ์ง„ํ–‰๋ฅ ยท๋ถ„์„ ์ƒํƒœ ํ‘œ์‹œ, ํŽ˜์ด์ง€๋ณ„ ๊ฐ•์ ยท์•ฝ์ , ์ข…ํ•ฉ ์ ์ˆ˜ยท๋“ฑ๊ธ‰ (S/A/B/C). +- **SPA ๋ผ์šฐํŒ…** (`src/App.tsx`): baseโ€‘path `/ir-valuation` ์ œ๊ฑฐ ํ›„ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ. -## ๊ตฌํ˜„ ๋‚ด์šฉ - -### 1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ - -**๊ธฐ์ˆ  ์Šคํƒ**: frontend-customer์™€ ๋™์ผ -- Vite + React + TypeScript -- TailwindCSS -- wouter (๋ผ์šฐํŒ…) -- @tanstack/react-query - -**ํ”„๋กœ์ ํŠธ ์œ„์น˜**: `/home/admin/frontend-ir-valuation` - -### 2. ์ฃผ์š” ๊ธฐ๋Šฅ - -**ํŒŒ์ผ**: `src/pages/ir-valuation.tsx` - -- ChatGPT ์Šคํƒ€์ผ ์ฑ„ํŒ… ์ธํ„ฐํŽ˜์ด์Šค -- PDF ํŒŒ์ผ ์—…๋กœ๋“œ (๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋˜๋Š” ๋ฒ„ํŠผ ํด๋ฆญ) -- ์—…๋กœ๋“œ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ -- ๋ถ„์„ ์ค‘ ์ƒํƒœ ํ‘œ์‹œ -- ํŽ˜์ด์ง€๋ณ„ ํ‰๊ฐ€ ๊ฒฐ๊ณผ ํ‘œ์‹œ (์ž˜๋œ ์ /๋ถ€์กฑํ•œ ์ ) -- ์ข…ํ•ฉ ์ ์ˆ˜ ๋ฐ ๋“ฑ๊ธ‰ (S/A/B/C) ํ‘œ์‹œ - -### 3. nginx ์„ค์ • - -**ํŒŒ์ผ**: `nginx-infra/server-nginx-default:91-95, 228-232` - -```nginx -# IR Valuation Frontend -location /ir-valuation { - alias /home/admin/frontend-ir-valuation/dist/; - try_files $uri /ir-valuation/index.html; -} -``` - -### 4. Git ์ €์žฅ์†Œ - -**์ €์žฅ์†Œ**: `https://git.ro-being.com/ivada_Ro-being/frontend-ir-valuation.git` - -**์ดˆ๊ธฐ ์ปค๋ฐ‹**: `8235e25` - Initial commit: IR Deck valuation frontend with ChatGPT-style UI - -## ๋ฐฐํฌ - -### ๋นŒ๋“œ -```bash -cd /home/admin/frontend-ir-valuation -npm run build -``` - -### nginx ๋ฐฐํฌ -```bash -sudo cp /home/admin/nginx-infra/server-nginx-default /etc/nginx/sites-enabled/default -sudo systemctl reload nginx -``` - -### ์ ‘๊ทผ ๊ฒฝ๋กœ -- `http://ro-being.com/ir-valuation` -- `http://124.55.18.179/ir-valuation` - -## SPA ๋ผ์šฐํŒ… ๋ฌธ์ œ ํ•ด๊ฒฐ - -**๋ฌธ์ œ**: `/ir-valuation` ๊ฒฝ๋กœ ์ ‘๊ทผ ์‹œ nginx๋Š” 200 OK๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ 404 ํ‘œ์‹œ - -**์›์ธ**: -- nginx๋Š” ์ •์ƒ์ ์œผ๋กœ `dist/index.html`์„ ์„œ๋น™ (curl/Network ํƒญ ๋ชจ๋‘ 200 OK) -- ํ•˜์ง€๋งŒ `App.tsx`์˜ wouter ๋ผ์šฐํ„ฐ๊ฐ€ `path="/"`๋งŒ ์ •์˜๋˜์–ด ์žˆ์–ด `/ir-valuation` ๊ฒฝ๋กœ์—์„œ ๋งค์นญ ์‹คํŒจ -- SPA ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ๊ฐ€ 404 ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง - -**ํ•ด๊ฒฐ**: -- `App.tsx`์— base path ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€ -- `useLocation` hook์œผ๋กœ `/ir-valuation` base path๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ผ์šฐํŒ… - -**ํŒŒ์ผ**: `src/App.tsx:14-30` -```typescript +```tsx function Router() { const [location] = useLocation(); - const basePath = "/ir-valuation"; - - // Remove base path from location for routing - // Handle both /ir-valuation and /ir-valuation/ cases - let normalizedLocation = location; - if (location.startsWith(basePath + "/") || location === basePath) { - normalizedLocation = location.slice(basePath.length) || "/"; - // Remove trailing slash if present (except root) - if (normalizedLocation !== "/" && normalizedLocation.endsWith("/")) { - normalizedLocation = normalizedLocation.slice(0, -1); - } - } - + const base = "/ir-valuation"; + const normalized = (location.startsWith(base) ? location.slice(base.length) : location) || "/"; return ( - + -
404 Not Found - Location: {location}, Normalized: {normalizedLocation}
} /> +
404 Not Found
} />
); } ``` -**๊ฒ€์ฆ**: -- `https://ro-being.com/ir-valuation/` ์ ‘๊ทผ ์‹œ IR ํ‰๊ฐ€ ํŽ˜์ด์ง€ ์ •์ƒ ํ‘œ์‹œ ํ™•์ธ -- ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ชจ๋‘ 200 OK ํ™•์ธ -- ChatGPT ์Šคํƒ€์ผ UI ์ •์ƒ ๋ Œ๋”๋ง (ํ—ค๋”, ์—…๋กœ๋“œ ๋ฒ„ํŠผ, ์ฑ„ํŒ… ์ž…๋ ฅ์ฐฝ) - -## ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ UI ๊ตฌํ˜„ (์˜ˆ์ •) - -**๋ชฉ์ **: ์‚ฌ์šฉ์ž๊ฐ€ ํ‰๊ฐ€ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋“ฑ๊ธ‰ ํ”ผ๋“œ๋ฐฑ์„ ์ œ์ถœํ•˜์—ฌ ๋ฒ ์ด์ง€์•ˆ ํ•™์Šต ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ - -**๊ตฌํ˜„ ์œ„์น˜**: `src/pages/ir-valuation.tsx` - -**UI ๊ตฌ์„ฑ**: -1. **ํ‰๊ฐ€ ๊ฒฐ๊ณผ ์‚ฌ์ด๋“œ๋ฐ”์— ํ”ผ๋“œ๋ฐฑ ์„น์…˜ ์ถ”๊ฐ€** - - ํ‰๊ฐ€ ๊ฒฐ๊ณผ ํ•˜๋‹จ์— "ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ" ์„น์…˜ - - ํ˜„์žฌ ๋“ฑ๊ธ‰ ํ‘œ์‹œ (์˜ˆ: "ํ˜„์žฌ ๋“ฑ๊ธ‰: A") - - ๋“ฑ๊ธ‰ ์„ ํƒ ๋“œ๋กญ๋‹ค์šด (S, A, B, C) - - ์ถ”๊ฐ€ ์˜๊ฒฌ ์ž…๋ ฅ ํ…์ŠคํŠธ ์˜์—ญ (์„ ํƒ) - - "ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ" ๋ฒ„ํŠผ - -2. **ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ ์ฒ˜๋ฆฌ** - - `handleFeedbackSubmit()` ํ•จ์ˆ˜ ๊ตฌํ˜„ - - `POST /rb8001/api/ir-deck/feedback` API ํ˜ธ์ถœ - - ์„ฑ๊ณต ์‹œ ํ† ์ŠคํŠธ ์•Œ๋ฆผ ํ‘œ์‹œ - - ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ ํ›„ ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™” - -3. **์ƒํƒœ ๊ด€๋ฆฌ** - - `feedbackSubmitted` state ์ถ”๊ฐ€ (์ค‘๋ณต ์ œ์ถœ ๋ฐฉ์ง€) - - `feedbackGrade` state ์ถ”๊ฐ€ (์‚ฌ์šฉ์ž ์„ ํƒ ๋“ฑ๊ธ‰) - - `feedbackText` state ์ถ”๊ฐ€ (์ถ”๊ฐ€ ์˜๊ฒฌ) - -**API ์ŠคํŽ™**: -```typescript -POST /rb8001/api/ir-deck/feedback -Body: { - evaluation_id: string; - user_grade: "S" | "A" | "B" | "C"; - predicted_grade: "S" | "A" | "B" | "C"; - feedback_text?: string; +## Nginx ์„ค์ • (`nginx-infra/server-nginx-default`) +```nginx +location /ir-valuation { + alias /home/admin/frontend-ir-valuation/dist/; + try_files $uri /ir-valuation/index.html; +} +location ^~ /rb8001/ { + proxy_pass http://192.168.219.52:8001/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 300s; + proxy_connect_timeout 75s; + proxy_send_timeout 300s; } ``` -**์ฐธ๊ณ **: ๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์„œ `251128_ir_deck_valuation_backend_architecture.md`์˜ `ir_deck_feedback` ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ์ฐธ๊ณ  - -## ๋‹ค์Œ ๋‹จ๊ณ„ - -1. **๋ฐฑ์—”๋“œ ์—ฐ๋™**: rb8001 API ์—”๋“œํฌ์ธํŠธ ๊ตฌํ˜„ - - `/rb8001/api/ir-deck/upload` - PDF ์—…๋กœ๋“œ - - `/rb8001/api/ir-deck/chat` - ์ฑ„ํŒ… ์‘๋‹ต - - `/rb8001/api/ir-deck/evaluate` - ํ‰๊ฐ€ ๊ฒฐ๊ณผ ์กฐํšŒ - - `/rb8001/api/ir-deck/feedback` - ํ”ผ๋“œ๋ฐฑ ์ œ์ถœ - -2. **์‹ค์ œ ๋ถ„์„ ๋กœ์ง**: Sequoia Capital 10๊ฐ€์ง€ ์Šคํ† ๋ฆฌ ๊ธฐ์ค€ ํ‰๊ฐ€ - - ํŽ˜์ด์ง€๋ณ„ ๋ถ„์„ - - ์ ์ˆ˜ ๊ณ„์‚ฐ - - ๋“ฑ๊ธ‰ ๋ถ„๋ฅ˜ (๋ฒ ์ด์ง€์•ˆ ํ•™์Šต ์ค€๋น„) - -3. **๋ฒ ์ด์ง€์•ˆ ํ•™์Šต**: ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘ ๋ฐ ํ•™์Šต ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ - -## API ํ—ค๋” ํ•„์ˆ˜ ์‚ฌํ•ญ - -**๋ฌธ์ œ**: API ํ˜ธ์ถœ ์‹œ `X-Team-Id header required` ์—๋Ÿฌ ๋ฐœ์ƒ - -**์›์ธ**: skill-rag-file์ด ํŒŒ์ผ์„ `/mnt/hdd/data/documents/{team_id}/` ๊ฒฝ๋กœ์— ์ €์žฅํ•˜๋ฏ€๋กœ team_id ํ•„์š” - -**ํ•ด๊ฒฐ**: ํ”„๋ก ํŠธ์—”๋“œ API ํ˜ธ์ถœ์— ํ—ค๋” ์ถ”๊ฐ€ -- `X-Team-Id: 79441171-3951-4870-beb8-916d07fe8be5` (๊ธฐ๋ณธ team_id) -- `X-User-Id: {user_id}` (์‚ฌ์šฉ์ž ID) - -**ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ**: ํ—ค๋” ์ถ”๊ฐ€ ํ›„ ์—…๋กœ๋“œ ์„ฑ๊ณต, `document_id` ๋ฐ˜ํ™˜ ํ™•์ธ - -## ChatGPT UX ์ฐจ์ด์  - -**์ฐธ๊ณ **: ChatGPT(chat.openai.com) ์Šคํƒ€์ผ์„ ์ฐธ๊ณ ํ–ˆ์œผ๋‚˜ IR ํ‰๊ฐ€ ์ „์šฉ ๊ธฐ๋Šฅ์œผ๋กœ ์ฐจ์ด ์žˆ์Œ - -**์ฃผ์š” ์ฐจ์ด์ **: -- ์ŠคํŠธ๋ฆฌ๋ฐ ์—†์Œ: ์ „์ฒด ์‘๋‹ต์„ ํ•œ ๋ฒˆ์— ํ‘œ์‹œ (ํƒ€์ดํ•‘ ํšจ๊ณผ ์—†์Œ) -- ๋งˆํฌ๋‹ค์šด ๋ Œ๋”๋ง ์—†์Œ: `whitespace-pre-wrap`๋กœ ํ…์ŠคํŠธ๋งŒ ํ‘œ์‹œ -- ์ฑ„ํŒ… ํžˆ์Šคํ† ๋ฆฌ ํŽธ์ง‘/์‚ญ์ œ ์—†์Œ: ํ‘œ์‹œ๋งŒ ๊ฐ€๋Šฅ -- ๋ฉ”์‹œ์ง€ ํŽธ์ง‘/์žฌ์ƒ์„ฑ ์—†์Œ: ๋ณต์‚ฌ, ์ข‹์•„์š”/์‹ซ์–ด์š”๋งŒ ์ง€์› -- IR ํ‰๊ฐ€ ์ „์šฉ: ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์— ํ‰๊ฐ€ ๊ฒฐ๊ณผ ํ‘œ์‹œ (ํŽ˜์ด์ง€๋ณ„ ํ‰๊ฐ€, ์ ์ˆ˜, ๋“ฑ๊ธ‰) +## API ์‚ฌ์šฉ ์˜ˆ์‹œ +```bash +curl -X POST http://localhost/rb8001/api/ir-deck/evaluate \ + -H "Content-Type: application/json" \ + -H "X-Team-Id: " \ + -H "X-User-Id: " \ + -d '{"document_id":"","team_id":""}' +``` ## ๊ตํ›ˆ +- **ํ•ต์‹ฌ๋งŒ**: ์ค‘๋ณตยท๋ถˆํ•„์š”ํ•œ ์„ค๋ช… ์ œ๊ฑฐ, ๋งํฌ๋กœ ๋Œ€์ฒด. +- **ํ—ค๋” ํ•„์ˆ˜**: `X-Team-Id`, `X-User-Id` ์—†์œผ๋ฉด API ๋™์ž‘ ์•ˆ ํ•จ. +- **SPA ๋ผ์šฐํŒ…**: Nginx baseโ€‘path์™€ React ๋ผ์šฐํ„ฐ ์ผ์น˜ ํ•„์š”. -- frontend-customer ๊ตฌ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๊ฐ€๋Šฅ -- nginx ์„ค์ •์€ ๋‘ ์„œ๋ฒ„ ๋ธ”๋ก(HTTP/HTTPS) ๋ชจ๋‘์— ์ถ”๊ฐ€ ํ•„์š” -- ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ์€ `/home/admin/frontend-ir-valuation/dist/`์— ์ €์žฅ -- **SPA ๋ผ์šฐํŒ…**: nginx base path(`/ir-valuation`)์™€ React ๋ผ์šฐํ„ฐ ๊ฒฝ๋กœ๋ฅผ ์ผ์น˜์‹œ์ผœ์•ผ ํ•จ -- wouter๋Š” base path๋ฅผ ์ž๋™ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ `useLocation`์œผ๋กœ ์ˆ˜๋™ ์ฒ˜๋ฆฌ ํ•„์š” -- **API ํ—ค๋”**: rb8001 API๋Š” ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ๋ฅผ ์œ„ํ•ด `X-Team-Id`, `X-User-Id` ํ—ค๋” ํ•„์ˆ˜ -- **๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜•**: ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ `w-96` ๊ณ ์ • ๋„ˆ๋น„๋กœ ๋ชจ๋ฐ”์ผ์—์„œ ์ฑ„ํŒ… ์˜์—ญ์„ ๊ฐ€๋ฆผ, ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์‹œํŠธ/๋“œ๋กœ์–ด๋กœ ์ „ํ™˜ ํ•„์š” +## ๋‹ค์Œ ์ž‘์—… +- ํ”ผ๋“œ๋ฐฑ UI ๊ตฌํ˜„ (`src/pages/ir-valuation.tsx`). +- ๋ฐฑ์—”๋“œ ํ”ผ๋“œ๋ฐฑ API ์—ฐ๋™ (`/rb8001/api/ir-deck/feedback`). +- Sequoia 10๊ฐ€์ง€ ๊ธฐ์ค€ ์‹ค์ œ ํ‰๊ฐ€ ๋กœ์ง ๊ตฌํ˜„. --- -๋ฌธ์„œ ๊ทœ์น™: `DOCS/book/300_architecture/312_๋ฌธ์„œ_์ž‘์„ฑ_์›์น™.md` ์ค€์ˆ˜ - +## ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- [ ] ํ•ต์‹ฌ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌ +- [ ] 100์ค„ ์ดํ•˜ ํ™•์ธ (ํ˜„์žฌ 78์ค„) +- [ ] ๊ตํ›ˆ ์„น์…˜ ํฌํ•จ +- [ ] ๊ด€๋ จ ํŒŒ์ผ ๋งํฌ ํฌํ•จ +- [ ] Nginx ์„ค์ • ๋ฐ SPA ๋ผ์šฐํŒ… ๊ฒ€์ฆ