๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

Frontend Fundemental (ํ† ์Šค, ํ”„๋ก ํŠธ์—”๋“œ ์ข‹์€ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ) ์ •๋ฆฌ ๋ณธ๋ฌธ

Study/React

Frontend Fundemental (ํ† ์Šค, ํ”„๋ก ํŠธ์—”๋“œ ์ข‹์€ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ) ์ •๋ฆฌ

Shinjio 2025. 1. 16. 00:14
๋ฐ˜์‘ํ˜•

Props Drilling ์ง€์šฐ๊ธฐ

 

Props Drilling ์ง€์šฐ๊ธฐ

Guidelines for easily modifiable frontend code

frontend-fundamentals.com

 


 

๊ตฌ๋…์ค‘์ธ ์œ ํŠœ๋ฒ„๊ฐ€ ํ•˜๋‚˜์˜ ์˜์ƒ์„ ์ƒˆ๋กญ๊ฒŒ ์˜ฌ๋ ธ๋Š”๋ฐ, ํ† ์Šค์—์„œ ์ž‘์„ฑํ•œ Frontend Fundemental์„ ์†Œ๊ฐœํ•˜๋Š” ์˜์ƒ์ด์—ˆ๋‹ค. Frontend Fundemental์€ Toss ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ข‹์€ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ๊ธฐ์ค€์„ ์ž์‹ ๋“ค์˜ ๊ธฐ์ค€์— ๋งž์ถฐ ์ž‘์„ฑํ•œ ๋ฌธ์„œ์ด๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์†Œ์Šค๋ฅผ ๋ณด์ง€ ๋ชปํ•ด ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ ์ด ๋ฌธ์„œ๋ฅผ ์ •๋…ํ•˜์—ฌ ์ข‹์€ ์ฝ”๋“œ๋ž€ ๋ฌด์—‡์ธ์ง€ ์ฝ์–ด๋ณด๊ณ  ํ˜„์žฌ ๋‚˜์˜ ์ฝ”๋“œ๋Š” ์–ด๋–ค์ง€ ๋Œ์•„๋ณด๊ณ  ๋‚˜๋งŒ์˜ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๊ฐ์„ ์ •๋ฆฌํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ณ ์ž ํ•œ๋‹ค.

 

Frontend Fundemental์—์„œ ์ œ์‹œํ•œ ์ข‹์€ ์ฝ”๋“œ์˜ 4๊ฐ€์ง€ ์›์น™์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ํ•ด๋‹น ์›์น™์€ ๊ฒฐ๊ตญ “๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ”๋ผ๋Š ์ƒ๊ฐ์—์„œ ๋‚˜์˜จ๋‹ค. ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ธฐ ์ˆ˜์›”ํ•œ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ์ด๋‹ค. “๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ”์˜ ๊ธฐ์ค€์„ ์•„๋ž˜ 4๊ฐ€์ง€ ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๊ฐ€๋…์„ฑ(Readability)
    • ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ
    • ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์šฐ์„  ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋Š” ์ฝ๋Š” ์‚ฌ๋žŒ์ด ํ•œ ๋ฒˆ์— ๋จธ๋ฆฟ์†์—์„œ ๊ณ ๋ คํ•˜๋Š” ๋งฅ๋ฝ์ด ์ ๊ณ , ์œ„์—์„œ ์•„๋ž˜๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด์ง„๋‹ค.
  • ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ(Predictability)
    • ํ˜‘์—…ํ•˜๋Š” ๋™๋ฃŒ๋“ค์ด ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘์„ ์–ผ๋งˆ๋‚˜ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š”์ง€
    • ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋Š” ์ผ๊ด€์ ์ธ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ , ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฐ˜ํ™˜๊ฐ’๋งŒ ๋ณด๊ณ ๋„ ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์‘์ง‘๋„(Cohesion)
    • ์ˆ˜์ •๋˜์–ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์ด ์ˆ˜์ •๋˜๋Š”๊ฐ€
    • ์ฝ”๋“œ์˜ ํ•œ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด๋„ ์˜๋„์น˜ ์•Š๊ฒŒ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ
    • ๊ฐ€๋…์„ฑ๊ณผ ์‘์ง‘๋„๋Š” ์„œ๋กœ ์ƒ์ถฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ถ”์ƒํ™”ํ•˜๋Š” ๋“ฑ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ดํŠธ๋ฆฌ๋Š” ๊ฒฐ์ •์„ ํ•ด์•ผ ํ•œ๋‹ค. ํ•จ๊ป˜ ์ˆ˜์ •๋˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์‘์ง‘๋„๋ฅผ ์šฐ์„ ํ•˜๊ณ , ์ถ”์ƒํ™”ํ•˜๊ณ , ์œ„ํ—˜์„ฑ์ด ๋†’์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋…์„ฑ์„ ์šฐ์„ ํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ๊ฒฐํ•ฉ๋„(Coupling)
    • ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ์˜ ์˜ํ–ฅ๋ฒ”์œ„
    • ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์˜ํ–ฅ๋ฒ”์œ„๊ฐ€ ์ ์–ด์„œ, ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๋ฒ”์œ„๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”

