노트

useTransition

useTransition

프론트엔드#react · 연결된 개념 8개

쉽게 말하면

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)로 던져진다.

  • React 상태 갱신

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

  • Effect가 필요 없는 경우

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

  • 내부 가변성과 메모이제이션

    내부 가변성(Interior Mutability)은 객체나 함수의 참조는 그대로인데 안에 숨은 상태가 바뀌는 성질이다. React의 메모이제이션은 "입력이 다른 참조인가"만 보기 때문에, 참조가 같으면 내용이 바뀌어도 바뀌지 않았다고 판단한다. React 공식 문서는 이를 "겉모습은 같은데 몰래 내용물을 바꾸는 상자"에 비유한다.

보기 옵션