React 19 Compiler와 useActionState 도입 후기

배경

사내 어드민 시스템을 React 18에서 19로 마이그레이션했다. 주요 목적은 React Compiler 적용과 useActionState를 통한 폼 처리 개선이었다.

React Compiler 적용

기존 코드베이스에는 useMemo, useCallback이 많았다. Compiler를 켜면 이런 수동 최적화가 불필요해진다고 했다.

// Before
const filteredData = useMemo(() => 
  data.filter(item => item.status === filter),
  [data, filter]
);

// After - 그냥 작성
const filteredData = data.filter(item => item.status === filter);

Compiler가 자동으로 메모이제이션 포인트를 찾아준다. 번들 크기는 약 3% 증가했지만, 재렌더링은 확실히 줄었다.

useActionState로 폼 개선

서버 액션과 함께 사용하니 로딩/에러 상태 관리가 단순해졌다.

const [state, formAction, isPending] = useActionState(updateUser, initialState);

return (
  <form action={formAction}>
    <input name="username" />
    {state.error && <p>{state.error}</p>}
    <button disabled={isPending}>저장</button>
  </form>
);

기존에는 useState + try-catch + loading flag 조합이었는데, 이제 한 줄로 처리된다.

마이그레이션 이슈

  • 일부 서드파티 라이브러리가 아직 React 19 호환 안됨
  • ref 전달 방식이 변경되어 forwardRef 제거 작업 필요
  • StrictMode가 더 엄격해져서 경고가 증가

결론

Compiler 덕분에 불필요한 최적화 코드를 제거할 수 있었다. useActionState는 Next.js App Router와 궁합이 좋았다. 안정화까지 시간이 더 필요하지만, 방향성은 마음에 든다.