์œ„์˜ 4๊ฐ€์ง€ ์›์น™ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋Š” ํด๋ฆฐ์ฝ”๋“œ๋‚˜ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ๊ด€๋ จ ์ฑ…์—์„œ ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ๋ฌธ์„œ๋Š” ์œ„์˜ 4๊ฐ€์ง€ ์›์น™์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ํ•ด๋‹น ์›์น™์— ๋”ฐ๋ผ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ธ์ง€ ์ƒ์„ธํ•˜๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.


1. ๊ฐ€๋…์„ฑ

๋งฅ๋ฝ ์ค„์ด๊ธฐ

A. ๊ฐ™์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ถ„๋ฆฌํ•˜๊ธฐ

  • ๋™์‹œ์— ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— ์žˆ์œผ๋ฉด, ๋™์ž‘์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ ๋ถ„๊ธฐ๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค.

B. ๊ตฌํ˜„ ์ƒ์„ธ ์ถ”์ƒํ™”ํ•˜๊ธฐ

  • Wrapper ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
  • HOC(Higher-Order Component) ์‚ฌ์šฉ
  • ์ถ”์ƒํ™”

C. ๋กœ์ง ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ•ฉ์ณ์ง„ ํ•จ์ˆ˜ ์ชผ๊ฐœ๊ธฐ

  • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, ์ƒํƒœ, API ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ๋กœ์ง์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ, Hook์„ ๋‚˜๋ˆ„์ง€ ๋ง ๊ฒƒ
  • ์ข‹์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” ํŠน์ •ํ•œ ์ƒํƒœ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์„ ๋•Œ ์ตœ์†Œํ•œ์˜ ๋ถ€๋ถ„์ด ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
    • → ํŒŒ๋ผ๋ฏธํ„ฐ๋ณ„๋กœ ๋ณ„๋„์˜ Hook ์ž‘์„ฑ

 

์ด๋ฆ„ ๋ถ™์ด๊ธฐ

A. ๋ณต์žกํ•œ ์กฐ๊ฑด์— ์ด๋ฆ„ ๋ถ™์ด๊ธฐ

  • ๋ณต์žกํ•œ ์กฐ๊ฑด์‹์ด ํŠน๋ณ„ํ•œ ์ด๋ฆ„ ์—†์ด ์‚ฌ์šฉ๋˜๋ฉด, ์กฐ๊ฑด์ด ๋œปํ•˜๋Š” ๋ฐ”๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋”ฐ๋ผ์„œ ์กฐ๊ฑด์— ๋ช…์‹œ์ ์ธ ์ด๋ฆ„์„ ๋ถ™์ด๋ฉด, ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ํ•œ ๋ฒˆ์— ๊ณ ๋ คํ•ด์•ผ ํ•  ๋งฅ๋ฝ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
