<Hello Hosung😎/>

[React, RN] 효율적인 λ Œλ”λ§κ³Ό λΉ λ₯Έ λ‘œλ”©μ„ μœ„ν•œ μ „λž΅ λ³Έλ¬Έ

πŸ“± JavaScript/γ…€React, RN

[React, RN] 효율적인 λ Œλ”λ§κ³Ό λΉ λ₯Έ λ‘œλ”©μ„ μœ„ν•œ μ „λž΅

쒌좩우돌 λ°±μ—”λ“œ 개발자 일기🧐 2024. 11. 25. 14:51

 

1. λ¦¬μ•‘νŠΈ μ„±λŠ₯ μ΅œμ ν™”κ°€ μ€‘μš”ν•œ 이유

λ¦¬μ•‘νŠΈλ‘œ λ§Œλ“  μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 크고 λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ λ Œλ”λ§ μ„±λŠ₯이 μ€‘μš”ν•΄μ§‘λ‹ˆλ‹€. νŽ˜μ΄μ§€κ°€ 느리게 λ‘œλ”©λ˜κ±°λ‚˜ λΆˆν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈκ°€ 계속 λ¦¬λ Œλ”λ§λ˜λŠ” 경우, μ‚¬μš©μž κ²½ν—˜(UX)이 크게 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. μ„±λŠ₯ μ΅œμ ν™”λŠ” μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ°˜μ‘ 속도λ₯Ό λ†’μ—¬μ€λ‹ˆλ‹€.

2. λΆˆν•„μš”ν•œ λ Œλ”λ§ λ°©μ§€

λ¦¬μ•‘νŠΈλŠ” μƒνƒœ(state)λ‚˜ 속성(props)이 변경될 λ•Œλ§ˆλ‹€ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ¦¬λ Œλ”λ§ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ“  λ¦¬λ Œλ”λ§μ΄ ν•„μš”ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€. λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•˜λŠ” λͺ‡ κ°€μ§€ 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • React.memo: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ propsκ°€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ λ¦¬λ Œλ”λ§μ„ 막을 수 μžˆμŠ΅λ‹ˆλ‹€.
const MyComponent = React.memo(({ data }) => {
  return <div>{data}</div>;
});

 
 
React.memoλŠ” shouldComponentUpdate와 μœ μ‚¬ν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.
 

  • PureComponent: ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœλ‚˜ propsκ°€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
class MyComponent extends React.PureComponent {
  render() {
    return <div>{this.props.data}</div>;
  }
}

 
 

3. μƒνƒœ 관리 μ΅œμ ν™”

μƒνƒœ 관리가 잘λͺ»λ˜λ©΄ λΆˆν•„μš”ν•œ λ Œλ”λ§μ„ μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒνƒœ μ—…λ°μ΄νŠΈλ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

  • μƒνƒœ μ—…λ°μ΄νŠΈ μ΅œμ†Œν™”: λΆˆν•„μš”ν•œ μƒνƒœ 변경을 쀄이고, μƒνƒœλŠ” ν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈμ—λ§Œ 전달해야 ν•©λ‹ˆλ‹€.
  • 배치 μ—…λ°μ΄νŠΈ: μ—¬λŸ¬ 개의 μƒνƒœ 변경을 ν•˜λ‚˜μ˜ 배치둜 λ¬Άμ–΄ λ Œλ”λ§μ„ μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ¦¬μ•‘νŠΈλŠ” μ—¬λŸ¬ μƒνƒœ 변경을 ν•œ λ²ˆμ— μ²˜λ¦¬ν•©λ‹ˆλ‹€.

4. μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…κ³Ό μ§€μ—° λ‘œλ”©

초기 λ‘œλ”© μ‹œκ°„μ΄ κΈ΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‚¬μš©μž κ²½ν—˜μ— λ‚˜μœ 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…μ„ 톡해 ν•„μš”ν•œ λΆ€λΆ„λ§Œ λ‘œλ“œν•˜λ©΄ 초기 λ‘œλ”©μ„ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • React.lazy와 Suspense: μ»΄ν¬λ„ŒνŠΈλ₯Ό 처음 ν•„μš”ν•œ μˆœκ°„μ—λ§Œ λΆˆλŸ¬μ˜€λŠ” λ°©λ²•μž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 초기 λ‘œλ”© μ‹œκ°„μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
const MyComponent = React.lazy(() => import('./MyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <MyComponent />
    </Suspense>
  );
}

 

