컴파일러의 꿈, React Forget

782025년 11월 01일4

주의: 이 에피소드는 React 19의 공식 기능이 아닌, 팀의 미래 비전과 철학을 설명하기 위한 내용입니다. React Forget은 React 19에 포함되지 않습니다.

React 19의 주요 기능들이 거의 완성 단계에 이르렀음에도, 세바스찬 마크바게의 마음속에는 여전히 풀리지 않은 숙제가 하나 남아 있었다. 바로 useMemouseCallback이라는, 개발자의 수고를 요구하는 최적화 훅들이었다.

그는 React 19가 개발자 경험을 극적으로 향상시켰다는 점은 인정했지만, 여전히 개발자가 리렌더링 최적화를 위해 직접 메모이제이션(memoization)을 신경 써야 한다는 사실에 만족하지 못했다.

늦은 밤, 그는 몇몇 핵심 엔지니어들을 별도의 화상 회의에 초대했다. 이 회의의 주제는 ‘React 19 너머의 미래’였다.

“우리가 이룬 모든 것을 잠시 잊어봅시다.”

세바스찬은 평소처럼 조용하지만 무게감 있는 목소리로 입을 열었다.

“서버 컴포넌트, Actions, Suspense… 모두 훌륭합니다. 하지만 개발자는 여전히 ‘성능’을 위해 부가적인 코드를 작성하고 있습니다. useMemo로 복잡한 계산을 감싸고, useCallback으로 함수를 감싸는 일들 말이죠. 이것이 정말 최선일까요?”

그는 화면에 간단한 컴포넌트 코드를 공유했다.

function UserProfile({ user }) {
  const userDetails = {
    fullName: `${user.firstName} ${user.lastName}`,
    initials: `${user.firstName[0]}${user.lastName[0]}`,
  };

  const handleFollow = () => {
    // 팔로우 로직
  };

  return <UserDetails details={userDetails} onFollow={handleFollow} />;
}

“이 코드에서 userDetails 객체와 handleFollow 함수는 UserProfile이 리렌더링될 때마다 새로 생성됩니다. 만약 UserDetailsReact.memo로 최적화된 컴포넌트라면, 이 불필요한 재생성 때문에 memo가 깨지고 자식 컴포넌트도 리렌더링되겠죠. 그래서 우리는 이렇게 코드를 수정해야만 합니다.”

그는 코드를 수정했다.

function UserProfile({ user }) {
  const userDetails = useMemo(() => ({
    fullName: `${user.firstName} ${user.lastName}`,
    initials: `${user.firstName[0]}${user.lastName[0]}`,
  }), [user.firstName, user.lastName]);

  const handleFollow = useCallback(() => {
    // 팔로우 로직
  }, []);

  return <UserDetails details={userDetails} onFollow={handleFollow} />;
}

코드는 더 길고 복잡해졌다. 최적화를 위해 가독성과 단순성을 희생한 것이다.

“바로 이 지점입니다.” 세바스찬이 말했다. “저는 언젠가, 개발자가 useMemouseCallback을 생각할 필요조차 없는 날이 와야 한다고 믿습니다.”

“그게 어떻게 가능하죠?” 한 엔지니어가 물었다.

“컴파일러입니다.” 세바스찬이 답했다. 그의 눈에는 확신이 가득했다. “우리가 충분히 지능적인 컴파일러를 만들 수만 있다면, 그 컴파일러가 개발자의 코드를 정적으로 분석해서, 어떤 값들이 리렌더링 사이에 변하지 않을지를 자동으로 파악하게 하는 겁니다. 그리고 컴파일러가 빌드 과정에서 보이지 않게 useMemouseCallback 같은 최적화 코드를 자동으로 삽입해주는 거죠.”

이것이 바로 ‘React Forget’이라는 이름으로 알려진 프로젝트의 핵심 비전이었다. 개발자는 그저 자신의 의도대로, 가장 순수하고 간단한 형태의 코드를 작성하기만 하면 된다. 성능 최적화라는 귀찮고 실수하기 쉬운 작업은 모두 컴파일러에게 ‘잊고(forget)’ 맡겨버리는 것이다.

“React Forget은 먼 미래의 이야기일 수 있습니다.” 세바스찬이 말을 맺었다. “하지만 이것이 우리가 나아가야 할 방향입니다. React 19는 서버와 클라이언트의 복잡성을 해결했습니다. 그리고 우리의 다음 목표는, 바로 이 ‘메모이제이션의 복잡성’을 해결하는 것이 되어야 합니다.”

이 회의는 팀원들에게 React 19가 끝이 아님을 다시 한번 상기시켜 주었다. 그들은 지금 웹 개발의 가장 어려운 문제들을 하나씩 정복해가고 있었고, 그 여정의 최종 목적지는 ‘개발자가 오직 애플리케이션의 본질에만 집중할 수 있는 세계’였다. React 19는 그 위대한 미래를 향한, 가장 견고하고 중요한 초석이었다.