React 19 RC 주요 변경사항 정리

배경

React 19 RC가 발표되면서 몇 가지 눈여겨볼 만한 변경사항이 있어 정리했다. 당장 프로덕션에 적용하긴 어렵지만, 향후 마이그레이션을 대비해 미리 파악해둘 필요가 있었다.

주요 변경사항

1. Actions

비동기 함수를 form action으로 직접 사용할 수 있게 되었다. 기존에는 onSubmit에서 preventDefault()를 호출하고 별도로 처리해야 했다.

function UpdateProfile() {
  async function updateAction(formData) {
    await updateProfile(formData);
  }

  return <form action={updateAction}>...</form>;
}

2. useOptimistic

낙관적 업데이트를 위한 훅이 추가되었다. 이전에는 직접 상태를 관리하고 롤백 로직을 구현해야 했는데, 이제 간단해졌다.

function ChangeName({ currentName, onUpdateName }) {
  const [optimisticName, setOptimisticName] = useOptimistic(currentName);

  async function submitAction(formData) {
    const newName = formData.get('name');
    setOptimisticName(newName);
    await onUpdateName(newName);
  }

  return (
    <form action={submitAction}>
      <p>이름: {optimisticName}</p>
      <input type="text" name="name" />
    </form>
  );
}

3. use API

Promise나 Context를 컴포넌트 내에서 직접 읽을 수 있는 새로운 API가 추가되었다.

function Note({ notePromise }) {
  const note = use(notePromise);
  return <div>{note.content}</div>;
}

그 외

  • ref가 prop으로 전달 가능해져서 forwardRef가 불필요해졌다
  • Context.Provider 대신 Context를 직접 Provider로 사용 가능
  • cleanup 함수가 컴포넌트 unmount 시 비동기로 실행된다

소감

Actions와 useOptimistic은 실무에서 자주 마주치는 패턴을 잘 추상화한 것 같다. 다만 안정화까지는 시간이 더 필요할 것으로 보여 당장 적용은 보류했다. 올해 말쯤 정식 릴리즈가 나오면 단계적으로 도입해볼 계획이다.