**<์กฐ๊ฑด์‹์— ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ธฐ์ค€>**

**์กฐ๊ฑด์‹์— ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ์ข‹์„ ๋•Œ**
1. ๋ณต์žกํ•œ ๋กœ์ง์„ ๋‹ค๋ฃฐ ๋•Œ
- ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ํ•จ์ˆ˜์—์„œ ๋ณต์žกํ•œ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ์ฒ˜๋ฆฌ๋˜๋ฉด, ์ด๋ฆ„์„ ๋ถ™์—ฌ ํ•จ์ˆ˜์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 
2. ์žฌ์‚ฌ์šฉ์„ฑ์ด ํ•„์š”ํ•  ๋•Œ
- ๋™์ผํ•œ ๋กœ์ง์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉด, ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 
3. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
- ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ๋…๋ฆฝ์ ์œผ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

**์กฐ๊ฑด์— ์ด๋ฆ„์„ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์„ ๋•Œ**
1. ๋กœ์ง์ด ๊ฐ„๋‹จํ•  ๋•Œ
2. ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ๋กœ์ง์ด ๋ณต์žกํ•˜์ง€ ์•Š์„ ๋•Œ

B. ๋งค์ง ๋„˜๋ฒ„์— ์ด๋ฆ„ ๋ถ™์ด๊ธฐ

  • ๋งค์ง ๋„˜๋ฒ„(Magic Number)๋ž€ ์ •ํ™•ํ•œ ๋œป์„ ๋ฐํžˆ์ง€ ์•Š๊ณ  ์†Œ์Šค ์ฝ”๋“œ ์•ˆ์— ์ง์ ‘ ์ˆซ์ž ๊ฐ’์„ ๋„ฃ๋Š” ๊ฒƒ
  • ์ƒ์ˆ˜ ์„ ์–ธ์„ ํ†ตํ•ด ๋งค์ง ๋„˜๋ฒ„์— ์ด๋ฆ„ ๋ถ™์ด๊ธฐ

 

์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝํžˆ๊ฒŒ ํ•˜๊ธฐ

A. ์‹œ์  ์ด๋™ ์ค„์ด๊ธฐ

  • ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์ฝ”๋“œ์˜ ์œ„์•„๋ž˜๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋ฉด์„œ ์ฝ๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด๋‚˜ ํ•จ์ˆ˜, ๋ณ€์ˆ˜๋ฅผ ๋„˜๋‚˜๋“ค๋ฉด์„œ ์ฝ๋Š” ๊ฒƒ
  • ์ฝ”๋“œ๋ฅผ ์œ„์—์„œ ์•„๋ž˜์„œ, ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋‚˜ ํŒŒ์ผ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ์ฝ๋Š” ์‚ฌ๋žŒ์ด ๋™์ž‘์„ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

B. ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ๋‹จ์ˆœํ•˜๊ฒŒ ํ•˜๊ธฐ

  • if๋ฌธ์œผ๋กœ ํ’€์–ด์„œ ์‚ฌ์šฉ

2. ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ

A. ์ด๋ฆ„ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ

  • ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋Š” ๋™์ผํ•œ ๋™์ž‘์„ ํ•ด์•ผ ํ•œ๋‹ค.

B. ๊ฐ™์€ ์ข…๋ฅ˜์˜ ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž… ํ†ต์ผํ•˜๊ธฐ

  • API ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ Hook๋“ค์ฒ˜๋Ÿผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ํ•จ์ˆ˜๋‚˜ Hook์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ฐ€์ง€๋ฉด ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  • ์„œ๋ฒ„ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Hook์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋ฉด, ๋™๋ฃŒ๋“ค์€ Hook์„ ์“ธ ๋•Œ๋งˆ๋‹ค ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด, ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ๋™๋ฃŒ๋“ค์€ ํ•จ์ˆ˜๋ฅผ ์“ธ ๋•Œ๋งˆ๋‹ค ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

