[DevCamp] ๐Ÿ—๏ธ React ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ• ๊นŒ?

๋™๊ฑดยท2025๋…„ 4์›” 16์ผ
0

DevCamp

๋ชฉ๋ก ๋ณด๊ธฐ
49/85

๐Ÿ—๏ธ React ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ• ๊นŒ?

๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์•ผ ํ• ์ง€ ๋ง‰๋ง‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ตฌ์กฐ๊ฐ€ ์—‰ํ‚ค๊ธฐ ์‰ฌ์šด๋ฐ, ์ดˆ๋ฐ˜์— ์ž˜ ์ •๋ฆฌํ•ด๋‘๋ฉด ์œ ์ง€๋ณด์ˆ˜์™€ ํ˜‘์—…์ด ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์ง„๋‹ค.

์˜ค๋Š˜์€ ์ผ๋ฐ˜์ ์ธ React ์•ฑ ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์—ญํ• ์„ ์ž‘์„ฑํ•ด๋ณธ๋‹ค.


1. ๊ธฐ๋ณธ ๊ตฌ์กฐ ์˜ˆ์‹œ

my-react-app/
โ”œโ”€โ”€ public/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ assets/
โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”œโ”€โ”€ pages/
โ”‚   โ”œโ”€โ”€ hooks/
โ”‚   โ”œโ”€โ”€ utils/
โ”‚   โ”œโ”€โ”€ store/
โ”‚   โ”œโ”€โ”€ routes/
โ”‚   โ”œโ”€โ”€ App.tsx
โ”‚   โ””โ”€โ”€ main.tsx
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ index.html
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ tsconfig.json

2. ๋””๋ ‰ํ† ๋ฆฌ๋ณ„ ์„ค๋ช…

๐Ÿ“ public/

  • ์ •์  ํŒŒ์ผ์„ ๋ณด๊ด€ํ•˜๋Š” ๊ณณ
  • index.html์ด ์ด ํด๋” ์•ˆ์— ์žˆ์Œ

๐Ÿ“ src/

ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ์ฝ”๋“œ๋“ค์ด ๋“ค์–ด์žˆ๋Š” ํด๋”

๐Ÿ“ assets/

  • ์ด๋ฏธ์ง€, ํฐํŠธ, ๊ณตํ†ต CSS ๋“ฑ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌ

๐Ÿ“ components/

  • ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ณด๊ด€
  • ex) Button, Modal, Header ๋“ฑ

๐Ÿ“ pages/

  • ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋“ค
  • React Router์˜ route์™€ 1:1๋กœ ๋Œ€์‘๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

๐Ÿ“ hooks/

  • ์ปค์Šคํ…€ ํ›…์„ ์ •์˜
  • ex) useInput, useDebounce, useAuth

๐Ÿ“ utils/

  • ์œ ํ‹ธ ํ•จ์ˆ˜ ๋ชจ์Œ (ex. ๋‚ ์งœ ํฌ๋งท, ์ˆซ์ž ํฌ๋งท, API ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ)

๐Ÿ“ store/

  • Redux ๋˜๋Š” Zustand ๋“ฑ ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์„ ๋ถ„๋ฆฌ
  • ๋ชจ๋“ˆํ™”๋œ ์ƒํƒœ slice๋“ค์„ ๊ด€๋ฆฌ

๐Ÿ“ routes/

  • ๋ผ์šฐํŒ… ์ •๋ณด ๊ด€๋ฆฌ
  • react-router-dom์˜ ๋ผ์šฐํ„ฐ ์„ค์ •์„ ๋ชจ์•„ ๊ด€๋ฆฌ

3. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•œ ํŒ

  • ๊ธฐ๋Šฅ๋ณ„๋กœ ํด๋”๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ๋‹ค (Feature-based)

  • ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด features/, services/, api/ ํด๋” ๋“ฑ๋„ ๊ณ ๋ ค

  • ํด๋” ์•ˆ์—์„œ๋„ index.ts๋ฅผ ํ™œ์šฉํ•˜๋ฉด import ๊ฒฝ๋กœ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค

    // ์˜ˆ: components/index.ts
    export { default as Button } from './Button';
    export { default as Header } from './Header';
    
    // ์‚ฌ์šฉ
    import { Button, Header } from '@/components';

4. ์‹ค์ œ Vite + TypeScript ํ™˜๊ฒฝ๊ณผ ์—ฐ๊ฒฐํ•˜๋ฉด?

src/
โ”œโ”€โ”€ api/             # ์„œ๋ฒ„ ์š”์ฒญ ๋ชจ๋“ˆ
โ”œโ”€โ”€ components/
โ”œโ”€โ”€ constants/       # ์ƒ์ˆ˜ ์ •์˜
โ”œโ”€โ”€ hooks/
โ”œโ”€โ”€ pages/
โ”œโ”€โ”€ routes/
โ”œโ”€โ”€ store/           # Zustand or Redux
โ”œโ”€โ”€ styles/          # ์ „์—ญ ์Šคํƒ€์ผ
โ”œโ”€โ”€ types/           # ํƒ€์ž… ์ •์˜ ํŒŒ์ผ
โ”œโ”€โ”€ utils/
โ”œโ”€โ”€ App.tsx
โ””โ”€โ”€ main.tsx

5. ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์Šต๊ด€

  • ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ
  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ์ง€ํ‚ค๊ธฐ (UI vs Logic vs State)
  • ๋„ค์ด๋ฐ์„ ์ผ๊ด€๋˜๊ฒŒ
  • ํด๋”๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋Š” ๊ฒƒ๋„ ์ง€์–‘ํ•˜๊ธฐ

๐Ÿ”จ TIL

  • React ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋Š” ํŒ€์›๊ณผ์˜ ํ˜‘์—…์„ ๊ณ ๋ คํ•ด ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ components, pages, hooks, store, utils ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ„๊ณ ,
    ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๊ธฐ๋Šฅ ์ค‘์‹ฌ(feature-based) ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋”๋ณ„ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , index ํŒŒ์ผ์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
profile
๋ฐฐ๊ณ ํ”ˆ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€