Life Cycle

μœ€ν•œμ˜Β·2023λ…„ 9μ›” 10일
0

κ³΅λΆ€μŠ¬κΈˆμŠ¬κΈˆ

λͺ©λ‘ 보기
2/7

🐣 혼자 κ³΅λΆ€ν•˜λŠ” μš©λ„λ‘œ λΈ”λ‘œκ·Έλ₯Ό λ³΄λ©΄μ„œ μž‘μ„±ν•œ 거라 λ‚΄μš©μ΄ μƒλ‹Ήμƒλ‹Ήνžˆ λΉ„μŠ·ν•©λ‹ˆλ‹€. ν˜Ήμ‹œλ‚˜ 보게 될 μ‚¬λžŒμ΄ μžˆμœΌμ‹œλ‹€λ©΄ μ°Έκ³  λ°”λžλ‹ˆλ‹€!


Life Cycle in React


μ»΄ν¬λ„ŒνŠΈ 초기 생성

μ»΄ν¬λ„ŒνŠΈκ°€ λΈŒλΌμš°μ €μ— λ‚˜νƒ€λ‚˜κΈ° μ „, 후에 ν˜ΈμΆœλ˜λŠ” API

1. constructor

constructor(props) {
  super(props);

μ»΄ν¬λ„ŒνŠΈ μƒμ„±μž ν•¨μˆ˜, μ»΄ν¬λ„ŒνŠΈκ°€ μƒˆλ‘œ λ§Œλ“€μ–΄μ§ˆ λ•Œλ§ˆλ‹€ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ΄λ‹€.


2. componentWillMount

componentWillMoumt() {
  
}

이 API λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ 화면에 λ‚˜κ°€κΈ° 직전에 ν˜ΈμΆœλ˜λŠ” API,주둜 λΈŒλΌμš°μ €κ°€ μ•„λ‹Œ ν™˜κ²½μ—μ„œλ„ (μ„œλ²„μ‚¬μ΄λ“œ) ν˜ΈμΆœν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©ν–ˆμ—ˆλŠ”λ°, v16.3 μ—μ„œλŠ” ν•΄λ‹Ή API κ°€ deprecated λ˜μ—ˆλ‹€. κ·Έλƒ₯ μžˆμ—ˆκ΅¬λ‚˜~ v16.3 μ΄ν›„λΆ€ν„°λŠ” UNSAFE_componentWillMount() λΌλŠ” μ΄λ¦„μœΌλ‘œ μ‚¬μš©λœλ‹€.


3. componentDidMount

componentDidMount() {
  // μ™ΈλΆ€ 라이브러리 연동: D3, masonry, etc...
  // μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μš”ν•œ 데이터 μš”μ²­: Ajax, GraphQL, etc...
  // DOM 에 κ΄€λ ¨λœ μž‘μ—…: 슀크둀 μ„€μ •, 크기 μ½μ–΄μ˜€κΈ° λ“±...
}

이 API λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ 화면에 λ‚˜νƒ€λ‚˜κ²Œ 됐을 λ•Œ ν˜ΈμΆœλœλ‹€. 주둜 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μš”λ‘œν•˜λŠ” 데이터λ₯Ό μš”μ²­ν•˜κΈ° μœ„ν•΄μ„œ axios, fetch 등을 ν†΅ν•˜μ—¬ ajax μš”μ²­μ„ ν•˜κ±°λ‚˜, DOM 의 속성을 μ½κ±°λ‚˜ 직접 λ³€κ²½ν•˜λŠ” μž‘μ—…μ„ ν•œλ‹€.




μ»΄ν¬λ„ŒνŠΈ μ—…λ°μ΄νŠΈ

μ»΄ν¬λ„ŒνŠΈ μ—…λ°μ΄νŠΈλŠ” props λ³€ν™”, state 의 변화에 따라 κ²°μ •λœλ‹€. μ—…λ°μ΄νŠΈκ°€ 되기 μ „κ³Ό 된 후에 ν˜ΈμΆœλ˜λŠ” API

1. componentWillReceiveProps

componentWillReceiveProps(nextProps) {
  // this.props λŠ” 아직 λ°”λ€Œμ§€ μ•Šμ€ μƒνƒœ
}

이 API λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ μƒˆλ‘œμš΄ props λ₯Ό λ°›κ²Œλμ„ λ•Œ ν˜ΈμΆœλœλ‹€. 주둜 state κ°€ props 에 따라 λ³€ν•΄μ•Ό ν•˜λŠ” λ‘œμ§μ„ μž‘μ„±ν•œλ‹€. μƒˆλ‘œ λ°›κ²Œ 될 props λŠ” nextProps 둜 μ‘°νšŒν•  수 있으며, this.props λŠ” μ—…λ°μ΄νŠΈ 되기 μ „μ˜ props, v16.3λΆ€ν„° deprecate λ˜μ–΄, UNSAFE_componentWillReceiveProps() 둜 μ‚¬μš©λ„λœλ‹€.


2. [NEW] static getDerivedStateFromProps()

static getDerivedStateFromProps(nextProps, prevState) {
  // μ—¬κΈ°μ„œλŠ” setState λ₯Ό ν•˜λŠ” 것이 μ•„λ‹ˆλΌ
  // νŠΉμ • props κ°€ λ°”λ€” λ•Œ μ„€μ •ν•˜κ³ , μ„€μ •ν•˜κ³  싢은 state 값을 λ¦¬ν„΄ν•˜λŠ” ν˜•νƒœλ‘œ μ‚¬μš©
  
  /*
  if (nextProps.value !== prevState.value) {
    return { value: nextProps.value };
  }
  return null; // null 을 λ¦¬ν„΄ν•˜λ©΄ λ”°λ‘œ μ—…λ°μ΄νŠΈ ν•  것은 μ—†λ‹€λΌλŠ” 의미
  /*
}

v16.3 이후에 λ§Œλ“€μ–΄μ§„ 라이프사이클 API이닀. props둜 λ°›μ•„μ˜¨ 값을 state둜 λ™κΈ°ν™”ν•˜λŠ” μž‘μ—…μ„ ν•΄μ€˜μ•Ό ν•˜λŠ” κ²½μš°μ— μ‚¬μš©λœλ‹€.


3. shouldComponentUpdate

shouldComponentUpdate(nextProps, nextState) {
  // return false ν•˜λ©΄ μ—…λ°μ΄νŠΈ μ•ˆ 함
  // return this.props.checked !== nextProps.checked
  return true;
}

이 API λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μ΅œμ ν™”ν•˜λŠ” μž‘μ—…μ—μ„œ 맀우 μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€!!! λ¦¬μ•‘νŠΈμ—μ„œλŠ” λ³€ν™”κ°€ λ°œμƒν•˜λŠ” λΆ€λΆ„λ§Œ μ—…λ°μ΄νŠΈλ₯Ό ν•΄μ€˜μ„œ μ„±λŠ₯이 κ½€ 잘 λ‚˜μ˜€λŠ”λ° λ³€ν™”κ°€ λ°œμƒν•œ λΆ€λΆ„λ§Œ 감지해 λ‚΄κΈ° μœ„ν•΄μ„œλŠ” Virtual DOM 에 ν•œ 번 κ·Έλ €μ€˜μ•Ό ν•œλ‹€.

즉, ν˜„μž¬ μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœκ°€ μ—…λ°μ΄νŠΈλ˜μ§€ μ•Šμ•„λ„, λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§λ˜λ©΄, μžμ‹ μ»΄ν¬λ„ŒνŠΈλ“€λ„ λ Œλ”λ§ λœλ‹€.

쓸데없이 λ‚­λΉ„λ˜κ³  μžˆλŠ” CPU μ²˜λ¦¬λŸ‰μ„ 쀄여주기 μœ„ν•΄μ„œ shouldComponentUpdate λ₯Ό μ‚¬μš©ν•œλ‹€.

이 ν•¨μˆ˜λŠ” 기본적으둜 true λ₯Ό λ°˜ν™˜ν•œλ‹€. 쑰건에 따라 false λ₯Ό λ¦¬ν„΄ν•΄μ„œ ν•΄λ‹Ή μ‘°κ±΄μ—λŠ” render ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šμ•„ 화면을 λ¦¬λ Œλ”λ§ν•˜λŠ” λ‚­λΉ„λ₯Ό 쀄여 CPU μ²˜λ¦¬λŸ‰μ„ 쀄일 수 μžˆλ‹€..


4. componentWillUpdate

componentWillUpdate(nextProps, nextState) {
  // μ• λ‹ˆλ§€μ΄μ…˜ 효과λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ±°λ‚˜
  // 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ—†μ• λŠ” μž‘μ—…μ„ ν•œλ‹€.
}

이 API λŠ” shouldComponentUpdate μ—μ„œ trueλ₯Ό λ°˜ν™˜ν–ˆμ„ λ•Œλ§Œ ν˜ΈμΆœλœλ‹€. v16.3 이후 deprecate λ˜μ–΄μ„œ 기쑴의 κΈ°λŠ₯은 getSnapshotBeforeUpdate 둜 λŒ€μ²΄λ  수 μžˆλ‹€.

5. [NEW] getSnapshotBeforeUpdate()

이 API κ°€ λ°œμƒν•˜λŠ” μ‹œμ μ€

이 API λ₯Ό ν†΅ν•΄μ„œ, DOM λ³€ν™”κ°€ μΌμ–΄λ‚˜κΈ° μ§μ „μ˜ DOM μƒνƒœλ₯Ό κ°€μ Έμ˜€κ³ , μ—¬κΈ°μ„œ λ¦¬ν„΄ν•˜λŠ” 값은 componentDidUpdate μ—μ„œ 3번째 νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„μ˜¬ 수 μžˆλ‹€.

getSnapshotBeforeUpdate(prevProps, prevState) {
  // DOM μ—…λ°μ΄νŠΈκ°€ μΌμ–΄λ‚˜κΈ° μ§μ „μ˜ μ‹œμ μ΄λ‹€.
  
  // μ—¬κΈ°μ„œ return ν•˜λŠ” 값은 componentDidMount μ—μ„œ snapshot κ°’μœΌλ‘œ λ°›μ•„μ˜¬ 수 μžˆλ‹€.
  return ;
}

6. componentDidUpdate

componentDidUpdate(prevProps, prevState, snapshot) {
  
}

이 API λŠ” μ»΄ν¬λ„ŒνŠΈμ—μ„œ render() λ₯Ό ν˜ΈμΆœν•˜κ³  λ‚œ λ‹€μŒμ— ν˜ΈμΆœλœλ‹€. 이 μ‹œμ μ—μ„œλŠ” this.props 와 this.state κ°€ λ°”λ€Œμ–΄μžˆλ‹€. 그리고 prevProps, prevState λ₯Ό μ‘°νšŒν•  수 μžˆλ‹€. 그리고 getSnapshotBeforeUpdate μ—μ„œ λ°˜ν™˜ν•œ snapshot 값을 λ°›μ•„μ˜¨λ‹€.




μ»΄ν¬λ„ŒνŠΈ 제거

μ»΄ν¬λ„ŒνŠΈκ°€ 더 이상 ν•„μš”ν•˜μ§€ μ•Šκ²Œ 되면 단 ν•˜λ‚˜μ˜ APIκ°€ ν˜ΈμΆœλœλ‹€.

1. componentWillUnmount

componentWillUnmount() {
  // 이벀트, setTimeout, μ™ΈλΆ€ 라이브러리 μΈμŠ€ν„΄μŠ€ 제거
}

이 API μ—μ„œλŠ”, 주둜 λ“±λ‘ν–ˆμ—ˆλ˜ 이벀트λ₯Ό μ œκ±°ν•˜κ³ , λ§Œμ•½ setTimeout 을 κ±Έμ—ˆλ‹€λ©΄ clearTimeout 을 ν†΅ν•˜μ—¬ 제거λ₯Ό ν•œλ‹€.

μΆ”κ°€μ μœΌλ‘œ, μ™ΈλΆ€ 라이브러리λ₯Ό μ‚¬μš©ν–ˆκ±°λ‚˜ ν•΄λ‹Ή λΌμ΄λΈŒλŸ¬λ¦¬μ— dispose κΈ°λŠ₯이 μžˆλ‹€λ©΄ μ—¬κΈ°μ„œ ν˜ΈμΆœν•˜λ©΄ λœλ‹€.




μ»΄ν¬λ„ŒνŠΈμ— μ—λŸ¬ λ°œμƒ

render ν•¨μˆ˜μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€λ©΄, λ¦¬μ•‘νŠΈ 엑이 ν¬λž˜μ‰¬ λ˜μ–΄λ²„λ¦°λ‹€(===앱이 예기치 μ•Šμ€ 였λ₯˜ λ˜λŠ” μ˜ˆμ™Έλ‘œ λ™μž‘μ„ λ©ˆμΆ”κ³  μž‘λ™ν•˜μ§€ μ•ŠλŠ” μƒνƒœκ°€ λœλ‹€)

일반적으둜 λ Œλ”λ§ λΆ€λΆ„μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것은 사전에 λ°©μ§€ν•΄μ•Όν•œλ‹€. 주둜 μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” μ΄μœ λŠ”

  1. μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ €κ³  ν•  λ•Œ(ex/ props둜 λ°›μ•˜μ„ 쀄 μ•Œμ•˜λ˜ ν•¨μˆ˜κ°€ μ „λ‹¬λ˜μ§€ μ•Šμ•˜μ„ λ•Œ)
this.props.onClick();
  1. λ°°μ—΄μ΄λ‚˜ 객체가 올 쀄 μ•Œμ•˜λŠ”λ°, μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ
this.props.object.value; // object is undefined
this.props.array.length; // array is undefined

μ΄λŸ¬ν•œ 것듀은 render ν•¨μˆ˜μ—μ„œ 막아 쀄 수 μžˆλ‹€!!!

render() {
  if (!this.props.object || !this.props.array || this.props.array.length === 0) return null;
  // object λ‚˜ array λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œ
}
    

1. componentDidCatch

componentDidCatch(error, info) {
  this.setState({
    error: true
  });
}

μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ 되면 μ΄λ ‡κ²Œ componentDidCatch κ°€ μ‹€ν–‰ν•˜κ³ , state.error λ₯Ό true 둜 μ„€μ •ν•˜κ³  render ν•¨μˆ˜μͺ½μ—μ„œ 이에 따라 μ—λŸ¬λ₯Ό λ„μ›Œμ£Όλ©΄ λœλ‹€.

μ£Όμ˜ν•  점은, μ»΄ν¬λ„ŒνŠΈ μžμ‹ μ˜ render ν•¨μˆ˜μ—μ„œμ˜ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 것은 μž‘μ•„λ‚Ό 수 μ—†μ§€λ§Œ λŒ€μ‹ μ— μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ λ°œμƒν•˜λŠ” μ—λŸ¬λ“€μ€ μž‘μ„ 수 μžˆλ‹€.

componentDidCatch API λ₯Ό μ‚¬μš©ν•˜λ©΄ render λΆ€λΆ„μ—μ„œ λ°œμƒν•˜λŠ” 였λ₯˜λ‘œ 앱이 μ’…λ£Œλ  λ•Œ 빈 νŽ˜μ΄μ§€λ₯Ό 좜λ ₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€λŠ” 문ꡬλ₯Ό λ„μš°λ©΄μ„œ UXλ₯Ό 높일 수 μžˆλŠ” 것 κ°™λ‹€
-> 이 λΆ€λΆ„μ˜ 좔가적인 μ½”λ“œ μ‹€μŠ΅μ€ React μ„€μ • 마치고 ν•΄λ³΄μž





참고자료

0개의 λŒ“κΈ€