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 라우팅 검증