Firebase์ ์ธ๋ถ API ์์ด ๋ก์ปฌ ์ํ ๊ด๋ฆฌ๋ง์ผ๋ก ๋์ํ๋ ์ฃผ์ ํฌ์ ์๋ฎฌ๋ ์ด์ ๊ฒ์์ ๋๋ค.
- ๐ฎ 20์ผ๊ฐ์ ํฌ์ ์๋ฎฌ๋ ์ด์ : ์ค์ ๊ณผ ๊ฐ์ ์ฃผ์ ๊ฑฐ๋ ๊ฒฝํ
- ๐ ์ค์๊ฐ ์ฐจํธ: Recharts๋ฅผ ํ์ฉํ ์๋ฆ๋ค์ด ๊ฐ๊ฒฉ ์ฐจํธ
- ๐ค AI ํฌ์ ์กฐ์ธ(์ฌ์ ์ ์ฅ): ๋ฐฑ์๋์ ์ ์ฅ๋ Gemini ๋ถ์ 5์ข
์ ๊ณต
- ํตํฉ ๋ถ์ (Gemini)
- ๋ด์ค ๋ถ์ (Gemini)
- Reddit ๋ถ์ (Gemini)
- ์ฌ๋ฌด์ ํ ๋ถ์ (Gemini)
- ๊ฑฐ์๊ฒฝ์ ๋ถ์ (Gemini)
- ๐ผ ํฌํธํด๋ฆฌ์ค ๊ด๋ฆฌ: ๋ณด์ ์ฃผ์, ๊ฑฐ๋ ๋ด์ญ, ๊ด์ฌ ์ข ๋ชฉ ๊ด๋ฆฌ
- ๐จ ๋คํฌ/๋ผ์ดํธ ๋ชจ๋: ํ ๋ง ์ ํ ์ง์
- ๐ฑ ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ฐ์ผ, ํ๋ธ๋ฆฟ, ๋ฐ์คํฌํฑ ๋ชจ๋ ์ง์
- Node.js 18.x ์ด์
- npm ๋๋ yarn
# ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd stock-sim-local
# ์์กด์ฑ ์ค์น
npm install# ๊ฐ๋ฐ ์๋ฒ ์์
npm run dev๋ธ๋ผ์ฐ์ ์์ http://localhost:3000 ์ ์
# ํ๋ก๋์
๋น๋
npm run build
# ๋น๋ ๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
npm run preview- ๋ก๊ทธ์ธ: ๋ฐ๋ชจ ๊ณ์ (ID:
1111, PW:1111)์ผ๋ก ๋ก๊ทธ์ธ - ์ฃผ์ ์ ํ: ๋์๋ณด๋์์ ์ํ๋ ์ฃผ์ ํด๋ฆญ
- AI ๋ถ์: 3๊ฐ์ง AI ์ฑ๊ฒฉ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ํฌ์ ์กฐ์ธ ๋ฐ๊ธฐ
- ๋งค์/๋งค๋: ์ฃผ๋ฌธ ํจ๋์์ ์๋ ์ ๋ ฅ ํ ๊ฑฐ๋
- ๋ค์ ๋ ์งํ: ํ๋ฃจ๋ฅผ ์งํํ์ฌ ์์ฅ ๋ณํ ๊ด์ฐฐ
- 20์ผ ์๋ฃ: ์ต์ข ์์ต๋ฅ ํ์ธ ๋ฐ ์ ๊ฒ์ ์์
stock-sim-local/
โโโ src/
โ โโโ components/ # React ์ปดํฌ๋ํธ
โ โ โโโ AuthScreen.jsx # ๋ก๊ทธ์ธ ํ๋ฉด
โ โ โโโ Dashboard.jsx # ์์ฅ ๋์๋ณด๋
โ โ โโโ StockDetail.jsx # ์ฃผ์ ์์ธ ํ์ด์ง
โ โ โโโ MyPage.jsx # ๋ง์ด ํ์ด์ง
โ โ โโโ Layout.jsx # ๋ ์ด์์
โ โ โโโ Header.jsx # ํค๋
โ โ โโโ Modals.jsx # ๋ชจ๋ฌ ์ปดํฌ๋ํธ๋ค
โ โโโ utils/ # ์ ํธ๋ฆฌํฐ
โ โ โโโ marketData.js # ์์ฅ ๋ฐ์ดํฐ ์์ฑ
โ โ โโโ aiTemplates.js # AI ๋ถ์ ํ
ํ๋ฆฟ
โ โ โโโ aiPersonas.jsx # AI ์ฑ๊ฒฉ ์ ์
โ โ โโโ formatters.js # ํฌ๋งคํฐ ํจ์
โ โ โโโ storage.js # localStorage ๊ด๋ฆฌ
โ โโโ App.jsx # ๋ฉ์ธ ์ฑ
โ โโโ main.jsx # ์ํธ๋ฆฌ ํฌ์ธํธ
โ โโโ index.css # ๊ธ๋ก๋ฒ ์คํ์ผ
โโโ index.html
โโโ package.json
โโโ vite.config.js
โโโ tailwind.config.js
- React 18: UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Vite: ๋น๋ ๋๊ตฌ
- Tailwind CSS: ์คํ์ผ๋ง
- Recharts: ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Lucide React: ์์ด์ฝ
- LocalStorage: ๋ฐ์ดํฐ ์ ์ฅ
์๋ณธ gemini_code(origin).jsx์ ๋น๊ตํ์ฌ ๋ค์์ด ๋ณ๊ฒฝ๋์์ต๋๋ค:
- โ Firebase ์ ๊ฑฐ: ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ localStorage์ ์ ์ฅ
- โ Gemini API ์ ๊ฑฐ: AI ๋ถ์๊ณผ ๋ด์ค๋ฅผ ๋ฏธ๋ฆฌ ์ ์๋ ํ ํ๋ฆฟ์ผ๋ก ๋์ฒด
- โ ๋ก์ปฌ ์ํ ๊ด๋ฆฌ: React useState + localStorage
- โ ๋์์ธ ๋์ผ: ์๋ณธ๊ณผ ์์ ํ ๋์ผํ UI/UX ์ ์ง
- โ ๋ชจ๋ ๊ธฐ๋ฅ ์ ์ง: ๊ฒ์์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ก์ปฌ์์ ๋์
๊ฒ์ ๋ฐ์ดํฐ๋ ๋ธ๋ผ์ฐ์ ์ localStorage์ ์ ์ฅ๋ฉ๋๋ค:
stocksim_game_state: ๊ฒ์ ์ํ (ํฌํธํด๋ฆฌ์ค, ๊ฑฐ๋๋ด์ญ ๋ฑ)stocksim_auth: ๋ก๊ทธ์ธ ์ํ
๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์ localStorage๋ฅผ ํด๋ฆฌ์ดํ๊ฑฐ๋ ๋ก๊ทธ์์ํ์ธ์.
- ์์ฅ ๋ฐ์ดํฐ: Seeded Random์ผ๋ก ์์ฑ๋ 365์ผ๊ฐ์ ์ฃผ๊ฐ ๋ฐ์ดํฐ
- AI ๋ถ์: ์ค์๊ฐ ์์ฑ์ด ์๋, ๋ฐฑ์๋์ ์ฌ์ ์ ์ฅ๋ Gemini ๊ฒฐ๊ณผ๋ฅผ ๋ ธ์ถ
- ๋ด์ค ์์ฑ: ์ต๋ ๋ณ๋ํญ์ ๋ณด์ธ ์ข ๋ชฉ ๊ธฐ๋ฐ์ผ๋ก ํค๋๋ผ์ธ ์์ฑ
- ํ ๋ง: isDarkMode state๋ก ์ ์ญ ํ ๋ง ๊ด๋ฆฌ
์ด ํ๋ก์ ํธ๋ ๊ต์ก ๋ชฉ์ ์ผ๋ก ์ ์๋์์ต๋๋ค.
๋ฒ๊ทธ ๋ฆฌํฌํธ๋ ๊ธฐ๋ฅ ์ ์์ ํ์ํฉ๋๋ค!
์ฆ๊ฑฐ์ด ํฌ์ ์๋ฎฌ๋ ์ด์ ๋์ธ์! ๐๐ฐ