# πŸ“Š Stock Oracle Frontend React + Next.js둜 κ΅¬μΆ•λœ Stock Oracle μ›Ή ν”„λ‘ νŠΈμ—”λ“œμž…λ‹ˆλ‹€. ## ✨ μ£Όμš” κΈ°λŠ₯ ### 🏠 λŒ€μ‹œλ³΄λ“œ - μ‹€μ‹œκ°„ μ‹œμŠ€ν…œ μƒνƒœ λͺ¨λ‹ˆν„°λ§ - λ°μ΄ν„°λ² μ΄μŠ€ 톡계 μš”μ•½ - λΉ λ₯Έ μ•‘μ…˜ λ²„νŠΌ - 데이터 ν’ˆμ§ˆ κ°œμš” ### πŸ” 데이터 쑰회 - 주식 μ’…λͺ©λ³„ 재무 데이터 검색 - 뢄기별/μ—°κ°„/전체 κΈ°κ°„ 쑰회 - μ‹€μ œ vs μΆ”μ • 데이터 ν‘œμ‹œ - 재무 μ§€ν‘œ 계산 κ²°κ³Ό 포함 ### πŸ’Ύ DB μƒνƒœ - λ°μ΄ν„°λ² μ΄μŠ€ ν˜„ν™© μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ - νšŒμ‚¬, 재무 데이터, μ£Όκ°€ 데이터 톡계 - 데이터 μ†ŒμŠ€λ³„ 뢄포 - 데이터 ν’ˆμ§ˆ 뢄석 ### βš™οΈ μ„€μ • - API URL μ„€μ • - μžλ™ μƒˆλ‘œκ³ μΉ¨ μ˜΅μ…˜ - UI ν…Œλ§ˆ 선택 - μ‹œμŠ€ν…œ 정보 확인 ## πŸš€ λΉ λ₯Έ μ‹œμž‘ ### 둜컬 개발 ν™˜κ²½ ```bash # μ˜μ‘΄μ„± μ„€μΉ˜ cd frontend npm install # ν™˜κ²½ λ³€μˆ˜ μ„€μ • cp .env.example .env.local # 개발 μ„œλ²„ μ‹œμž‘ npm run dev ``` μ›Ή λΈŒλΌμš°μ €μ—μ„œ `http://localhost:3000` 접속 ### Docker둜 μ‹€ν–‰ ```bash # 이미지 λΉŒλ“œ docker build -t stock-oracle-frontend . # μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ docker run -p 3000:3000 -e NEXT_PUBLIC_API_URL=http://localhost:18001/api/v1 stock-oracle-frontend ``` ### Portainer둜 전체 μŠ€νƒ 배포 ```bash # 전체 μŠ€νƒ 배포 (API + Frontend + DB + Nginx) docker-compose -f portainer/docker-compose.full-stack.yml up -d ``` 접속 URL: `https://localhost` (Nginxλ₯Ό ν†΅ν•œ 톡합 접속) ## πŸ› οΈ 기술 μŠ€νƒ ### Frontend Framework - **Next.js 14** - React 메타 ν”„λ ˆμž„μ›Œν¬ - **React 18** - UI 라이브러리 - **TypeScript** - νƒ€μž… μ•ˆμ „μ„± ### Styling & UI - **Tailwind CSS** - μœ ν‹Έλ¦¬ν‹° CSS ν”„λ ˆμž„μ›Œν¬ - **Lucide React** - μ•„μ΄μ½˜ 라이브러리 - **Responsive Design** - λͺ¨λ°”일 μΉœν™”μ  λ””μžμΈ ### Data Management - **Axios** - HTTP ν΄λΌμ΄μ–ΈνŠΈ - **React Query** - μ„œλ²„ μƒνƒœ 관리 - **SWR νŒ¨ν„΄** - 데이터 페칭 μ „λž΅ ### Charts & Visualization - **Recharts** - React 차트 라이브러리 - **Date-fns** - λ‚ μ§œ 처리 ## πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰 ``` frontend/ β”œβ”€β”€ components/ # μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ β”‚ β”œβ”€β”€ Layout.tsx # 메인 λ ˆμ΄μ•„μ›ƒ β”‚ β”œβ”€β”€ StockQuery.tsx # 주식 데이터 쑰회 β”‚ └── DatabaseStats.tsx # DB μƒνƒœ λͺ¨λ‹ˆν„°λ§ β”œβ”€β”€ lib/ # μœ ν‹Έλ¦¬ν‹° 및 μ„€μ • β”‚ └── api.ts # API ν΄λΌμ΄μ–ΈνŠΈ 및 νƒ€μž… β”œβ”€β”€ pages/ # Next.js νŽ˜μ΄μ§€ β”‚ β”œβ”€β”€ index.tsx # λŒ€μ‹œλ³΄λ“œ β”‚ β”œβ”€β”€ query.tsx # 데이터 쑰회 β”‚ β”œβ”€β”€ database.tsx # DB μƒνƒœ β”‚ └── settings.tsx # μ„€μ • β”œβ”€β”€ styles/ # μŠ€νƒ€μΌμ‹œνŠΈ β”‚ └── globals.css # κΈ€λ‘œλ²Œ CSS └── public/ # 정적 파일 ``` ## πŸ”§ ν™˜κ²½ λ³€μˆ˜ ### .env.local μ„€μ • ```bash # API μ„€μ • NEXT_PUBLIC_API_URL=http://localhost:18001/api/v1 # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • NEXT_PUBLIC_APP_NAME=Stock Oracle NEXT_PUBLIC_APP_VERSION=1.0.0 # κΈ°λŠ₯ ν”Œλž˜κ·Έ NEXT_PUBLIC_ENABLE_ANALYTICS=false NEXT_PUBLIC_ENABLE_PWA=false ``` ### ν”„λ‘œλ•μ…˜ ν™˜κ²½ ```bash # Docker ν™˜κ²½μ—μ„œ μžλ™ μ„€μ • NEXT_PUBLIC_API_URL=http://api:8000/api/v1 NODE_ENV=production ``` ## πŸ“Š API 연동 ### API ν΄λΌμ΄μ–ΈνŠΈ `lib/api.ts`μ—μ„œ λͺ¨λ“  API ν˜ΈμΆœμ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€: ```typescript // 재무 데이터 쑰회 const data = await stockApi.getFinancialData({ ticker: 'AAPL', start_date: '2024-01-01', end_date: '2024-12-31', period_type: 'quarterly', include_metrics: true }); // λ°μ΄ν„°λ² μ΄μŠ€ 톡계 쑰회 const stats = await stockApi.getDatabaseStats(); ``` ### μ£Όμš” API μ—”λ“œν¬μΈνŠΈ - `POST /api/v1/financial/data` - 재무 데이터 쑰회 - `POST /api/v1/price/data` - μ£Όκ°€ 데이터 쑰회 - `GET /api/v1/database/stats` - DB 톡계 - `GET /api/v1/tickers` - μ‚¬μš© κ°€λŠ₯ν•œ μ’…λͺ© λͺ©λ‘ ## 🎨 UI/UX νŠΉμ§• ### λ°˜μ‘ν˜• λ””μžμΈ - **Desktop First**: λŒ€ν˜• ν™”λ©΄ μš°μ„  섀계 - **Mobile Optimized**: λͺ¨λ°”일 κΈ°κΈ° μ™„λ²½ 지원 - **Tablet Friendly**: νƒœλΈ”λ¦Ώ ν™˜κ²½ μ΅œμ ν™” ### μ‚¬μš©μž κ²½ν—˜ - **직관적 λ„€λΉ„κ²Œμ΄μ…˜**: λͺ…ν™•ν•œ 메뉴 ꡬ쑰 - **μ‹€μ‹œκ°„ ν”Όλ“œλ°±**: λ‘œλ”© μƒνƒœ 및 μ—λŸ¬ 처리 - **데이터 μ‹œκ°ν™”**: μ°¨νŠΈμ™€ κ·Έλž˜ν”„λ‘œ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ ν‘œν˜„ ### μ ‘κ·Όμ„± - **ν‚€λ³΄λ“œ λ„€λΉ„κ²Œμ΄μ…˜**: ν‚€λ³΄λ“œλ§ŒμœΌλ‘œ λͺ¨λ“  κΈ°λŠ₯ μ ‘κ·Ό - **Screen Reader**: 슀크린 리더 지원 - **κ³ λŒ€λΉ„ λͺ¨λ“œ**: μ‹œκ°μ  μ ‘κ·Όμ„± κ³ λ € ## πŸ” μ£Όμš” μ»΄ν¬λ„ŒνŠΈ ### Layout μ»΄ν¬λ„ŒνŠΈ ```typescript // 전체 λ ˆμ΄μ•„μ›ƒ 및 λ„€λΉ„κ²Œμ΄μ…˜ {children} ``` ### StockQuery μ»΄ν¬λ„ŒνŠΈ ```typescript // 주식 데이터 쑰회 폼 및 κ²°κ³Ό ν‘œμ‹œ ``` ### DatabaseStats μ»΄ν¬λ„ŒνŠΈ ```typescript // λ°μ΄ν„°λ² μ΄μŠ€ 톡계 및 μƒνƒœ λͺ¨λ‹ˆν„°λ§ ``` ## πŸ§ͺ 개발 도ꡬ ### 개발 μ„œλ²„ ```bash npm run dev # 개발 μ„œλ²„ μ‹œμž‘ npm run build # ν”„λ‘œλ•μ…˜ λΉŒλ“œ npm run start # ν”„λ‘œλ•μ…˜ μ„œλ²„ μ‹œμž‘ npm run lint # ESLint μ‹€ν–‰ ``` ### νƒ€μž… 체크 ```bash npx tsc --noEmit # TypeScript νƒ€μž… 체크 ``` ## πŸš€ 배포 ### Vercel 배포 ```bash # Vercel CLI둜 배포 vercel --prod ``` ### Docker 배포 ```bash # 이미지 λΉŒλ“œ 및 배포 docker build -t stock-oracle-frontend . docker run -p 3000:3000 stock-oracle-frontend ``` ### Portainer 톡합 배포 ```bash # 전체 μŠ€νƒ 배포 ./portainer/quick-deploy.sh ``` ## πŸ“± λΈŒλΌμš°μ € 지원 - **Chrome** 90+ - **Firefox** 88+ - **Safari** 14+ - **Edge** 90+ ## πŸ”’ λ³΄μ•ˆ 고렀사항 ### API 톡신 - **HTTPS Only**: ν”„λ‘œλ•μ…˜μ—μ„œ HTTPS κ°•μ œ - **CORS μ„€μ •**: μ μ ˆν•œ CORS μ •μ±… - **Rate Limiting**: API 호좜 μ œν•œ ### 데이터 보호 - **μž…λ ₯ 검증**: λͺ¨λ“  μ‚¬μš©μž μž…λ ₯ 검증 - **XSS λ°©μ§€**: React의 κΈ°λ³Έ XSS 보호 - **CSRF λ°©μ§€**: SameSite μΏ ν‚€ μ„€μ • ## πŸ› 문제 ν•΄κ²° ### 일반적인 문제 #### API μ—°κ²° μ‹€νŒ¨ ```bash # API μ„œλ²„ μƒνƒœ 확인 curl http://localhost:18001/api/v1/database/stats # ν™˜κ²½ λ³€μˆ˜ 확인 echo $NEXT_PUBLIC_API_URL ``` #### λΉŒλ“œ μ‹€νŒ¨ ```bash # μΊμ‹œ 클리어 rm -rf .next node_modules npm install npm run build ``` #### Docker μ‹€ν–‰ 문제 ```bash # 포트 좩돌 확인 netstat -tlnp | grep 3000 # μ»¨ν…Œμ΄λ„ˆ 둜그 확인 docker logs stock-oracle-frontend ``` ## πŸ“ˆ μ„±λŠ₯ μ΅œμ ν™” ### 이미지 μ΅œμ ν™” - **Next.js Image**: μžλ™ 이미지 μ΅œμ ν™” - **WebP 지원**: μ΅œμ‹  이미지 포맷 μ‚¬μš© ### μ½”λ“œ λΆ„ν•  - **Dynamic Import**: ν•„μš”ν•  λ•Œλ§Œ μ»΄ν¬λ„ŒνŠΈ λ‘œλ“œ - **Tree Shaking**: μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œ 제거 ### 캐싱 μ „λž΅ - **Static Generation**: 정적 νŽ˜μ΄μ§€ 생성 - **API Cache**: React Query둜 API 응닡 캐싱 ## 🀝 κΈ°μ—¬ κ°€μ΄λ“œ 1. Fork the repository 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## πŸ“„ λΌμ΄μ„ μŠ€ MIT License - μžμ„Έν•œ λ‚΄μš©μ€ LICENSE νŒŒμΌμ„ μ°Έμ‘°ν•˜μ„Έμš”.