Props

1. κ°œμš”

λ¦¬μ•‘νŠΈ Appλ₯Ό κ°œλ°œν•˜λŠ” 것을 뢕어빡을 λ§Œλ“œλŠ” 것과 λΉ„κ΅ν–ˆμ„ λ•Œ λΆ•μ–΄λΉ΅ 틀은 μ»΄ν¬λ„ŒνŠΈ, λΆ•μ–΄λΉ΅ 속 μž¬λ£ŒλŠ” props, μ™„μ„±λœ 뢕어빡은 λ¦¬μ•‘νŠΈ μ•¨λ¦¬λ¨ΌνŠΈκ°€ λœλ‹€.

이쀑 props에 따라 같은 μ»΄ν¬λ„ŒνŠΈλΌ 해도 λͺ¨λ‘ λ‹€λ₯Έ λ‚΄μš©μ΄ λ“€μ–΄κ°„ λ¦¬μ•‘νŠΈ μ•¨λ¦¬λ¨ΌνŠΈλ₯Ό λ§Œλ“€ 수 μžˆλ‹€. ν•˜μ§€λ§Œ 같은 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 전체적은 틀은 κ°™λ‹€.

이처럼 propsλŠ” 같은 λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λˆˆμ— λ³΄μ΄λŠ” κΈ€μžλ‚˜ 색깔 λ“±μ˜ 속성을 λ°”κΎΈκ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ 속 재료라고 μƒκ°ν•˜λ©΄ λœλ‹€.


2. propsλŠ” 읽기 μ „μš©

All React components must act like pure functions with respect to their props.

λ¦¬μ•‘νŠΈ 곡식 λ¬Έμ„œλŠ” μœ„μ™€ 같이 props의 성격을 μ„€λͺ…ν•˜κ³  μžˆλ‹€. κ³΅μ‹λ¬Έμ„œμ—λŠ” pure functionsμ΄λΌλŠ” ν•¨μˆ˜κ°€ λ‚˜μ˜€λŠ”λ° κ·Έλ ‡λ‹€λ©΄ pure functionsμ΄λΌλŠ” 것은 λ¬΄μ—‡μΌκΉŒ?

μ•„λž˜μ˜ ν•¨μˆ˜λ₯Ό 보자

function sum(a, b) {
  return a + b;
}

μœ„μ˜ ν•¨μˆ˜ sum의 인자 a,b의 값을 λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄, 같은 μž…λ ₯값에 λŒ€ν•΄μ„œλŠ” 항상 같은 좜λ ₯값을 λ‚Έλ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜λ₯Ό Pureν•˜λ‹€κ³  ν•œλ‹€.

λ°˜λŒ€λ‘œ Pure의 λ°˜λŒ€μΈ Impureν•œ ν•¨μˆ˜μ˜ 예λ₯Ό μ‚΄νŽ΄λ³΄μž

function widthdraw(account, amount) {
  account.total -= amount;
}

μœ„μ˜ ν•¨μˆ˜κ°€ 싀행이 되면 μžμ‹ μ˜ μž…λ ₯값을 λ³€κ²½ν•˜κΈ° λ•Œλ¬Έμ— μˆœμˆ˜ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜κ°€ λœλ‹€.

μˆœμˆ˜ν•¨μˆ˜μ™€ μˆœμˆ˜ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ΄€λ‹€. λ‹€μ‹œ μ •λ¦¬ν•˜μžλ©΄

λͺ¨λ“  λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈλŠ” propsλ₯Ό 직접 λ°”κΏ€ 수 μ—†κ³ (읽기 μ „μš©), 같은 props에 λŒ€ν•΄μ„œλŠ” 항상 같은 κ²°κ³Ό(λ¦¬μ•‘νŠΈ μ•¨λ¦¬λ¨ΌνŠΈ)λ₯Ό 보여쀀닀.


3. props의 κΈ°λ³Έ μ‚¬μš©λ²•

Parents μ»΄ν¬λ„ŒνŠΈμ—μ„œ Child μ»΄ν¬λ„ŒνŠΈλ‘œ nameμ΄λΌλŠ” 값을 μ „λ‹¬ν•˜κ³ μž ν•˜λŠ” 상황을 κ°€μ •ν•˜μž. κ·Έλ ‡λ‹€λ©΄ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

Child.js 같이 Child μ»΄ν¬λ„ŒνŠΈμ—κ²Œ μ „λ‹¬λ˜λŠ” propsλŠ” νŒŒλΌλ―Έν„°λ₯Ό ν†΅ν•˜μ—¬ μ‘°νšŒν•  수 μžˆλ‹€. propsλŠ” 객체 ν˜•νƒœλ‘œ 전될닀며, λ§Œμ•½ name값을 μ‘°νšŒν•˜κ³  μ‹Άλ‹€λ©΄ props.name을 μ‘°νšŒν•˜λ©΄ λœλ‹€.


4. μ—¬λ €κ°œμ˜ props와 ꡬ쑰뢄해 ν• λ‹Ή