C. ์ˆจ์€ ๋กœ์ง ๋“œ๋Ÿฌ๋‚ด๊ธฐ

  • ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฐ˜ํ™˜ ๊ฐ’์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š” ์ˆจ์€ ๋กœ์ง์ด ์žˆ์œผ๋ฉด ํ˜‘์—…ํ•˜๋Š” ๋™๋ฃŒ๋“ค์ด ๋™์ž‘์„ ์˜ˆ์ธกํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ์Œ

3. ์‘์ง‘๋„

A. ํ•จ๊ป˜ ์ˆ˜์ •๋˜๋Š” ํŒŒ์ผ์„ ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋‘๊ธฐ

  • ํ•จ๊ป˜ ์ˆ˜์ •๋˜๋Š” ์†Œ์Šค ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋ฉด ์ฝ”๋“œ์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ๊ป˜ ์ˆ˜์ •๋˜๋Š” ์ฝ”๋“œ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ๋‘”๋‹ค๋ฉด, ์ฝ”๋“œ ์‚ฌ์ด์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค.
โ””โ”€ src
   โ”‚  // ์ „์ฒด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ
   โ”œโ”€ components
   โ”œโ”€ containers
   โ”œโ”€ hooks
   โ”œโ”€ utils
   โ”œโ”€ ...
   โ”‚
   โ””โ”€ domains
      โ”‚  // Domain1์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ
      โ”œโ”€ Domain1
      โ”‚     โ”œโ”€ components
      โ”‚     โ”œโ”€ containers
      โ”‚     โ”œโ”€ hooks
      โ”‚     โ”œโ”€ utils
      โ”‚     โ””โ”€ ...
      โ”‚
      โ”‚  // Domain2์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ
      โ””โ”€ Domain2
            โ”œโ”€ components
            โ”œโ”€ containers
            โ”œโ”€ hooks
            โ”œโ”€ utils
            โ””โ”€ ...

 

B. ๋งค์ง ๋„˜๋ฒ„ ์—†์• ๊ธฐ

  • ์ˆซ์ž์˜ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค.

 

C. ํผ์˜ ์‘์ง‘๋„ ์ƒ๊ฐํ•˜๊ธฐ

ํ•„๋“œ ๋‹จ์œ„ ์‘์ง‘๋„

  • ํ•„๋“œ ๋‹จ์œ„ ์‘์ง‘์€ ๊ฐœ๋ณ„ ์ž…๋ ฅ ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๊ฐ ํ•„๋“œ๊ฐ€ ๊ณ ์œ ์˜ ๊ฒ€์ฆ ๋กœ์ง์„ ๊ฐ€์ง€๋ฏ€๋กœ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ฒ”์œ„๊ฐ€ ์ค„์–ด๋“ค์–ด ํŠน์ • ํ•„๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์–ด์ง„๋‹ค.

