Skip to content

๐Ÿ“— 10.31 ๋””์ž์ธ & ๊ธฐ์ˆ  ์„ ์ •

Sujong Kwak edited this page Nov 4, 2024 · 5 revisions

๐Ÿ“‹ ๋””์ž์ธ & ๊ธฐ์ˆ  ์„ ์ •

1. ๋””์ž์ธ ์ปจ์…‰ ๋ฐ ์‹œ์Šคํ…œ ์ •์˜

1.1 ๋””์ž์ธ ์ปจ์…‰

  • ๋ ˆํŠธ๋กœ + 8๋น„ํŠธ ์Šคํƒ€์ผ: ๊ฒŒ์ž„ํ•˜๋Š” ๋Š๋‚Œ์„ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ ˆํŠธ๋กœ์™€ 8๋น„ํŠธ ๋Š๋‚Œ์˜ ์•„์ด์ฝ˜๊ณผ ํฐํŠธ๋ฅผ ์‚ฌ์šฉ

1.2 ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

  • ์ƒ‰์ƒ ์ถ”์ฒœ ์‚ฌ์ดํŠธ: Color Hunt
  • ํ”ผ๊ทธ๋งˆ ํ…œํ”Œ๋ฆฟ ์‚ฌ์ดํŠธ: Free Figma Templates
    • ๋‹ค์–‘ํ•œ ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์ข‹์Œ

1.3 ์•„์ด์ฝ˜ & ๋„ํŠธ ๋””์ž์ธ

  • ์•„์ด์ฝ˜ ๋ฐ ๋„ํŠธ ๋ฆฌ์†Œ์Šค ์‚ฌ์ดํŠธ
    • 8-bit Icon Set (Figma Templates)
    • Pixilart: ๋‹ค์–‘ํ•œ ๋„ํŠธ ๊ทธ๋ž˜ํ”ฝ ์ฐธ๊ณ  ๊ฐ€๋Šฅ
    • Piskel: ๋„ํŠธ๋ฅผ ์ฐ์–ด์„œ GIF ํ˜•์‹์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์ž‘ ๊ฐ€๋Šฅ

1.4 ํฐํŠธ

1.5 ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ


2. ๋ฉ”์ธ ํŽ˜์ด์ง€ ๋””์ž์ธ 1์ฐจ ์ œ์ž‘

  • ํ—ค๋”, ์ฐธ๊ฐ€์ž ์‚ฌ์ด๋“œ ๋ฐ”, ์บ”๋ฒ„์Šค ์˜์—ญ, ์ฑ„ํŒ…, ํƒ€์ดํ‹€ ๋“ฑ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๊ตฌ์กฐํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •

3. ๊ธฐ์ˆ  ์„ ์ •

3.1 ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €

// ... ์ž๋ฃŒ ์ • ๋ฆฌ ์ค‘ ...

3.2 ํ”„๋ก ํŠธ์—”๋“œ (FE) ๊ธฐ์ˆ  ์Šคํƒ