Parents μ»΄ν¬λ„ŒνŠΈμ—μ„œ nameκ°’ 뿐 μ•„λ‹ˆλΌ age, region을 Child μ»΄ν¬λ„ŒνŠΈμ— λ„˜κ²¨μ£ΌλŠ” 상황을 κ°€μ •ν•΄λ³΄μž. 뿐만 μ•„λ‹ˆλΌ 객체 ν˜•νƒœλ‘œ μ „λ‹¬λ˜λŠ” propsλ₯Ό ES6에 λ“±μž₯ν•œ ꡬ쑰뢄해(비ꡬ쑰화) ν• λ‹Ή ν‘œν˜„μ‹μ„ μ‚¬μš©ν•΄λ³΄μž.

props의 κΈ°λ³Έ μ‚¬μš©λ²•μ™€ λ‹€λ₯΄κ²Œ Child μ»΄ν¬λ„ŒνŠΈμ˜ νŒŒλΌλ―Έν„°μ—μ„œ ꡬ쑰뢄해 ν• λ‹Ή 문법을 톡해 props값듀을 λΆˆλŸ¬μ™”λ‹€. μ΄μ „μ—λŠ” props.λ₯Ό μ‚¬μš©ν•΄ 각각의 값을 λΆˆλŸ¬μ™”μ§€λ§Œ ꡬ쑰뢄해 할당을 톡해 쑰금 더 κ°„κ²°ν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.


5. defaultProps둜 κΈ°λ³Έκ°’ μ„€μ •

λ§Œμ•½ 전달 받은 props값이 μ—†μœΌλ©΄ μ–΄λ–‘ν• κΉŒ? μ΄λŸ΄λ•ŒλŠ” 쑰건뢀 λžœλ”λ§μ„ 톡해 값을 μ„€μ •ν•  수 있고 defaultPropsλ₯Ό μ΄μš©ν•΄ 기본값을 μ„€μ •ν•  수 μžˆλ‹€. 쑰건뢀 λžœλ”λ§μ€ λ‹€λ₯Έ μ±•ν„°μ—μ„œ μžμ„Ένžˆ 닀루고 이번 μ±•ν„°μ—μ„œλŠ” defaultPropsλ₯Ό μ‚¬μš©ν•΄ 보자.

μ•„λž˜μ˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

Parents.jsμ—μ„œ λ‘κ°œμ˜ Child μ»΄ν¬λ„ŒνŠΈλ₯Ό ν˜ΈμΆœν•˜κ³  μžˆλ‹€. ν•˜μ§€λ§Œ ν•˜λ‚˜λŠ” name값이 있고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” 값이 μ—†λ‹€.

name값이 μ—†λŠ” 경우 Child.jsμ—μ„œλŠ” Child.defaultPropsλ₯Ό μ‚¬μš©ν•΄ name의 기본값을 μ§€μ •ν•œλ‹€. μ•„λž˜λŠ” μœ„ μ½”λ“œμ˜ 결과이닀.

defaultProps

6. props.children

μ»΄ν¬λ„ŒνŠΈ νƒœκ·Έ 사이에 λ„£κ³  싢은 μ•¨λ¦¬λ¨ΌνŠΈ λ˜λŠ” λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό μΆ”κ°€ν•˜κ³  싢을 땐 props.children을 μ‚¬μš©ν•˜λ©΄ λœλ‹€. ꡬ쑰뢄해 ν• λ‹ΉμœΌλ‘œ κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•΄λ„ μ’‹λ‹€.

μ»¨νƒ μΈ μ˜ λ‚΄μš©μ΄ λ‹΄κΈ΄ Content μ»΄ν¬λ„ŒνŠΈκ°€ Wrapper μ»΄ν¬λ„ŒνŠΈλ‘œ 감싸져 μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž. κ·Έλ ‡λ‹€λ©΄ μ½”λ“œλŠ” μ•„λž˜μ™€ 같을 것이닀.

children

μœ„μ˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž. Content μ»΄ν¬λ„ŒνŠΈκ°€ Wrapper μ»΄ν¬λ„ŒνŠΈλ‘œ κ°μ‹Έμ—¬μžˆλ‹€. Content μ»΄ν¬λ„ŒνŠΈμ˜ Wrapper μ»΄ν¬λ„ŒνŠΈ μ‚¬μ΄μ—λŠ” <h2>Content μ»΄ν¬λ„ŒνŠΈ μž…λ‹ˆλ‹€.</h2>의 μ•¨λ¦¬λ¨ΌνŠΈκ°€ μžˆμ§€λ§Œ ν™”λ©΄μ—λŠ” λ‚˜νƒ€λ‚˜μ§€ μ•Šμ•˜λ‹€.

μ™œ 그럴까? κ·Έ μ΄μœ λŠ” <h2>Content μ»΄ν¬λ„ŒνŠΈ μž…λ‹ˆλ‹€.</h2>도 ν•˜λ‚˜μ˜ props인데 Wrapper μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•΄λ‹Ή propsλ₯Ό 어디에 넣을지 μ •μ˜ν•˜μ§€ μ•Šμ•„μ„œμ΄λ‹€. μ΄λ•Œ ν•„μš”ν•œ 것이 λ°”λ‘œ props.children이닀.

λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μž.

children2

