ToyProjects๐Ÿงธ

ํ”„๋กœ์ ํŠธ ์„ธํŒ… - ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด

JanuDev 2025. 7. 9. 16:24

์ƒˆ๋กœ ์ƒ์„ฑํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ณ„ ๊ตฌ์กฐ์™€ ์—ญํ• ์— ๋Œ€ํ•œ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ด๋ณด์—ฌ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ!

1. public/

์ •์  ํŒŒ์ผ(html, ์ด๋ฏธ์ง€, ํŒŒ๋น„์ฝ˜ ๋“ฑ)์„ ๋‘๋Š” ํด๋”. ์ด ํด๋” ์•ˆ์˜ ํŒŒ์ผ์€ ๋นŒ๋“œ ์‹œ ๊ฐ€๊ณต ์—†์ด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋˜๋ฉฐ ์ด๋ฏธ์ง€๋‚˜ ๋ฉ”ํƒ€ ํƒœ๊ทธ ๋“ฑ HTML์—์„œ ์ง์ ‘ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•  ๊ฒƒ๋“ค์„ ์ €์žฅํ•œ๋‹ค..

 

โ€ป ์ •์  ํŒŒ์ผ : ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ๋‚˜ ๋ณ€ํ™˜ ์—†์ด ๊ทธ๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ํŒŒ์ผ. ์š”์ฒญํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ™์€ ๋‚ด์šฉ์ด๋ฉฐ, ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด ์—†๊ณ (=์‘๋‹ต์ด ๋น ๋ฆ„), ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์ „์†กํ•œ๋‹ค(=์„œ๋ฒ„ ์ฒ˜๋ฆฌ ์—†์Œ).

์›นํŒฉ์ด ๊ฑด๋“ค์ง€ ์•ˆํ˜น, ๋นŒ๋“œ ํ›„์—๋„ ํŒŒ์ผ๋ช…์ด ๊ทธ๋Œ€๋กœ์ด๋ฉฐ ์ง์ ‘ url์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. "ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด ๋ˆ„๊ฐ€ ์–ธ์ œ ์š”์ฒญํ•ด๋„ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ"

ex) ๋กœ๊ณ , ๋ฐฐ๋„ˆ, ํฐํŠธ, ๋ฌธ์„œ, ๋™์˜์ƒ

 

โ€ป ๋™์  ํŒŒ์ผ : ์š”์ฒญ๋งˆ๋‹ค ๋ณ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ณ (=์‘๋‹ต์ด ๋А๋ฆผ), ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ, ๊ณ„์‚ฐ ๋“ฑ์˜ ์„œ๋ฒ„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์›นํŒฉ์ด ์ฒ˜๋ฆฌํ•˜๋ฉฐ(์••์ถ•, ์ตœ์ ํ™”, ํ•ด์‹œ ๋“ฑ), ๋นŒ๋“œ ํ›„ ํŒŒ์ผ๋ช…์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ(ex. logo.a1b2c3.jpg) import๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

ex) ์‚ฌ์šฉ์ž ํ”„์‚ฌ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ, ํ˜„์žฌ ์‹œ๊ฐ„

 

 

2. src/ 

