useMemo, useCallback 쓰던사람들 꼭보세요 | 리액트 컴파일러 드디어 정식 출시
- 리액트 컴파일러 1.0 버전이 10월 7일 정식 출시되어, 10년에 걸친 엔지니어링 노력의 결실을 맺었습니다. 🚀
- 이 컴파일러는 브라우저 실행 전 코드를 분석하여 최적화 정보를 미리 제공하는 역할을 합니다. 🧠
- 주요 해결 과제는 리액트의 고질적인 문제인 부모 컴포넌트 렌더링 시 자식 컴포넌트의 불필요한 재렌더링을 방지하는 메모이제이션 문제였습니다. ♻️
- 기존
useMemo, useCallback, React.memo 등의 수동 메모이제이션 방식은 의존성 배열 관리, 과도한 메모리 사용, 코드 가독성 저하 등의 단점이 있었습니다. 📉
- 리액트 컴파일러는 개발자가 직접 메모이제이션 여부를 결정할 필요 없이, 자동으로 필요한 부분을 최적화해주는 기능을 제공합니다. ✨
- 컴파일러 적용은
@react-compiler/babel-plugin 및 eslint-plugin-react-compiler 설치 후, eslint 및 babel (또는 vite.config.js) 설정을 통해 이루어집니다. 🛠️
- 컴파일러 적용 후, 부모 컴포넌트가 변경되어도 자식 컴포넌트는 불필요하게 재렌더링되지 않고 자동으로 메모이제이션되는 것을 시연을 통해 확인했습니다. ✅
- 리액트 팀은 컴파일러가 기존 훅보다 더 정확하게 메모이제이션을 수행하므로, 대부분의 경우
useMemo나 useCallback을 더 이상 사용하지 않아도 된다고 권장합니다. 🙅♀️
- 단, 리액트 규칙을 준수하지 않은 코드에서는 예기치 않은 동작이 발생할 수 있으며, 컴파일러 버전 고정을 통해 자동 업데이트로 인한 문제를 방지할 것을 권고합니다. ⚠️
- 컴파일러의 동작 원리는 HIR, SSA, 효과 분석, 반응형 분석, 스코프 분할, 코드 재생성 등의 복잡한 단계를 거쳐 자동 메모이제이션을 구현합니다. 🔬