ํผ ์ „์ฒด ๋‹จ์œ„ ์‘์ง‘๋„

  • ํผ ์ „์ฒด ์‘์ง‘์€ ๋ชจ๋“  ํ•„๋“œ์˜ ๊ฒ€์ฆ ๋กœ์ง์ด ํผ์— ์ข…์†๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ํผ ์ „์ฒด์—์„œ์˜ ํ๋ฆ„์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค๊ณ„๋˜๋ฉฐ, ๋ณ€๊ฒฝ ๋‹จ์œ„๊ฐ€ ํผ ๋‹จ์œ„๋กœ ๋ฐœ์ƒํ•  ๋•Œ ๋กœ๊ฒจํ•œ๋‹ค.
  • ํผ ์ „์ฒด ์‘์ง‘๋„๋ฅผ ๋†’์ด๋ฉด, ํผ ์ „์ฒด์˜ ๊ฒ€์ฆ์ด ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ๋˜์–ด ๋กœ์ง์ด ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ์ƒํƒœ๊ฐ€ ์ค‘์•™์ง‘์ค‘์‹์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ํผ ์ „์ฒด ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์–ด์ง„๋‹ค.
  • ํ•„๋“œ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง€๋ฏ€๋กœ ํผ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์€ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•„๋“œ ๋‹จ์œ„ vs ํผ ์ „์ฒด ๋‹จ์œ„ ์‘์ง‘๋„

  • ํ•„๋“œ ๋‹จ์œ„ ์‘์ง‘๋„๋ฅผ ์„ ํƒํ•˜๋ฉด ์ข‹์„ ๋•Œ
    • ๋…๋ฆฝ์ ์ธ ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ๋•Œ
      • ํ•„๋“œ๋ณ„๋กœ ๋ณต์žกํ•œ ๊ฒ€์ฆ ๋กœ์ง์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
      • ์ด๋ฉ”์ผ ํ˜•์‹ ๊ฒ€์‚ฌ, ์ „ํ™”๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์ฆ, ์•„์ด๋”” ์ค‘๋ณต ํ™•์ธ, ์ถ”์ฒœ ์ฝ”๋“œ ์œ ํšจ์„ฑ ํ™•์ธ์ฒ˜๋Ÿผ ๊ฐ ํ•„๋“œ๊ฐ€ ๋…๋ฆฝ์ ์ด๊ณ  ๊ณ ์œ ํ•œ ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ๋•Œ ์œ ์šฉ
    • ์žฌ์‚ฌ์šฉ์ด ํ•„์š”ํ•  ๋•Œ
      • ํ•„๋“œ์™€ ๊ฒ€์ฆ ๋กœ์ง์ด ๋‹ค๋ฅธ ํผ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
  • ํผ ์ „์ฒด ๋‹จ์œ„ ์‘์ง‘๋„๋ฅผ ์„ ํƒํ•˜๋ฉด ์ข‹์„ ๋•Œ
    • ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ
      • ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ํ•˜๋‚˜์˜ ์™„๊ฒฐ๋œ ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ
      • ๊ฒฐ์ œ ์ •๋ณด๋‚˜ ๋ฐฐ์†ก ์ •๋ณด์ฒ˜๋Ÿผ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ด๋ฃฐ ๋•Œ ์œ ์šฉ
    • ๋‹จ๊ณ„๋ณ„ ์ž…๋ ฅ์ด ํ•„์š”ํ•  ๋•Œ
      • Wizard Form๊ณผ ๊ฐ™์ด ์Šคํ…๋ณ„๋กœ ๋™์ž‘ํ•˜๋Š” ๋ณต์žกํ•œ ํผ์˜ ๊ฒฝ์šฐ
      • ํšŒ์›๊ฐ€์ž…์ด๋‚˜ ์„ค๋ฌธ์กฐ์‚ฌ์ฒ˜๋Ÿผ ์ด์ „ ๋‹จ๊ณ„์˜ ์ž…๋ ฅ๊ฐ’์ด ๋‹ค์Œ ๋‹จ๊ณ„์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ
    • ํ•„๋“œ ๊ฐ„ ์˜์กด์„ฑ์ด ์žˆ์„ ๋•Œ
      • ์—ฌ๋Ÿฌ ํ•„๋“œ๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ
      • ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ์ด๋‚˜ ์ด์•ก ๊ณ„์‚ฐ์ฒ˜๋Ÿผ ํ•„๋“œ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

4. ๊ฒฐํ•ฉ๋„

A. ์ฑ…์ž„์„ ํ•˜๋‚˜์”ฉ ๊ด€๋ฆฌํ•˜๊ธฐ

  • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, ์ƒํƒœ, API ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ๋กœ์ง์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ, Hook์„ ๋‚˜๋ˆ„์ง€ ๋ง ๊ฒƒ

