Props

ν•™μŠ΅ ν‚€μ›Œλ“œ

  • Props

    • 순수 ν•¨μˆ˜

    • ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή Distructuring

    • Prop Drilling

Props

πŸ“– Propsλž€?

  • Properties의 μ€„μž„λ§

  • 데이터λ₯Ό μ „λ‹¬ν•΄μ£ΌλŠ” 객체

  • μƒμœ„ μ»΄ν¬λ„ŒνŠΈκ°€ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ— κ°’(= Data)을 전달할 λ•Œ μ‚¬μš©ν•˜λŠ” 속성이닀.

  • λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ „λ‹¬ν•˜λŠ” props μˆ˜μ • κ°€λŠ₯ν•˜μ§€λ§Œ, μžμ‹ μ»΄ν¬λ„ŒνŠΈλŠ” props 읽기만 κ°€λŠ₯ν•˜λ‹€.

λͺ¨λ“  React μ»΄ν¬λ„ŒνŠΈλŠ” μžμ‹ μ˜ propsλ₯Ό λ‹€λ£° λ•Œ λ°˜λ“œμ‹œ 순수 ν•¨μˆ˜μ²˜λŸΌ λ™μž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. by.React κ³΅μ‹λ¬Έμ„œ

순수 ν•¨μˆ˜λž€?

  • 순수 ν•¨μˆ˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ“°μ΄λŠ” κ°œλ…μ΄λ‹€.

  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 값듀이 μ™ΈλΆ€μ˜ 영ν–₯을 주지 μ•Šκ³  μ–΄λ– ν•œ Input을 전달해도 λ˜‘κ°™μ€ μƒνƒœ(νƒ€μž…)둜 output을 λ°˜ν™˜ν•΄μ£ΌλŠ” κΈ°λŠ₯을 ν•˜λŠ” ν•¨μˆ˜ β‡’ μž…λ ₯값에 λŒ€ν•΄ 항상 λ™μΌν•œ 좜λ ₯값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ‘œ, μ™ΈλΆ€μƒνƒœμ— 영ν–₯을 λΌμΉ˜λŠ” μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ μ—†λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€.

// 순수 ν•¨μˆ˜ μ˜ˆμ‹œ 
function add(a, b) {
  return a + b;
}
//  순수 ν•¨μˆ˜ μ•„λ‹Œ μ˜ˆμ‹œ
function withdraw(a, b){
  a.num -= b;
  // μž…λ ₯ 받은 μΈμžμ— λŒ€μž…μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ μž…λ ₯받은 값이 λ³€κ²½ λ˜μ—ˆλ‹€.
}

πŸ€– λ¦¬μ•‘νŠΈλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό propsλ₯Ό λ‹€λ£° λ•Œ 순수 ν•¨μˆ˜μ²˜λŸΌ ꡬ성해야 ν• κΉŒ?

  • 예츑 κ°€λŠ₯μ„± λ™μΌν•œ propsλ₯Ό 전달 ν–ˆμ„ λ•Œ λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— 예츑 κ°€λŠ₯ν•œ λ™μž‘μ„ 보μž₯ ν•  수 μžˆλ‹€.

  • ν…ŒμŠ€νŠΈ μš©μ΄μ„± μž…λ ₯ν•œ 값에 따라 항상 λ™μΌν•œ 좜λ ₯값을 λ°˜ν™˜ν•˜κΈ°μ— Unit Test(λ‹¨μœ„ ν…ŒμŠ€νŠΈ)ν•˜κΈ°κ°€ 쉽닀.

  • μ„±λŠ₯ μ΅œμ ν™” μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 전달 받은 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ propsλŠ” 읽기 μ „μš©μ΄λ―€λ‘œ λ³€κ²½ ν•  수 μ—†λ‹€. propsκ°€ λ³€κ²½λ˜μ§€ μ•Šμ€ 경우 λ Œλ”λ§μ„ κ±΄λ„ˆλ›Έ 수 μžˆμœΌλ―€λ‘œ μ„±λŠ₯을 μ΅œμ ν™” ν•  수 μžˆλ‹€.

  • μœ μ§€λ³΄μˆ˜μ„± λΆ€μž‘μš©μ΄ μ—†λŠ” μˆœμˆ˜ν•¨μˆ˜λŠ” μ½”λ“œμ˜ μ˜λ„λ₯Ό λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ ν•  수 μžˆμ–΄ μœ μ§€λ³΄μˆ˜κ°€ 쉽닀.

β‡’ μ»΄ν¬λ„ŒνŠΈκ°€ 순수 ν•¨μˆ˜λ‘œ μž‘μ„±λ˜λ©΄, μƒνƒœλ³€ν™”λ₯Ό μΆ”μ ν•˜κΈ° 쉽고, μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ 쀄일 수 μžˆλ‹€. λ”°λΌμ„œ λ¦¬μ•‘νŠΈμ—μ„œλŠ” 순수 ν•¨μˆ˜λ₯Ό 기반으둜 ν•˜λŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ₯Ό ꢌμž₯ν•˜κ³  μžˆλ‹€.

