πŸ’» Error Boundaries(feat. λ¦¬μ•‘νŠΈ κ³΅μ‹λ¬Έμ„œ)

waterglassesΒ·2022λ…„ 10μ›” 16일
1

TIL

λͺ©λ‘ 보기
42/50
post-thumbnail

⚠️ μ •λ¦¬ν•œ λ‚΄μš©μ€ μ˜€νƒ€λ‚˜ 잘λͺ»λœ 정보가 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λŒ“κΈ€λ‘œ μ•Œλ €μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ—λŸ¬ κ²½κ³„μ˜ μ†Œκ°œ

UI 일뢀뢄에 μ‘΄μž¬ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ—λŸ¬κ°€ 전체 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ€‘λ‹¨μ‹œμΌœμ„œλŠ” μ•ˆλœλ‹€. React16μ—μ„œ μ—λŸ¬ κ²½κ³„λΌλŠ” μƒˆλ‘œμš΄ κ°œλ…μ΄ λ„μž…λ˜μ—ˆλ‹€.

μ—λŸ¬ κ²½κ³„λŠ” ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈ 트리의 μ–΄λ””μ—μ„œλ“  μžλ°”μŠ€ν¬λ¦½νŠΈ μ—λŸ¬λ₯Ό κΈ°λ‘ν•˜λ©° 깨진 μ»΄ν¬λ„ŒνŠΈ 트리 λŒ€μ‹  폴백 UIλ₯Ό λ³΄μ—¬μ£ΌλŠ” λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈμ΄λ‹€. μ—λŸ¬ κ²½κ³„λŠ” λ Œλ”λ§ 도쀑 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œ 및 κ·Έ μ•„λž˜μ— μžˆλŠ” 전체 νŠΈλ¦¬μ—μ„œ μ—λŸ¬λ₯Ό μž‘μ•„λ‚Έλ‹€.

*μ—λŸ¬ 경계가 ν¬μ°©ν•˜μ§€ μ•ŠλŠ” μ—λŸ¬λ“€

  • 이벀트 ν•Έλ“€λŸ¬
  • 비동기적 μ½”λ“œ
  • μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§
  • μžμ‹μ—μ„œκ°€ μ•„λ‹Œ μ—λŸ¬ 경계 μžμ²΄μ—μ„œ λ°œμƒν•˜λŠ” μ—λŸ¬

클래슀 μ»΄ν¬λ„ŒνŠΈμ— static getDerivedStateFromError() λ˜λŠ” componentDidCatch()λ₯Ό μ •μ˜ν•  경우 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλŠ” Error boundaryκ°€ λœλ‹€.

μ—λŸ¬κ°€ λ°œμƒν•œ 뒀에 폴백 UIλ₯Ό λ Œλ”λ§ν•˜λ €λ©΄Β static getDerivedStateFromError()λ₯Ό μ‚¬μš©ν•œλ‹€. μ—λŸ¬ 정보λ₯Ό κΈ°λ‘ν•˜λ €λ©΄Β componentDidCatch()λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // λ‹€μŒ λ Œλ”λ§μ—μ„œ 폴백 UIκ°€ 보이도둝 μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈ ν•©λ‹ˆλ‹€.
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // μ—λŸ¬ λ¦¬ν¬νŒ… μ„œλΉ„μŠ€μ— μ—λŸ¬λ₯Ό 기둝할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
    logErrorToMyService(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // 폴백 UIλ₯Ό μ»€μŠ€ν…€ν•˜μ—¬ λ Œλ”λ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children;
  }
}

μœ„μ™€ 같이 μ μš©ν•˜κ³  일반 μ»΄ν¬λ„ŒνŠΈλ‘œ μ‚¬μš©ν•œλ‹€.

<ErrorBoundary>
  <MyWidget />
</ErrorBoundary>

μ—λŸ¬ κ²½κ³„λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ catch {} ꡬ문과 μœ μ‚¬ν•˜κ²Œ λ™μž‘ν•˜μ§€λ§Œ μ»΄ν¬λ„ŒνŠΈμ— μ μš©λœλ‹€. 였직 클래슀 μ»΄ν¬λ„ŒνŠΈλ§Œμ΄ μ—λŸ¬ 경계가 될 수 μžˆλ‹€.

μ—λŸ¬ 경계λ₯Ό λ°°μΉ˜ν•  μœ„μΉ˜

μ„œλ²„ μ‚¬μ΄λ“œ ν”„λ ˆμž„μ›Œν¬κ°€ μΆ©λŒμ„ ν•΄κ²°ν•˜λŠ” κ²ƒμ²˜λŸΌ μ΅œμƒμœ„ 경둜의 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°μ‹Έμ„œ μœ μ €μ—κ²Œ β€œλ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€β€λΌλŠ” λ©”μ‹œμ§€λ₯Ό 보여쀄 수 μžˆλ‹€.

ν¬μ°©λ˜μ§€ μ•ŠλŠ” μ—λŸ¬μ— λŒ€ν•œ μƒˆλ‘œμš΄ λ™μž‘

React 16λΆ€ν„°λŠ” μ—λŸ¬ κ²½κ³„μ—μ„œ ν¬μ°©λ˜μ§€ μ•Šμ€ μ—λŸ¬λ‘œ 인해 전체 React μ»΄ν¬λ„ŒνŠΈ 트리의 λ§ˆμš΄νŠΈκ°€ ν•΄μ œλ©λ‹ˆλ‹€.