B. ์ค‘๋ณต ์ฝ”๋“œ ํ—ˆ์šฉํ•˜๊ธฐ

  • ๋‹ค์†Œ ๋ฐ˜๋ณต๋˜์–ด ๋ณด์ด๋Š” ์ฝ”๋“œ์ผ์ง€ ๋ชฐ๋ผ๋„, ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉํ–ฅ์ผ ์ˆ˜ ์žˆ๋‹ค.

C. Props Drilling ์ง€์šฐ๊ธฐ

  • Props Drilling์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์— ๊ฒฐํ•ฉ๋„๊ฐ€ ์ƒ๊ฒผ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ช…ํ™•ํ•œ ํ‘œ์‹œ์ด๋‹ค.
  • ๋งŒ์•ฝ Drilling๋˜๋Š” ํ”„๋กญ์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ํ”„๋กญ์„ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์กฐํ•ฉ(Composition) ํŒจํ„ด์„ ํ™œ์šฉํ•ด Props Drilling์„ ์ œ๊ฑฐํ•œ๋‹ค.

๊ธฐํƒ€. ๋„์›€๋œ ์ •๋ณด

1. ์†์„ฑ ์ ‘๊ทผ์ž

  • ๊ฐ์ฒด ๋’ค์— [] ๋Œ€๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
function Page() {
  const user = useUser();
  const policy = {
    admin: { canInvite: true, canRead: true },
    viewer: { canInvite: false, canRead: true },
  }[user.role];

  return (
    <div>
      <Button disabled={!policy.canInvite}>Invite</Button>
      <Button disabled={!policy.canRead}>Read</Button>
    </div>
  );
}

2. ์กฐํ•ฉ ํŒจํ„ด

  • ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ์‹
function ItemEditModal({ open, items, recommendedItems, onConfirm, onClose }) {
  const [keyword, setKeyword] = useState("");

  return (
    <Modal open={open} onClose={onClose}>
      <div style={{ display: 'flex', justifyContent: 'space-between' }}>
        <Input
          value={keyword}
          onChange={(e) => onKeywordChange(e.target.value)}
        />
        <Button onClick={onClose}>๋‹ซ๊ธฐ</Button>
      </div>
      <ItemEditList
        keyword={keyword}
        items={items}
        recommendedItems={recommendedItems}
        onConfirm={onConfirm}
      />
    </Modal>
  );
}

 


 

ํ•ด๋‹น ๊ธ€์„ ์ฝ์œผ๋ฉฐ, ํ˜„์žฌ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ์— ์•ˆ์ข‹์€ ์ฝ”๋“œ ์˜ˆ์‹œ๋กœ ๋“  ๊ฒƒ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€์ง€..

Props Drilling์ด๋‚˜ ๋งค์ง๋„˜๋ฒ„ ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ ๊ตฌ์กฐ๋„ ์ฝ”๋”ฉ์„ ํ•˜๋ฉด์„œ ๊ต‰์žฅํžˆ ๋ถˆํŽธํ•˜๋‹ค๊ณ  ๋Š๊ผˆ๋Š”๋ฐ ์ฒœ์ฒœํžˆ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. 

 

๊ธ€์˜ ์–‘์ด ๋งŽ์ง€ ์•Š์•„์„œ ๋‹จ์‹œ๊ฐ„์— ์ฝ์„ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์ด์ œ๋ถ€ํ„ฐ ์ฝ”๋”ฉ์„ ํ•  ๋•Œ ์˜ค๋Š˜ ๋ดค๋Š” ๋‚ด์šฉ๋“ค์„ ๋‘๊ณ ๋‘๊ณ  ์ƒ๊ธฐ์‹œํ‚ค๋ฉด์„œ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค. 

๋ฐ˜์‘ํ˜•