๊ธฐ์ˆ  ๋ฒ”์ฃผ ์„ ์ •๋œ ๊ธฐ์ˆ  ์ด์œ 
TS/JS TypeScript - ํƒ€์ž… ์ •์˜๋กœ ์ธํ•ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜ ๋ฐฉ์ง€
- ํ˜‘์—… ์‹œ API ์Šคํ‚ค๋งˆ ๋“ฑ ํ•„์š”ํ•œ ํƒ€์ž… ๋ฏธ๋ฆฌ ์ •์˜ โžก๏ธ ํšจ์œจ์„ฑ ์ฆ๋Œ€
ํ”„๋ ˆ์ž„์›Œํฌ React - SSR์ด ํ•„์š” ์—†๋Š” ํ”„๋กœ์ ํŠธ ํŠน์„ฑ์ƒ React ์„ ํƒ
- ํ•„์š” ์‹œ ๋ฉ”์ธํŽ˜์ด์ง€์—๋งŒ SEO ์ ์šฉ ์˜ˆ์ •
๋ฒˆ๋“ค๋Ÿฌ Vite - ๋น ๋ฅธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๋ฐ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•
- ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์› ๋ฐ ๋ฐฉ๋Œ€ํ•ด์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ๊ณ„
CSS Tailwind CSS - ์ง๊ด€์ ์ธ ๋””์ž์ธ ์ ์šฉ๊ณผ ๋น ๋ฅธ ๊ตฌ์ถ• ๊ฐ€๋Šฅ
- cva, clsx, twMerge ์‚ฌ์šฉ์œผ๋กœ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์šฉ์ด
์ƒํƒœ ๊ด€๋ฆฌ (ํด๋ผ์ด์–ธํŠธ) Zustand - ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” React ํ›…๋งŒ์œผ๋กœ๋Š” ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
- Recoil์€ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ณ , Redux๋Š” ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ๊ณผ ํฐ ํŒจํ‚ค์ง€ ํฌ๊ธฐ๋กœ ์ธํ•ด ์ œ์™ธ
- ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๊ธฐ ๋น„๊ต์—์„œ Zustand(2.9kB)์™€ Jotai(13.1kB)๋กœ ์ขํ˜€์กŒ์œผ๋‚˜ Flux ํŒจํ„ด์ด ์ต์ˆ™ํ•œ Zustand๋กœ ๊ฒฐ๋ก 
- Flux ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Zustand๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ ธ๋„ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ด, ์žฅ๊ธฐ์  ๊ด€์ ์—์„œ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์„ ํƒ
์ƒํƒœ ๊ด€๋ฆฌ (์„œ๋ฒ„) React Query - ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด React Query ๋„์ž…์„ ๊ณ ๋ ค
- ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ์ƒ ์„œ๋ฒ„์™€์˜ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ๋ฐ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ปค์Šคํ…€ ํ›… ๋ฐ ์ „์—ญ ์ƒํƒœ ๊ตฌํ˜„ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ณ ์ž ํ•จ
- ์ œํ•œ๋œ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋‚ด์— ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด React Query์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ
- React Query์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, SWR์€ ๋” ์„ธ๋ฐ€ํ•œ ๋ Œ๋”๋ง ์ œ์–ด๋ฅผ ์œ„ํ•ด ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ
ํ…Œ์ŠคํŠธ X - ์‹œ๊ฐ„ ์ œํ•œ๊ณผ UI/DOM ํ…Œ์ŠคํŠธ ์ค‘์‹ฌ ํŠน์„ฑ์ƒ ๋„์ž…ํ•˜์ง€ ์•Š์Œ
- ์ถ”ํ›„ ๋ณต์žกํ•œ ์ปค์Šคํ…€ ํ›…/ํ•จ์ˆ˜๊ฐ€ ์ƒ๊ธธ ์‹œ ๋„์ž… ๊ฒ€ํ† 
์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” Storybook - UI/UX ํ™•์ธ ๋ฐ ํ…Œ์ŠคํŠธ & ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” ๊ฐ€๋Šฅ

์• ๋‹ˆ๋ฉ”์ด์…˜: ๊ธฐ๋ณธ์ ์œผ๋กœ CSS ์‚ฌ์šฉ, ํ•„์š” ์‹œ Framer Motion ์‚ฌ์šฉ


3.3 ๋ฐฑ์—”๋“œ (BE) ๊ธฐ์ˆ  ์Šคํƒ

๊ธฐ์ˆ  ๋ฒ”์ฃผ ์„ ์ •๋œ ๊ธฐ์ˆ  ์ด์œ 
ํ”„๋ ˆ์ž„์›Œํฌ Nest.JS - ๋‚ด์žฅ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ ์ฆ๊ฐ€
- ์˜์กด์„ฑ ์ฃผ์ž…(DI)๊ณผ ๋ชจ๋“ˆํ™”๋กœ ํ…Œ์ŠคํŠธ ์šฉ์ด
- ์Šค์›จ๊ฑฐ ์ž๋™ ๋ฌธ์„œํ™” ๋ฐ DTO ์ •์˜ + ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์šฉ์ด
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค MySQL, Redis - ํ”„๋กœ์ ํŠธ์˜ ์‹ค์‹œ๊ฐ„ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„ ํŠน์„ฑ์— ๋งž์ถฐ, MySQL์€ ๋ฌธ์ œ ์ œ์‹œ์–ด์™€ ๊ฐ™์€ ์˜๊ตฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ
- Redis๋Š” ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์—ฌ ๊ฒŒ์ž„๋ฐฉ ์ •๋ณด, ์ ์ˆ˜, ์ƒํƒœ ๋“ฑ์˜ ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
- Redis์˜ TTL ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์ข…๋ฃŒ๋œ ๊ฒŒ์ž„๋ฐฉ์„ ์ž๋™ ์ •๋ฆฌํ•˜๋ฉฐ, Redis์˜ ๋‹จ์ˆœํ•œ key-value ๊ตฌ์กฐ๋กœ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•จ

3.4 ์ฝ”๋“œ ์Šคํƒ€์ผ

๊ธฐ์ˆ  ๋ฒ”์ฃผ ์„ ์ •๋œ ๊ธฐ์ˆ  ์„ค๋ช…
JSX ์ฝ”๋“œ formatter ESlint - Airbnb - ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์ดˆ๊ธฐ์—๋Š” ๊ทœ์น™์„ ํƒ€์ดํŠธํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ธฐ๋กœ ํ•จ
- ๊ฐœ๋ฐœ ์ง„ํ–‰ ์ค‘ ํŒ€์› ๊ฐ„์˜ ํ•ฉ์˜์— ๋”ฐ๋ผ ๊ทœ์น™์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ฝ”๋“œ ์ •๋ฆฌ์— ๋” ์šฉ์ดํ•  ๊ฒƒ์œผ๋กœ ํŒ๋‹จ
์ „์ฒด ์ฝ”๋“œ formatter Prettier - ์ฝ”๋“œ ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ

