ํ๊ตญ์ด ๋จ์ด ์ ์ฌ๋ ๊ธฐ๋ฐ ์ฑ๊ธ ํ๋ ์ด ๊ฒ์ - ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
React ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ SPA(Single Page Application)์ด๋ฉฐ,
FastText ๊ธฐ๋ฐ ๋ฐฑ์๋ API์ ํต์ ํ์ฌ ๊ฒ์ ํ๋ ์ด ๋ฐ ์๊ฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ ์ ์ธํฐ๋์
์ ์ฒ๋ฆฌํ๋ฉฐ, ์ง์ ๊ตฌ์ถํ Nginx ์๋ฒ๋ฅผ ํตํด ์ ์ ํ์ผ์ ์๋นํ๊ณ ์์ต๋๋ค.
๐ ์๋น์ค ๋ฐ๋ก๊ฐ๊ธฐ
๐ง ๋ฐฑ์๋ GitHub
- ๋จ์ด ์ ์ฌ๋ ๊ฒ์์ UI์ ์ธํฐ๋์ ์ ๋ด๋นํ๋ React ๊ธฐ๋ฐ ์น ํ๋ก ํธ์๋
- REST API๋ฅผ ํ์ฉํ์ฌ ๊ฒ์ ๋ฐ์ดํฐ ์ก์์
- ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ๋ฐ ์ํ ๊ด๋ฆฌ๋ฅผ ํตํ SPA ๊ตฌ์กฐ ๊ตฌํ
- ์์ฒด Nginx ์๋ฒ๋ฅผ ์ด์ฉํด ์ ์ ํ์ผ ๋ฐฐํฌ ๋ฐ API ์์ฒญ ํ๋ก์ ์ฒ๋ฆฌ
| ๋ถ๋ฅ | ๊ธฐ์ |
|---|---|
| ์ธ์ด | TypeScript, HTML, CSS |
| ํ๋ ์์ํฌ | React 19 + Vite 7 |
| ์ํ ๊ด๋ฆฌ | React hooks (useGameState) |
| ์คํ์ผ๋ง | Tailwind CSS 4 |
| ๋ฐฐํฌ ๋ฐฉ์ | Nginx + dist/ ์ ์ ์๋น |
| API ํต์ | fetch (/api/game) |
| ํ ์คํธ | Vitest |
-
โจ๏ธ ๋จ์ด ์ ๋ ฅ ๋ฐ ์ ์ฌ๋ ๊ฒฐ๊ณผ ์๊ฐํ
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋จ์ด์ ๋ํด ๋ฐฑ์๋ API๋ก ์ ์ฌ๋ ๊ณ์ฐ ์์ฒญ
- ๊ฒฐ๊ณผ๊ฐ์ ํผ์ผํธ ๋ฐ ๊ทธ๋ํ ํํ๋ก ์๊ฐํ
-
๐ ๊ฒ์ ํ๋ฆ ์ฒ๋ฆฌ
- ๊ฒ์ ์์ โ ์ ๋ ฅ โ ๊ฒฐ๊ณผ ์ถ๋ ฅ โ ๋ฆฌ์ ๋ฑ์ UX ํ๋ฆ์ React๋ก ๊ตฌ์ฑ
-
๐ API ์ฐ๋ ๋ฐ ์๋ฌ ๋์
- fetch ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์๋ REST API ์์ฒญ ์ฒ๋ฆฌ
- ์๋ต ์ํ์ ๋ฐ๋ฅธ ์กฐ๊ฑด ๋ถ๊ธฐ ๋ฐ ์๋ฌ ํธ๋ค๋ง ๋ก์ง ๊ตฌํ
- ๋ฉ ์ค ์ํ ํ์, ์๋ฌ ๋ฐ์ ์ ์ฌ์ฉ์ ํผ๋๋ฐฑ ๋ฉ์์ง ์ถ๋ ฅ
-
๐ฑ ๋ฐ์ํ ์ค๊ณ
- ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ์์ฐ์ค๋ฝ๊ฒ ํ๋ ์ด ๊ฐ๋ฅํ๋๋ก CSS ์ค๊ณ
- ๋ก์ปฌ ๋น๋ ํ Nginx๋ก ์ ์ ํ์ผ ์๋น
npm run build๋ช ๋ น์ผ๋กdist/ํด๋ ์์ฑ ํ, Nginx์์ ์๋น
- ํ๋ก ํธ์ ๋ฐฑ์๋ ํตํฉ ๋ฐฐํฌ ๊ตฌ์ฑ
- ์ ์ ํ์ผ์ Nginx์
location /์ค์ ์ ํตํด ๋ฐฐํฌ๋จ - API ์์ฒญ์
location /api์ค์ ์ ํตํด ๋ฐฑ์๋ ์๋ฒ๋ก ํ๋ก์ ์ฒ๋ฆฌ
- ์ ์ ํ์ผ์ Nginx์
- ๋๋ฉ์ธ ์ฐ๊ฒฐ:
muhanmantle.com๋๋ฉ์ธ Route 53 ์ฐ๋ - API ์ฃผ์:
public/config.json({}์ด๋ฉด ๊ฐ์ ๋๋ฉ์ธ/apiํ๋ก์ ์ฌ์ฉ)
cd muhanmantle-front
npm install
npm run dev # http://localhost:5173
npm test # Vitest
npm run build # dist/ ์์ฑ๋ฐฑ์๋๋ฅผ http://127.0.0.1:8000์์ ๋์ด ๋ค, Vite๊ฐ /api๋ฅผ ํ๋ก์ํฉ๋๋ค (vite.config.ts).
| ๋ฌธ์ | ํด๊ฒฐ ๋ฐฉ๋ฒ |
|---|---|
| CORS ์ค๋ฅ | ๋ฐฑ์๋ CORS_ORIGINS์ ํ๋ก ํธ origin ์ถ๊ฐ |
| API ์ฐ๊ฒฐ ์คํจ | ๋ฐฑ์๋ ๊ธฐ๋ ์ฌ๋ถ, config.json์ BACKEND_URL ํ์ธ |
muhanmantle-front/
โโโ index.html # Vite ์ํธ๋ฆฌ HTML
โโโ public/
โ โโโ favicon.ico
โ โโโ config.json # (์ ํ) BACKEND_URL
โ โโโ manifest.json
โ โโโ robots.txt
โโโ src/
โ โโโ api/ # config, gameSession
โ โโโ components/
โ โโโ hooks/ # useGameState
โ โโโ types/
โ โโโ utils/
โ โโโ App.tsx
โ โโโ main.tsx
โ โโโ main.css
โโโ vite.config.ts
โโโ tsconfig.json
โโโ package.json- ๋ก๋ฉ ์ ๋๋ฉ์ด์ ๋ฐ UX ์ ํ ๊ฐ์
- ์ ๋ ฅ ๊ธฐ๋ก ํ์คํ ๋ฆฌ UI ์ถ๊ฐ
- ๋ชจ๋ฐ์ผ ํฐ์น ์ธํฐ๋์ ์ต์ ํ
๐จ ํ๋ก ํธ์๋ ๊ฐ๋ฐ: ์กฐ์๋ฏผ (Soomin Cho)
- GitHub: @soominn
- Blog: som-ethi-ng.tistory.com