노트

useTransition

useTransition

프런트엔드#react · 연결된 개념 7개

쉽게 말하면

useTransition은 상태 업데이트에 '급하지 않음' 딱지를 붙여, 무거운 목록을 다시 그리는 동안에도 타이핑 같은 급한 일이 먼저 처리되게 하는 훅이에요. 응급실이 위급한 환자부터 보는 것과 비슷하죠.

비유가 깨지는 곳 응급실처럼 순서만 바꿀 뿐 진료 시간을 줄여 주진 않아요. 무거운 렌더는 여전히 그만큼 걸리고, 그동안 새 입력이 오면 진행 중인 transition 렌더를 버리고 입력부터 처리해요.

useTransition은 특정 상태 업데이트를 "급하지 않음(transition)"으로 표시해, 그 렌더 중에도 입력 같은 긴급한 업데이트가 먼저 처리되게 하는 훅이다. [isPending, startTransition]을 반환한다.

const [isPending, startTransition] = useTransition()
const onChange = e => {
  setKeyword(e.target.value)            // 긴급: 입력창은 즉시
  startTransition(() => {
    setQuery(e.target.value)            // 비긴급: 무거운 목록은 나중에
  })
}
  • setTimeout과 다르다. 콜백은 즉시 실행되고, 그 안의 업데이트가 낮은 우선순위로 분류될 뿐이다. 렌더 도중 새 입력이 오면 진행 중인 transition 렌더를 버리고 입력부터 처리한다(동시성 렌더링)
  • 계산을 빠르게 해 주지 않는다. 500ms 걸리던 렌더는 여전히 그만큼 걸린다. 목적은 그동안 UI가 굳지 않게 하는 것이다
  • isPending으로 기존 화면을 흐리게 두거나 스피너를 보여 준다. 이미 보이는 내용을 fallback으로 갈아엎지 않는 것도 transition의 효과다(Suspense)
  • 기준: 사용자가 즉각 반응을 기대하는 상태(입력값, 눌린 탭 표시)는 일반 업데이트로, 그 결과로 따라오는 무거운 UI(검색 결과, 탭 내용)는 transition으로 둔다
  • 로딩 상태 수동 관리의 대체물로만 보면 안 된다. setLoading(true); await f(); setLoading(false) 대신 쓰면 짧아지는 게 아니라 업데이트의 의미(우선순위·중단 가능성)가 달라진다
  • React 19부터 startTransition에 async 함수를 넘길 수 있다. 요청과 그에 따른 상태 갱신을 하나의 transition으로 묶는 Actions 패턴이며, 폼 쪽은 useActionState와 폼 액션로 이어진다

setState를 직접 감쌀 수 없고 값만 받는 상황이면 useDeferredValue를 쓴다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • useReducer

    useReducer는 "이전 상태와 액션을 받아 새 상태를 돌려주는" 리듀서(Reducer) 함수로 상태를 관리하는 훅이다. 이름처럼 Array.prototype.reduce의 아이디어를 시간축으로 늘린 것이다. 배열 요소 대신 시간순으로 들어오는 액션을 누적한다.

  • use()로 Promise 읽기

    use()는 렌더 중에 Promise나 Context 같은 리소스의 값을 읽는 React 19 API(Application Programming Interface)다. Promise가 아직 pending이면 컴포넌트가 suspend되어 가장 가까운 suspense의 fallback이 보이고, 끝나면 그 값으로 다시 렌더된다. reject되면 가장 가까운 에러 경계(Error Boundary)로 던져진다.

  • useEffect와 useLayoutEffect

    useLayoutEffect는 useEffect와 같은 일을 하지만, 브라우저가 화면을 그리기(Paint) 전에 동기적으로 실행된다. useEffect는 그린 뒤에 실행된다.

  • React 상태 갱신

    React는 상태를 직접 고치지 않고 새 값을 setState로 넘겨야 다시 그린다. 이전 값과 Object.is로 비교하므로, 같은 객체를 고친 뒤 넘기면 바뀐 줄 모른다.

  • Effect가 필요 없는 경우

    Effect는 외부 시스템과 동기화할 때 쓰는 탈출구(Escape Hatch)다. 렌더 중에 계산할 수 있는 값이나 사용자 이벤트 처리에 Effect를 쓰면 렌더가 한 번 더 일어나고 흐름이 꼬인다. React 공식 문서가 이런 경우를 따로 정리해 두었다.

보기 옵션