여러분, 혹시 React 프로젝트에서 useMemo, useCallback, React.memo를 어디에 써야 할지 고민하신 적 있으신가요? 저도 그랬어요. 성능 최적화를 하려다 오히려 코드만 복잡해지고, 정작 성능 개선 효과는 미미했던 경험... 다들 한 번쯤은 있으시죠? 😅
그런데 2025년 10월, React 팀이 드디어 이 모든 고민을 한 번에 해결해줄 혁신적인 도구를 공식 출시했습니다. 바로 React Compiler 1.0입니다! 10년 가까운 연구 끝에 탄생한 이 컴파일러는 우리가 수동으로 하던 성능 최적화 작업을 자동으로 처리해주는 마법 같은 도구예요.
오늘은 React Compiler가 무엇인지, 어떻게 사용하는지, 그리고 실제로 얼마나 성능이 좋아지는지 완벽하게 알아보겠습니다! 🚀
React Compiler, 도대체 뭐가 그렇게 대단한 걸까?

10년 연구의 결실, 자동 메모이제이션의 시대
React Compiler는 한마디로 빌드 타임에 여러분의 코드를 자동으로 최적화해주는 똑똑한 도구입니다. 지금까지는 개발자가 직접 어느 부분을 메모이제이션할지 판단하고 코드를 작성해야 했지만, 이제는 컴파일러가 알아서 다 해줘요!
React 팀은 2017년 Prepack 프로젝트부터 시작해서 2021년 첫 프로토타입, 그리고 2024년 베타 출시를 거쳐 드디어 2025년 10월 7일 정식 버전 1.0을 공개했습니다. 무려 Meta의 대규모 프로덕션 환경에서 검증을 마친, 완전히 실전에서 사용 가능한 수준이에요.
메모이제이션을 자동으로? 어떻게 가능한 거죠?
React Compiler의 핵심은 자동 메모이제이션입니다. 기존에는 이런 코드를 작성해야 했어요:
function HeavyComponent({ data, count }) {
const processedData = useMemo(() => {
return expensiveComputation(data);
}, [data]);
const handleClick = useCallback(() => {
console.log(count);
}, [count]);
return <div onClick={handleClick}>{processedData}</div>;
}
export default React.memo(HeavyComponent);
코드가 복잡하죠? 그런데 React Compiler를 사용하면:
function HeavyComponent({ data, count }) {
const processedData = expensiveComputation(data);
const handleClick = () => {
console.log(count);
};
return <div onClick={handleClick}>{processedData}</div>;
}
이렇게 깔끔하게 작성해도 컴파일러가 알아서 최적화를 해줍니다! 🎉
React Compiler의 놀라운 특징들
1. 조건부 메모이제이션도 가능해요
기존 방식으로는 불가능했던 조건부 메모이제이션도 React Compiler는 처리할 수 있어요:
export default function ThemeProvider(props) {
if (!props.children) {
return null;
}
// 조건문 이후에도 메모이제이션이 가능합니다!
const theme = mergeTheme(props.theme, use(ThemeContext));
return (
<ThemeContext value={theme}>
{props.children}
</ThemeContext>
);
}
이 코드는 컴파일러가 자동으로 최적화해서 불필요한 재렌더링을 방지해줘요.
2. React 규칙 위반도 체크해줍니다
React Compiler는 단순히 성능 최적화만 하는 게 아니에요. React의 규칙을 위반하는 코드도 찾아내서 알려줍니다.
예를 들어:
- 렌더링 중 setState 호출
- Effect 안에서의 부적절한 상태 업데이트
- ref의 잘못된 사용
이런 문제들을 빌드 타임에 미리 발견할 수 있어서, 버그를 사전에 예방할 수 있답니다! 🛡️
3. 실제 성능 개선이 입증됐어요
Meta Quest Store에서 실제로 측정한 결과:
- 초기 로딩 속도 최대 12% 향상
- 특정 인터랙션 속도 2.5배 이상 개선
- 메모리 사용량은 중립적 유지
이미 최적화가 잘 되어있던 프로젝트에서도 추가 성능 개선이 있었다는 게 정말 놀랍죠!
React Compiler 시작하기 - 설치와 설정
설치는 정말 간단해요
새 프로젝트든 기존 프로젝트든, 설치 방법은 동일합니다:
# npm 사용 시
npm install --save-dev --save-exact babel-plugin-react-compiler@latest
# pnpm 사용 시
pnpm add --save-dev --save-exact babel-plugin-react-compiler@latest
# yarn 사용 시
yarn add --dev --exact babel-plugin-react-compiler@latest
프레임워크별 설정 방법
1. Next.js 프로젝트
Next.js 15.3.1 이상에서는 설정이 정말 간단해요:
// next.config.js
const nextConfig = {
experimental: {
reactCompiler: true,
},
};
module.exports = nextConfig;
2. Vite 프로젝트
Vite를 사용한다면:
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [
react({
babel: {
plugins: [['babel-plugin-react-compiler']],
},
}),
],
});
3. Expo 프로젝트
Expo SDK 54 이상에서는 자동으로 활성화되어 있어요! 별도 설정이 필요 없습니다. 😊
React 17, 18 사용자도 걱정 마세요
React 19가 아니어도 사용할 수 있어요! react-compiler-runtime을 추가하면 됩니다:
npm install react-compiler-runtime
그리고 컴파일러 설정에서 타겟 버전을 지정해주세요:
// babel.config.js
module.exports = {
plugins: [
['babel-plugin-react-compiler', {
target: '17' // 또는 '18'
}]
]
};
ESLint와 함께 사용하기 - 완벽한 조합
React Compiler는 이제 eslint-plugin-react-hooks에 통합되었어요!
설치 방법
npm install --save-dev eslint-plugin-react-hooks@latest
ESLint 설정
// eslint.config.js (Flat Config)
import reactHooks from 'eslint-plugin-react-hooks';
export default [
reactHooks.configs.flat.recommended,
];
이렇게 설정하면 컴파일러가 발견한 문제들을 에디터에서 바로 확인할 수 있어요! 🔍
주요 린트 규칙들
- set-state-in-render: 렌더링 중 setState 호출을 감지
- set-state-in-effect: Effect 안의 비효율적인 작업 발견
- refs: 렌더링 중 안전하지 않은 ref 접근 방지
기존 프로젝트에 점진적으로 적용하기
새 프로젝트가 아닌 기존 프로젝트에 적용할 때는 신중하게 접근하는 게 좋아요. React 팀이 제공하는 단계별 가이드를 따라가 보세요:
1단계: ESLint부터 시작
먼저 컴파일러 없이 ESLint 플러그인만 설치해서 코드의 문제점을 파악하세요. 리스크 없이 어떤 부분을 개선해야 할지 알 수 있어요.
2단계: 작은 부분부터 적용
특정 컴포넌트나 페이지부터 시작해서 점진적으로 확대하는 게 안전합니다. 컴파일러 설정에서 특정 파일만 포함/제외할 수 있어요:
// babel.config.js
module.exports = {
plugins: [
['babel-plugin-react-compiler', {
sources: (filename) => {
// 특정 폴더만 컴파일
return filename.indexOf('src/pages') !== -1;
}
}]
]
};
3단계: 테스트와 모니터링
컴파일러를 적용한 후에는 꼭 충분한 테스트를 진행하세요. React DevTools의 Profiler를 사용하면 성능 변화를 시각적으로 확인할 수 있어요.
useMemo, useCallback은 이제 안 써도 되나요?
많은 분들이 궁금해하시는 질문이에요! 답은 **"대부분의 경우는 안 써도 되지만, 특정 상황에선 여전히 유용합니다"**예요.
계속 사용하면 좋은 경우
1. Effect 의존성 제어가 필요할 때
function Component({ data }) {
// Effect가 필요 이상으로 실행되는 걸 막고 싶을 때
const memoizedData = useMemo(() => processData(data), [data.id]);
useEffect(() => {
fetchRelatedData(memoizedData);
}, [memoizedData]);
}
2. 정밀한 제어가 필요한 최적화
특정 값의 메모이제이션을 명시적으로 제어하고 싶다면 계속 사용하셔도 됩니다.
새 프로젝트에서는?
새로 시작하는 프로젝트라면 일단 컴파일러에 맡기고, 필요한 경우에만 useMemo/useCallback을 추가하는 걸 추천해요!
실전 팁과 주의사항
팁 1: React DevTools로 확인하기
React DevTools (v5.0+)를 설치하면 컴파일러가 최적화한 컴포넌트 옆에 "Memo ✨" 배지가 표시돼요. 어떤 컴포넌트가 최적화됐는지 한눈에 확인할 수 있답니다!
팁 2: Playground에서 실험하기
React Compiler Playground에서 여러분의 코드가 어떻게 최적화되는지 직접 확인해볼 수 있어요. 학습하기에 정말 좋은 도구입니다! 💡
주의사항: 버전 고정 권장
테스트 커버리지가 충분하지 않다면, 컴파일러 버전을 정확히 고정하는 게 좋아요:
npm install --save-exact babel-plugin-react-compiler@1.0.0
향후 컴파일러 업데이트로 메모이제이션 방식이 바뀔 수 있기 때문에, 충분한 테스트 없이 자동 업데이트되는 건 위험할 수 있어요.
2025년, React 개발의 새로운 기준
React Compiler 1.0의 등장으로 React 개발 방식이 완전히 바뀌고 있어요. 더 이상 성능 최적화 때문에 코드가 복잡해질 필요가 없고, 개발자는 비즈니스 로직에만 집중할 수 있게 됐죠.
핵심 포인트 정리:
- ✅ 자동 메모이제이션으로 코드 간결성 유지
- ✅ React 규칙 위반 자동 감지로 버그 예방
- ✅ Meta 검증 완료, 프로덕션 환경에서 안전하게 사용 가능
- ✅ React 17 이상에서 모두 호환
- ✅ Expo, Vite, Next.js 등 주요 프레임워크 지원
이제 막 시작하는 프로젝트라면 React Compiler를 기본으로 활성화하는 걸 적극 추천드려요. 기존 프로젝트라면 ESLint부터 적용해서 점진적으로 마이그레이션하는 게 안전합니다.
React의 다음 10년을 이끌어갈 React Compiler, 여러분의 프로젝트에도 한번 적용해보시는 건 어떨까요? 성능 개선의 효과를 직접 경험해보시면 깜짝 놀라실 거예요! 😊
관련 참고 자료
'기술의기록' 카테고리의 다른 글
| React 19.2 Activity Component, Next.js에서 사용 불가 문제 총정리 (0) | 2025.10.23 |
|---|---|
| Next.js 16 정식 출시! 완전히 달라진 성능과 새로운 기능 총정리 (2025년 최신) (0) | 2025.10.22 |
| React 19 useActionState 완벽 가이드 - 폼 관리가 이렇게 쉬워진다고? (0) | 2025.10.15 |
| Claude Code 사용할 때 Opus 4.1? Sonnet 4.5? 개발자가 알려주는 현실 선택 가이드 (0) | 2025.10.14 |
| Claude Code 1년차 파워유저가 알려주는 필수 팁 10가지 (0) | 2025.10.14 |