์‹ค์ œ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํ•ต์‹ฌ ํด๋”.

  • assets/ : ์ •์  ์ž์‚ฐ(์ด๋ฏธ์ง€, ํฐํŠธ, ์•„์ด์ฝ˜, ์Šคํƒ€์ผ ๋“ฑ)์„ ๋„ฃ๋Š” ๊ณณ(ex. assets/images, assets/fonts, asstes/icons)
  • components/ : ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ €์žฅํ•˜๋Š” ํด๋”(ex. button, modal, input, card ๋“ฑ), ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์ ธ์„œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • data/ :  ์ •์ ์ธ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด๋‚˜ ๋”๋ฏธ(Mock)๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ(ex. JSONํ˜•ํƒœ์˜ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก, ์„ค์ • ๊ฐ’, ๋ชฉ๋ก ์•„์ดํ…œ ๋“ฑ)
  • functions(ํ˜น์€ utils/) : ์œ ํ‹ธ๋ฆฌํ‹ฐ ใ…Ž๋งˆ์ˆ˜๋‚˜ ํ—ฌํผ ํ•จ์ˆ˜๋“ค์„ ์ •๋ฆฌ(ex. ๋‚ ์งœ ํฌ๋งท, ์ •๊ทœ์‹ ๊ฒ€์‚ฌ, API์‘๋‹ต ์ฒ˜๋ฆฌ, formplus์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ api ๋“ฑ)
  • layouts/ : ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ €์žฅ
  • pages/ : ๋ผ์šฐํŠธ์— ๋Œ€์‘๋˜๋Š” ๊ฐœ๋ณ„ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ €์žฅ. router.tsx์™€ ๋งคํ•‘๋˜๋Š” ์‹ค์ œ ์ฝ˜ํ…์ธ  ํ™”๋ฉด์„ ๋ณด์—ฌ์คŒ
  • routers/ : ๋ผ์šฐํ„ฐ ์„ค์ •, ๊ฒฝ๋กœ ์ƒ์ˆ˜, ์‚ฌ์ดํŠธ ๋งต ๋“ฑ ๋ผ์šฐํŒ… ๊ด€๋ จ ํŒŒ์ผ ์ €์žฅ
    • paths.ts : ๋ชจ๋“  ๊ฒฝ๋กœ ๋ฌธ์ž์—ด์„ ๋ชจ์•„๋†“์€ ์ƒ์ˆ˜ ํŒŒ์ผ
    • router.tsx: React Router์˜ ์„ค์ •
    • sitemap.ts: ๋ฉ”๋‰ด, ์‚ฌ์ด๋“œ๋ฐ”, ๋„ค๋น„๊ฒŒ์ด์…˜ ํ•ญ๋ชฉ์„ ์œ„ํ•œ ๊ฒฝ๋กœ ์ •๋ณด

3. App.tsx

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ. ์ „์ฒด ๊ตฌ์กฐ์˜ ์ง„์ž…์ (๋ผ์šฐํŒ…, ๋ ˆ์ด์•„์›ƒ ๋“ฑ ์กฐํ•ฉ)

 

4. index.css

์ „์—ญ css ์„ค์ •

 

5. main.tsx

React์•ฑ์ด ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋ง๋˜๋Š” ์‹œ์ž‘์ . ReactDOM.createRoot()๋กœ App์„ DOM์— ๋งˆ์šฐํŠธํ•˜๋ฉฐ,  index.html์˜ id="root"์— ์—ฐ๊ฒฐ๋œ๋‹ค.

 

โœ…์‹ค์ œ ํ๋ฆ„์€?

1. ๋ธŒ๋ผ์šฐ์ €๋Š” index.html์„ ์ฝ๊ณ ,

2. main.tsx๊ฐ€ ์‹คํ–‰๋˜์–ด,

3. App.tsx๋ฅผ ํ†ตํ•ด ์ „๋ฐ˜์ ์ธ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋ผ์šฐํŒ…์„ ๊ตฌ์„ฑํ•˜๊ณ ,

4. ๋ผ์šฐํŒ…์— ๋”ฐ๋ผ pages/์•ˆ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๊ณ ,

5. components/, layouts/, functions/ ๋“ฑ์€ ๊ทธ๊ฑธ ๋„์™€์ฃผ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

 

โœ…public ๋‚ด์˜ ํŒŒ์ผ๊ณผ src/assets ๋‚ด์˜ ํŒŒ์ผ์˜ ์ฐจ์ด์ ์€?

public ํด๋”์˜ ํŒŒ์ผ์€ "์ •์  ํŒŒ์ผ"๋“ค์„, assetsํด๋”์—๋Š” ๋ชจ๋“ˆ ํŒŒ์ผ ์ฆ‰ "๋™์  ํŒŒ์ผ"๋“ค์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

public ํด๋”์— ๋„ฃ์„๊ฒƒ src/assets์— ๋„ฃ์„ ๊ฒƒ
๐ŸŸข ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๊ณตํ†ต ์‚ฌ์šฉ(favicon, logo)
๐ŸŸข ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผ ํ•„์š”(sitempap.xml)
๐ŸŸข ๋งค์šฐ ํฐ ํŒŒ์ผ : ๋™์˜์ƒ, ๋Œ€์šฉ๋Ÿ‰ ์ด๋ฏธ์ง€
๐ŸŸข ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๐ŸŸข ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
๐ŸŸข ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ํŒŒ์ผ:  ์ด๋ฏธ์ง€, ์•„์ด์ฝ˜
๐ŸŸข ๊ฐœ๋ฐœ ์ค‘ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ํŒŒ์ผ
๐ŸŸข ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ํŒŒ์ผ