3.5 ๊ธฐํƒ€ ์„ค์ •

  • TypeDoc ๋ฌธ์„œํ™” & Github Action์œผ๋กœ ๋ฐฐํฌ
  • clsx ์‚ฌ์šฉ ๊ฒ€ํ†  (๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์‹œ ์œ ์šฉ)
  • alias ์„ค์ • (@๋กœ ์ ‘๊ทผ)
  • husky ์„ค์ • (Git Hook ์„ค์ • & ESLint์™€ prettier ๊ฒ€์‚ฌ)

4. ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ

src/
โ”œโ”€โ”€ ๐Ÿ“‚ components/              # ์ปดํฌ๋„ŒํŠธ ํด๋”
โ”‚   โ”œโ”€โ”€ ui/                     # Headless UI ์ปดํฌ๋„ŒํŠธ (Button, Input ๋“ฑ)
โ”‚   โ”œโ”€โ”€ common/                 # ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
โ”‚   โ””โ”€โ”€ domains/                # ๋„๋ฉ”์ธ๋ณ„ ์ปดํฌ๋„ŒํŠธ (Game, Draw ๋“ฑ)
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ apis/                     # API ๊ด€๋ จ ์„ค์ •
โ”‚   โ”œโ”€โ”€ config.ts               # ํ™˜๊ฒฝ๋ณ€์ˆ˜, Fetch ์„ค์ •
โ”‚   โ””โ”€โ”€ services/               # API ํ˜ธ์ถœ ํ•จ์ˆ˜
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ assets/                  # ๋นŒ๋“œ์— ํฌํ•จ๋˜๋Š” ์ •์  ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ images/                 # svg, ์ด๋ฏธ์ง€
โ”‚   โ””โ”€โ”€ fonts/                  # ํฐํŠธ ํŒŒ์ผ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ hooks/                   # ์ปค์Šคํ…€ ํ›…
โ”‚   โ”œโ”€โ”€ apis/                   # React Query ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ›… (/src/api์™€ ๋™๊ธฐํ™” ํ•„์š”)
โ”‚   โ””โ”€โ”€ custom/                 # ์ผ๋ฐ˜ ์ปค์Šคํ…€ ํ›…
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ types/                   # ํƒ€์ž… ์ •์˜ (2๊ฐœ ์ด์ƒ ์‹œ)
โ”‚   โ”œโ”€โ”€ index.ts                # ํƒ€์ž… export ์ค‘์•™ ํŒŒ์ผ
โ”‚   โ””โ”€โ”€ *.types.ts              # ๋„๋ฉ”์ธ๋ณ„ ํƒ€์ž… ํŒŒ์ผ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ constants/               # ์ƒ์ˆ˜ ์ •์˜
โ”‚   โ””โ”€โ”€ index.ts                # USER_INFO ๋“ฑ ์ƒ์ˆ˜ ๋ชจ์Œ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ stores/                   # Zustand ์ „์—ญ ์ƒํƒœ
โ”‚   โ”œโ”€โ”€ gameStore.ts            # ๊ฒŒ์ž„ ๊ด€๋ จ ์ƒํƒœ
โ”‚   โ””โ”€โ”€ userStore.ts            # ์œ ์ € ๊ด€๋ จ ์ƒํƒœ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ utils/                   # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ (๋ฆฌ์•กํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๊ด€๋ จ ์—†๋Š” ๊ณตํ†ต ํ•จ์ˆ˜)
โ”‚   โ”œโ”€โ”€ format.ts               # ํฌ๋งท ๊ด€๋ จ
โ”‚   โ””โ”€โ”€ validation.ts           # ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ
โ”‚
โ””โ”€โ”€ ๐Ÿ“‚ public/                  # ๋นŒ๋“œ ์ œ์™ธ ์ •์  ํŒŒ์ผ
   โ””โ”€โ”€ favicon.ico              # ํŒŒ๋น„์ฝ˜ ๋“ฑ

๐Ÿ˜Ž ์›จ๋ฒ ๋ฒ ๋ฒ ๋ฒฑ

๐Ÿ‘ฎ๐Ÿป ํŒ€ ๊ทœ์น™

๐Ÿ’ป ํ”„๋กœ์ ํŠธ

๐Ÿชต ์›จ๋ฒ ๋ฒฑ ๊ธฐ์ˆ ๋กœ๊ทธ

๐Ÿช„ ๋ฐ๋ชจ ๊ณต์œ 

๐Ÿ”„ ์Šคํ”„๋ฆฐํŠธ ๊ธฐ๋ก

๐Ÿ“— ํšŒ์˜๋ก

Clone this wiki locally