μ΄λ²ˆμ—λŠ” μ„±κ³΅μ μœΌλ‘œ <h2>Content μ»΄ν¬λ„ŒνŠΈ μž…λ‹ˆλ‹€.</h2>의 λ‚΄μš©μ΄ 좜λ ₯λ˜μ—ˆλ‹€. λ‹€λ₯Έμ μ€ μ°Ύμ•„λ³΄μž.

Wrapper μ»΄ν¬λ„ŒνŠΈμ˜ propsλ₯Ό ꡬ쑰뢄해 할당을 ν•˜μ—¬ children값을 κ°€μ Έμ™”λ‹€. 그리고 <h1>Wrapper μ»΄ν¬λ„ŒνŠΈ μž…λ‹ˆλ‹€.</h1>μ•„λž˜μ— childrenλ₯Ό λ„£μ–΄μ£Όμ—ˆλ‹€. κ·Έλž˜μ„œ Content μ»΄ν¬λ„ŒνŠΈμ˜ <h2>Content μ»΄ν¬λ„ŒνŠΈ μž…λ‹ˆλ‹€.</h2>이 λ°”λ‘œ μ•„λž˜μ— μœ„μΉ˜ν•˜κ²Œ λœλ‹€.

Wrapper.jsμ—μ„œ μ½˜μ†”λ‘œ childrenλ₯Ό μ°μ–΄λ³΄μž 그러면 μ•„λž˜μ™€ 같은 객체을 λ³Ό 수 μžˆλ‹€.

children3

childrenμ—λŠ” Content μ»΄ν¬λ„ŒνŠΈμ—μ„œ μž‘μ„±λœ λ¦¬μ•‘νŠΈ μ•¨λ¦¬λ¨ΌνŠΈκ°€ 객체 ν˜•νƒœλ‘œ μ‘΄μž¬ν•˜κ³  μžˆμŒμ„ 확인할 수 μžˆλ‹€.

μ£Όμ˜ν•  점은 props.children이 μ•„λ‹Œ λ‹€λ₯Έ μž„μ˜μ˜ μ΄λ¦„μœΌλ‘œ μ„ μ–Έν•˜λ©΄ μ›ν•˜λŠ” 결과물을 얻을 수 μ—†λ‹€.


7. Conclusion

props에 λŒ€ν•΄ κ³΅λΆ€ν•˜λ©΄μ„œ μˆœμˆ˜ν•¨μˆ˜λΌλŠ” κ°œλ…λ„ ν•¨κ»˜ λ°°μ› λ‹€. props값이 λ³€ν™”ν•˜μ§€ μ•ŠλŠ” λ‹€λŠ” 것을 μ—¬λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μ•Œκ³  μžˆμ—ˆμ§€λ§Œ 이런 κ°œλ…μ΄ μˆœμˆ˜ν•¨μˆ˜μ™€ 연관이 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€. 그리고 λ„˜κ²¨λ°›λŠ” props의 값이 μ—†λ‹€λ©΄ λ‚˜λŠ” μ§€κΈˆκΉŒμ§€ 쑰건뢀 λžœλ”λ§μ„ 톡해 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€. ν•˜μ§€λ§Œ λ‹€λ₯Έ 방법인 defaultProps에 λŒ€ν•΄ μ•Œκ²Œ λ˜μ—ˆκ³  ν•œ 번쯀 μ‚¬μš©ν•΄μ„œ λ¦¬μ•‘νŠΈμ— λŒ€ν•œ 지식을 λ„“ν˜€μ•Ό κ² λ‹€. 사싀 typescriptλ₯Ό λ¦¬μ•‘νŠΈμ— λ„μž…ν•œλ‹€λ©΄ 훨씬 쒋은 방법이 μžˆμ§€λ§Œ... μ—­μ‹œλ‚˜ typescriptλ₯Ό λ°°μš΄μ§€ μ–Όλ§ˆ μ•ˆλ˜μ—ˆκ³  κ·Έ λ˜ν•œ 기둝을 남기지 μ•Šμ•„ 기얡은 λ‚˜μ§€ μ•ŠλŠ”λ‹€...γ…Žγ…Ž props.childrenλ₯Ό μ½˜μ†”λ‘œ 처음 μ°μ–΄λ³΄λŠ” 것도 μž¬λ―Έμžˆμ—ˆλ‹€! κ·Έ μ•ˆμ— λ‚΄μš©μΈ λ¦¬μ•‘νŠΈ μ•¨λ¦¬λ¨ΌνŠΈλΌ μ‹ κΈ°ν•˜λ‹€~ typescript도 정리λ₯Ό μž˜ν•˜μžπŸ˜€


μ°Έκ³ 

λ„μ„œ - μ†Œν”Œμ˜ 처음 λ§Œλ‚œ λ¦¬μ•‘νŠΈ λ¦¬μ•‘νŠΈ κ³΅μ‹λ¬Έμ„œ Components와 Props 5. props λ₯Ό 톡해 μ»΄ν¬λ„ŒνŠΈμ—κ²Œ κ°’ μ „λ‹¬ν•˜κΈ°


πŸ“… 2022-07-22

Last updated