πŸ€– ReactλŠ” Propsλ₯Ό Date Destructuring을 톡해 μ‚¬μš©ν•˜κΈ°λ₯Ό ꢌμž₯ν•˜κ³  μžˆλ‹€

// μƒμœ„ μ»΄ν¬λ„ŒνŠΈ 
const App = () => {
  return (
    <>
      <PropsNotSeparated name="홍길동" age={30} />
      <PropsSeparated name="홍길동" age={30} />
    </>
  );
};

// ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈ 
function PropsNotSeparated(props){
  return (
    <p>{props.name}</p>
    <p>{props.age}</p>
  );
}

function PropsSeparated({name,age}){
  return (
    <p>{name}</p>
    <p>{age}</p>
  );
}
  • Data destructuring(ꡬ쑰뢄해할당)을 톡해 전달받은 props의 λ‚΄μš©λ“€μ„ 직관적이고 가독성 쒋은 μ½”λ“œκ°€ 될 수 있고, ν•˜λ‚˜κ°€ μ•„λ‹Œ μ—¬λŸ¬ propsλ₯Ό 전달 λ°›λŠ” 경우 효과적으둜 ν™œμš© ν•  수 μžˆλ‹€.

πŸ€” Prop Drilling μ΄λž€?

PropsλŠ” μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•˜μœ„μ»΄ν¬λ„ŒνŠΈλ‘œ 데이터λ₯Ό μ „λ‹¬ν•˜κ³  전달 받은 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλŠ” props 값을 λ³€κ²½ ν•  수 없기에 λ°μ΄ν„°λŠ” 단방ν–₯ 흐름을 κ°€μ§€κ²Œ λœλ‹€. Prop Driling은 Propsλ₯Ό 톡해 데이터λ₯Ό μ „λ‹¬ν•˜λŠ” κ³Όμ •μ—μ„œ 쀑간 μ»΄ν¬λ„ŒνŠΈλŠ” 데이터가 ν•„μš”ν•˜μ§€ μ•ŠμŒμ—λ„ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— 데이터 μ „λ‹¬ν•˜κΈ° μœ„ν•΄ propsλ₯Ό 전달해야 ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€.

Prop Drilling 문제점

μ»΄ν¬λ„ŒνŠΈμ˜ 계측ꡬ쑰가 λ³΅μž‘ν•΄μ§€κ³  λ§Žμ•„μ§€κ²Œ λ˜λŠ” 경우 props둜 데이터λ₯Ό 전달 λ°›κ²Œ λœλ‹€λ©΄ λΉ„νš¨μœ¨μ μΈ ν˜„μƒλ“€μ΄ λ°œμƒν•˜κ²Œ λœλ‹€.

  • μ‚¬μš©ν•˜μ§€λ„ μ•ŠλŠ” props μ „λ‹¬λ‘œ 인해 μ½”λ“œκ°€ 길어짐

  • props의 이름이 λ³€κ²½ λœλ‹€λ©΄

Prop Drilling ν•΄κ²° 방법

  • μ „μ—­ μƒνƒœκ΄€λ¦¬ 라이브러리 μ‚¬μš©

    • redux, Mobx, recoil 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ 값이 ν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈμ— 직접 λΆˆλŸ¬μ„œ μ‚¬μš©

  • Children을 적극적으둜 μ‚¬μš©

✍🏻 Props 정리

  • μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ— 값을(데이터)λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•œ 속성이며, 데이터 μ „λ‹¬ν•˜κΈ° μœ„ν•œ 객체이닀.

  • ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλŠ” 전달받은 props 값을 λ³€κ²½ ν•  수 μ—†μœΌλ©°, ꡬ쑰뢄해할당을 톡해 props 객체λ₯Ό λ°›μ•„ μ‚¬μš©ν•œλ‹€.

  • μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλ‘œ propsλ₯Ό μ „λ‹¬ν•˜κ³ , 전달 받은 props 값을 λ³€κ²½ ν•  수 μ—†μ–΄ 단방ν–₯ 흐름을 κ°–κ²Œ 되며, μ»΄ν¬λ„ŒνŠΈμ˜ 계측ꡬ쑰가 λ³΅μž‘ν•΄μ§€κ³  λ§Žμ•„μ§€κ²Œ λœλ‹€λ©΄ props둜 데이터λ₯Ό μ „λ‹¬λ°›λŠ” κ³Όμ •μ—μ„œ λΉ„νš¨μœ¨μ μΈ ν˜„μƒλ“€μ΄ λ°œμƒν•˜κ²Œ λœλ‹€. Prop Drilling

πŸ”— μ°Έκ³ 

Last updated