5. 리슀트 λ Œλ”λ§ μ΅œμ ν™”

리슀트λ₯Ό λ Œλ”λ§ν•  λ•Œ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λ €λ©΄ 화면에 λ³΄μ΄λŠ” ν•­λͺ©λ§Œ λ Œλ”λ§ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

  • react-window λ˜λŠ” react-virtualized: κΈ΄ 리슀트λ₯Ό 효율적으둜 λ Œλ”λ§ν•  수 있게 λ„μ™€μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. 화면에 λ³΄μ΄λŠ” ν•­λͺ©λ§Œ λ Œλ”λ§ν•˜κ³ , λ‚˜λ¨Έμ§€λŠ” 슀크둀될 λ•Œ λ‘œλ“œν•©λ‹ˆλ‹€.

6. useMemo와 useCallback ν™œμš©ν•˜κΈ°

  • useMemo: λ³΅μž‘ν•œ 계산이 ν•„μš”ν•œ 값을 λ©”λͺ¨μ΄μ œμ΄μ…˜ν•˜μ—¬ λΆˆν•„μš”ν•œ 계산을 λ°©μ§€ν•©λ‹ˆλ‹€.
const memoizedValue = useMemo(() => expensiveComputation(value), [value]);

 

  • useCallback: ν•¨μˆ˜λ₯Ό λ©”λͺ¨μ΄μ œμ΄μ…˜ν•˜μ—¬, λ™μΌν•œ ν•¨μˆ˜κ°€ 맀번 μƒμ„±λ˜μ§€ μ•Šλ„λ‘ μ΅œμ ν™”ν•©λ‹ˆλ‹€.
const memoizedCallback = useCallback(() => { doSomething() }, [dependencies]);

 

7. μ„±λŠ₯ 뢄석 도ꡬ ν™œμš©

λ¦¬μ•‘νŠΈ μ„±λŠ₯을 λΆ„μ„ν•˜λ €λ©΄ React DevTools의 Profiler 탭을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 각 μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§ μ‹œκ°„κ³Ό λ¦¬λ Œλ”λ§ λΉˆλ„λ₯Ό ν™•μΈν•˜κ³ , μ„±λŠ₯이 μ €ν•˜λ˜λŠ” 뢀뢄을 μ°Ύμ•„ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
 

8. μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§(SSR)κ³Ό 정적 μ‚¬μ΄νŠΈ 생성(SSG)

μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§κ³Ό 정적 μ‚¬μ΄νŠΈ 생성을 톡해 초기 λ‘œλ”© μ‹œκ°„μ„ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Next.js와 같은 ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” SSRκ³Ό SSGλ₯Ό μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • SSR(μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§): μ„œλ²„μ—μ„œ νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•˜μ—¬ 초기 λ‘œλ”©μ„ λΉ λ₯΄κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • SSG(정적 μ‚¬μ΄νŠΈ 생성): λΉŒλ“œ μ‹œ 미리 λ Œλ”λ§λœ HTML νŒŒμΌμ„ μ œκ³΅ν•˜μ—¬ λ‘œλ”© μ‹œκ°„μ„ λ‹¨μΆ•ν•©λ‹ˆλ‹€.

 

9. 마무리

λ¦¬μ•‘νŠΈ μ„±λŠ₯ μ΅œμ ν™”λŠ” μ—¬λŸ¬ κ°€μ§€ 방법을 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ”μš± 효율적으둜 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. λΆˆν•„μš”ν•œ λ Œλ”λ§μ„ λ°©μ§€ν•˜κ³ , μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…κ³Ό μ§€μ—° λ‘œλ”©μ„ μ‚¬μš©ν•˜μ—¬ 초기 λ‘œλ”© μ‹œκ°„μ„ κ°œμ„ ν•˜λ©°, μƒνƒœ 관리와 리슀트 λ Œλ”λ§μ„ μ΅œμ ν™”ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. μ„±λŠ₯ 뢄석 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ 문제λ₯Ό μ°Ύκ³  ν•΄κ²°ν•˜λŠ” 과정도 빼놓을 수 μ—†μŠ΅λ‹ˆλ‹€. 이 방법듀을 μ μš©ν•˜λ©΄ λ¦¬μ•‘νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.