์ค์๊ฐ ํฝ์ ์ํธ ํ์ ํ๋ซํผ์ ํ๋ก ํธ์๋ ์ ๋๋ค.
Pick-PX๋ ์ฌ์ฉ์๋ค์ด ์ค์๊ฐ์ผ๋ก ํจ๊ป ํฝ์ ์ํธ๋ฅผ ๊ทธ๋ฆด ์ ์๋ ํ์ ํ๋ซํผ์ ๋๋ค. ์บ๋ฒ์ค ๊ณต์ , ์ค์๊ฐ ์ฑํ , ๊ฒ์ ๋ชจ๋ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๐จ ์ค์๊ฐ ํฝ์ ์ํธ ์บ๋ฒ์ค: ๋ค์ค ์ฌ์ฉ์๊ฐ ๋์์ ํฝ์ ์ ๊ทธ๋ฆด ์ ์๋ ํ์ ์บ๋ฒ์ค
- ๐ฌ ์ค์๊ฐ ์ฑํ : ์บ๋ฒ์ค ๋ด์์ ์ค์๊ฐ์ผ๋ก ์ํตํ ์ ์๋ ์ฑํ ๊ธฐ๋ฅ
- ๐ฎ ๊ฒ์ ๋ชจ๋: ํด์ฆ๋ฅผ ํตํ ๊ฒ์ํ ์บ๋ฒ์ค ๊ฒฝํ
- ๐ฅ ๊ทธ๋ฃน ์์คํ : ์บ๋ฒ์ค๋ฅผ ๊ทธ๋ฃน ๋จ์๋ก ๊ด๋ฆฌํ๊ณ ๊ณต์
- ๐ฑ ๋ฐ์ํ ๋์์ธ: ๋ฐ์คํฌํฑ๊ณผ ๋ชจ๋ฐ์ผ ํ๊ฒฝ ๋ชจ๋ ์ง์
- ๐ OAuth ๋ก๊ทธ์ธ: Google ๋ก๊ทธ์ธ ์ง์
- ๐ต ์ฌ์ด๋ ํจ๊ณผ: BGM ๋ฐ ํจ๊ณผ์์ผ๋ก ๋ชฐ์ ๊ฐ ์๋ ๊ฒฝํ ์ ๊ณต
- React 19.1.0 - ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ
- TypeScript 5.8.3 - ํ์ ์์ ์ฑ ๋ณด์ฅ
- Vite 7.0.0 - ๋น ๋ฅธ ๊ฐ๋ฐ ์๋ฒ ๋ฐ ๋น๋ ๋๊ตฌ
- Tailwind CSS 4.1.11 - ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฐ CSS ํ๋ ์์ํฌ
- React Responsive - ๋ฐ์ํ ๋์์ธ ๊ตฌํ
- React Slick - ์ด๋ฏธ์ง ์บ๋ฌ์ ์ปดํฌ๋ํธ
- Zustand 5.0.6 - ๊ฒฝ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Axios 1.10.0 - HTTP ํด๋ผ์ด์ธํธ
- Socket.io Client 4.8.1 - ์ค์๊ฐ ์น์์ผ ํต์
- React Router DOM 7.6.3 - ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ
- JWT Decode 4.0.0 - JWT ํ ํฐ ๋์ฝ๋ฉ
- React Toastify 11.0.5 - ํ ์คํธ ์๋ฆผ
- Use Sound 5.0.0 - ์ฌ์ด๋ ํจ๊ณผ ๊ด๋ฆฌ
- ESLint - ์ฝ๋ ํ์ง ๊ด๋ฆฌ
- Prettier - ์ฝ๋ ํฌ๋งทํ
- Vitest - ๋จ์ ํ ์คํธ
- Testing Library - React ์ปดํฌ๋ํธ ํ ์คํธ
src/
โโโ api/ # API ํด๋ผ์ด์ธํธ
โโโ assets/ # ์ ์ ์์ฐ (์ด๋ฏธ์ง, ์์ด์ฝ)
โโโ auth/ # ์ธ์ฆ ๊ด๋ จ ์ปดํฌ๋ํธ
โโโ components/ # ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ
โ โโโ album/ # ์จ๋ฒ ๊ด๋ จ ์ปดํฌ๋ํธ
โ โโโ canvas/ # ์บ๋ฒ์ค ๊ด๋ จ ์ปดํฌ๋ํธ
โ โโโ chat/ # ์ฑํ
๊ด๋ จ ์ปดํฌ๋ํธ
โ โโโ game/ # ๊ฒ์ ๊ด๋ จ ์ปดํฌ๋ํธ
โ โโโ group/ # ๊ทธ๋ฃน ๊ด๋ จ ์ปดํฌ๋ํธ
โ โโโ modal/ # ๋ชจ๋ฌ ์ปดํฌ๋ํธ
โ โโโ toast/ # ํ ์คํธ ์๋ฆผ ์ปดํฌ๋ํธ
โโโ hooks/ # ์ปค์คํ
React ํ
โโโ pages/ # ํ์ด์ง ์ปดํฌ๋ํธ
โโโ router/ # ๋ผ์ฐํ
์ค์
โโโ services/ # ์๋น์ค ๋ ์ด์ด
โโโ store/ # Zustand ์ํ ๊ด๋ฆฌ
โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โโโ workers/ # Web Worker
- Node.js 18.0.0 ์ด์
- npm ๋๋ yarn
# ์์กด์ฑ ์ค์น
npm install# ๊ฐ๋ฐ ๋ชจ๋๋ก ์คํ
npm run dev๊ฐ๋ฐ ์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก http://localhost:5173์์ ์คํ๋ฉ๋๋ค.
# ํ๋ก๋์
๋น๋
npm run build# ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
npm run preview# ๋จ์ ํ
์คํธ ์คํ
npm run test
# ํ
์คํธ UI ์คํ
npm run test:ui# ESLint ๊ฒ์ฌ
npm run lintํ๋ก์ ํธ ๋ฃจํธ์ .env ํ์ผ์ ์์ฑํ๊ณ ๋ค์ ๋ณ์๋ค์ ์ค์ ํ์ธ์:
VITE_API_BASE_URL=http://localhost:3000
VITE_SOCKET_URL=http://localhost:3000์ด ํ๋ก ํธ์๋๋ NestJS ๋ฐฑ์๋์ ์ฐ๋๋ฉ๋๋ค. ๋ฐฑ์๋ ์๋ฒ๊ฐ ์คํ ์ค์ด์ด์ผ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
PixelCanvas.tsx- ๋ฉ์ธ ํฝ์ ์บ๋ฒ์ค ์ปดํฌ๋ํธCanvasUI.tsx- ์บ๋ฒ์ค UI ์ปจํธ๋กคStarfieldCanvas.tsx- ๋ณ์๋ฆฌ ๋ฐฐ๊ฒฝ ํจ๊ณผ
GameCanvas.tsx- ๊ฒ์ ๋ชจ๋ ์บ๋ฒ์คQuestionModal.tsx- ํด์ฆ ๋ชจ๋ฌGameTimer.tsx- ๊ฒ์ ํ์ด๋จธ
Chat.tsx- ์ค์๊ฐ ์ฑํ ์ปดํฌ๋ํธMessageList.tsx- ๋ฉ์์ง ๋ชฉ๋กMessageInput.tsx- ๋ฉ์์ง ์ ๋ ฅ
Modal.tsx- ๊ธฐ๋ณธ ๋ชจ๋ฌ ์ปดํฌ๋ํธLoginModalContent.tsx- ๋ก๊ทธ์ธ ๋ชจ๋ฌGroupModalContent.tsx- ๊ทธ๋ฃน ๊ด๋ฆฌ ๋ชจ๋ฌ
apiClient.ts- Axios ๊ธฐ๋ฐ HTTP ํด๋ผ์ด์ธํธCanvasAPI.ts- ์บ๋ฒ์ค ๊ด๋ จ APIGameAPI.ts- ๊ฒ์ ๊ด๋ จ APIGroupAPI.ts- ๊ทธ๋ฃน ๊ด๋ จ API
socketService.ts- Socket.io ํด๋ผ์ด์ธํธ ์ค์ useSocket.ts- WebSocket ์ปค์คํ ํuseChatSocket.ts- ์ฑํ ์์ผ ํuseGameSocket.ts- ๊ฒ์ ์์ผ ํ
์ด ํ๋ก์ ํธ๋ Tailwind CSS๋ฅผ ์ฌ์ฉํ์ฌ ์คํ์ผ๋ง๋ฉ๋๋ค:
- ์ ํธ๋ฆฌํฐ ํด๋์ค ๊ธฐ๋ฐ ์คํ์ผ๋ง
- ๋ฐ์ํ ๋์์ธ ์ง์
- ๋คํฌ/๋ผ์ดํธ ๋ชจ๋ ์ง์ (ํ์์)
# ๋ชจ๋ ํ
์คํธ ์คํ
npm run test
# ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ํ์ธ
npm run test:coverage
# ํ
์คํธ UI ์คํ
npm run test:ui- ์ด ์ ์ฅ์๋ฅผ ํฌํฌํฉ๋๋ค
- ์๋ก์ด ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค (
git checkout -b feature/amazing-feature) - ๋ณ๊ฒฝ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค (
git commit -m 'Add some amazing feature') - ๋ธ๋์น์ ํธ์ํฉ๋๋ค (
git push origin feature/amazing-feature) - Pull Request๋ฅผ ์์ฑํฉ๋๋ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ง๋ฌธ์ด ์์ผ์๋ฉด ์ด์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
Pick-PX Frontend - ํจ๊ป ๊ทธ๋ฆฌ๋ ํฝ์ ์ํธ์ ์ธ๊ณ ๐