μ†μƒλœ UIλ₯Ό μ™„μ „νžˆ μ œκ±°ν•˜λŠ” 것보닀 κ·ΈλŒ€λ‘œ λ‚¨κ²¨λ‘λŠ” 것이 더 쒋지 μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 예λ₯Ό λ“€μ–΄ 메신저와 같은 μ œν’ˆμ—μ„œ μ†μƒλœ UIλ₯Ό κ·ΈλŒ€λ‘œ 남겨두면 λˆ„κ΅°κ°€κ°€ 잘λͺ»λœ μ‚¬λžŒμ—κ²Œ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ²Œ 될 κ°€λŠ₯성이 μžˆλ‹€.

이 변경사항은 React 16으둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν•  λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 이전에 μ•Œλ €μ§€μ§€ μ•Šμ•˜λ˜ 기쑴에 μ‘΄μž¬ν•˜λ˜ μΆ©λŒμ„ λ°œκ²¬ν•  수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. μ—λŸ¬ 경계λ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨ λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ 더 λ‚˜μ€ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆλ‹€.

μ»΄ν¬λ„ŒνŠΈ μŠ€νƒ 좔적

React 16은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€μˆ˜λ‘œ μ—λŸ¬λ₯Ό 집어삼킨 κ²½μš°μ—λ„ 개발 κ³Όμ •μ—μ„œ λ Œλ”λ§ν•˜λŠ” λ™μ•ˆ λ°œμƒν•œ λͺ¨λ“  μ—λŸ¬λ₯Ό μ½˜μ†”μ— 좜λ ₯ν•œλ‹€. μ—λŸ¬ λ©”μ‹œμ§€ 및 μžλ°”μŠ€ν¬λ¦½νŠΈ μŠ€νƒκ³Ό λ”λΆˆμ–΄ React 16은 μ»΄ν¬λ„ŒνŠΈ μŠ€νƒ 좔적 λ˜ν•œ μ œκ³΅ν•œλ‹€. 이제 μ •ν™•νžˆ μ»΄ν¬λ„ŒνŠΈ 트리의 μ–΄λŠ λΆ€λΆ„μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν–ˆλŠ”μ§€ 확인할 수 있게 λ˜μ—ˆλ‹€.

try/catchλŠ” μ–΄λ–€κ°€μš”?

try/catch λŠ” λͺ…λ Ήν˜• μ½”λ“œμ—μ„œλ§Œ λ™μž‘ν•œλ‹€.

try {
  showButton();
} catch (error) {
  // ...
}

κ·ΈλŸ¬λ‚˜ React μ»΄ν¬λ„ŒνŠΈλŠ” 선언적이며 무엇을 λ Œλ”λ§ν• μ§€ κ΅¬μ²΄ν™”ν•œλ‹€.

<Button />

μ—λŸ¬ κ²½κ³„λŠ” React의 선언적인 νŠΉμ„±μ„ λ³΄μ‘΄ν•˜κ³  μ˜ˆμƒν•œ λŒ€λ‘œ λ™μž‘ν•œλ‹€.

이벀트 ν•Έλ“€λŸ¬λŠ”?

μ—λŸ¬ κ²½κ³„λŠ” 이벀트 ν•Έλ“€λŸ¬ λ‚΄λΆ€μ—μ„œλŠ” μ—λŸ¬λ₯Ό ν¬μ°©ν•˜μ§€ μ•ŠλŠ”λ‹€.

ReactλŠ” 이벀트 ν•Έλ“€λŸ¬μ˜ μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ μ—λŸ¬ 경계λ₯Ό ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ”λ‹€. render λ©”μ„œλ“œ 및 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œμ™€ 달리 이벀트 ν•Έλ“€λŸ¬λŠ” λ Œλ”λ§ 쀑에 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ 이벀트 ν•Έλ“€λŸ¬κ°€ μ—λŸ¬λ₯Ό λ˜μ Έλ„ ReactλŠ” μ—¬μ „νžˆ 화면에 무엇을 ν‘œμ‹œν•΄μ•Ό ν•  지 μ•Œκ³  μžˆλ‹€.

이벀트 ν•Έλ“€λŸ¬ λ‚΄μ—μ„œ μ—λŸ¬λ₯Ό μž‘μ•„μ•Ό ν•˜λŠ” κ²½μš°μ— 일반 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜Β tryΒ /Β catch ꡬ문을 μ‚¬μš©ν•˜λ©΄ λœλ‹€!

πŸ”₯ λŠλ‚€μ 

λ¦¬μ•‘νŠΈλŠ” 과거에 μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 μ œκ³΅ν•˜μ§€ μ•Šμ•˜μ—ˆκ³  κ·Έ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ„μž…λœ κ°œλ…μ΄ μ—λŸ¬ 경계이닀. 였직 클래슀 μ»΄ν¬λ„ŒνŠΈλ§Œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— μ‹€μ œλ‘œ μ‚¬μš©ν•  일은 λ“œλ¬Όκ² μ§€λ§Œ 이런 것도 μžˆκ΅¬λ‚˜ μƒˆλ‘œ μ•Œκ²Œλ˜μ–΄μ„œ μ’‹μ•˜λ‹€.

Refer

profile
맀 μˆœκ°„ μ„±μž₯ν•˜λŠ” κ°œλ°œμžκ°€ 되렀고 λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€