# [[React 18 Concurrent Features|React 18 Concurrent Features]] ## πŸ“Œ Brief Summary React 18 Concurrent Features(λ™μ‹œμ„± κΈ°λŠ₯)λŠ” μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•˜λŠ” μ‹œμ κ³Ό 방식을 μ œμ–΄ν•˜μ—¬ 응닡성을 ν¬μƒν•˜μ§€ μ•ŠμœΌλ©΄μ„œλ„ 더 λ§€λ„λŸ¬μš΄ 앱을 ꡬ좕할 수 있게 ν•΄μ£ΌλŠ” κΈ°λŠ₯이닀 [1]. 이 λ Œλ”λ§ λͺ¨λΈμ€ Reactκ°€ λ Œλ”λ§ μž‘μ—…μ„ μΌμ‹œ 쀑지(pause), 쀑단(interrupt), 재개(resume)ν•  수 μžˆλ„λ‘ ν—ˆμš©ν•˜μ—¬ μ€‘μš”λ„μ— λ”°λ₯Έ μ—…λ°μ΄νŠΈ μš°μ„ μˆœμœ„ 지정을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€ [2]. λŒ€ν‘œμ μΈ ν›…(Hook)인 `useTransition`κ³Ό `useDeferredValue`λ₯Ό 톡해 느린 λ Œλ”λ§μ΄ μ€‘μš”ν•œ μ‚¬μš©μž μƒν˜Έμž‘μš©μ„ μ°¨λ‹¨ν•˜μ§€ λͺ»ν•˜κ²Œ λ°©μ§€ν•  수 μžˆλ‹€ [3, 4]. ## πŸ“– Core Content * **λ™μ‹œμ„± λ Œλ”λ§μ˜ 원리와 μž₯점** λ™μ‹œμ„± λ Œλ”λ§μ€ 무거운 ν•„ν„° μ—…λ°μ΄νŠΈμ™€ 같은 μž‘μ—…μ€ μ§€μ—°μ‹œν‚€λ©΄μ„œ, ν΄λ¦­μ΄λ‚˜ 타이핑 λ“± μ€‘μš”ν•˜κ³  즉각적인 μƒν˜Έμž‘μš©μ„ μš°μ„ μ μœΌλ‘œ μ²˜λ¦¬ν•  수 있게 ν•œλ‹€ [2]. μ΅œμ‹  λ²„μ „μ˜ Reactμ—μ„œλŠ” κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ ν™œμ„±ν™”ν•  ν•„μš” 없이 κΈ°λ³Έ λ™μž‘μœΌλ‘œ λ‚΄μž₯λ˜μ–΄ μž‘λ™ν•œλ‹€ [2]. 이 κΈ°λŠ₯은 앱을 μ‹€μ œλ‘œ 더 λΉ λ₯΄κ²Œ λ§Œλ“ λ‹€κΈ°λ³΄λ‹€λŠ”, λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ΄ μ§„ν–‰λ˜λŠ” λ™μ•ˆ UI의 응닡성을 μœ μ§€ν•˜μ—¬ μ‚¬μš©μžκ°€ λŠλΌλŠ” 체감 속도(perceived speed)λ₯Ό μš°μ„ μ‹œν•œλ‹€ [4]. * **`useTransition` (UX 응닡성 μš°μ„ μˆœμœ„ μ§€μ •)** 이 훅은 νŠΉμ • μ—…λ°μ΄νŠΈλ₯Ό 'λΉ„κΈ΄κΈ‰(non-urgent)'으둜 ν‘œμ‹œν•˜λŠ” 역할을 ν•œλ‹€ [3]. 예λ₯Ό λ“€μ–΄ 라이브 검색 κ²°κ³Όλ‚˜ λŒ€κ·œλͺ¨ 데이터λ₯Ό 필터링할 λ•Œ, λ Œλ”λ§ μ²˜λ¦¬κ°€ λŠλ €μ§€λ”λΌλ„ μ‚¬μš©μžμ˜ νƒ€μ΄ν•‘μ΄λ‚˜ 클릭 같은 μ€‘μš”ν•œ μƒν˜Έμž‘μš©μ΄ μ°¨λ‹¨λ˜μ§€ μ•ŠλŠ”λ‹€ [3]. 처리 λŒ€κΈ° 쀑인 μƒνƒœ(`isPending`)λ₯Ό ν™œμš©ν•˜μ—¬ λ Œλ”λ§μ„ μ°¨λ‹¨ν•˜μ§€ μ•Šκ³  λ‘œλ”© μŠ€ν”Όλ„ˆλ‚˜ μŠ€μΌˆλ ˆν†€ μƒνƒœλ₯Ό ν‘œμ‹œν•  수 μžˆλ‹€ [3]. * **`useDeferredValue` (νŒŒμƒ 데이터 처리 μ§€μ—°)** `useTransition`이 μ—…λ°μ΄νŠΈκ°€ νŠΈλ¦¬κ±°λ˜λŠ” μ‹œμ μ„ μ œμ–΄ν•œλ‹€λ©΄, `useDeferredValue`λŠ” 무거운 값을 'μ½λŠ”(read)' μ‹œμ μ„ μ œμ–΄ν•œλ‹€ [4]. μ‚¬μš©μžμ˜ 타이핑과 같은 UI 변경은 μ¦‰κ°μ μœΌλ‘œ λ°˜μ˜ν•˜λ˜, νŒŒμƒλœ 무거운 μ—°μ‚°μ΄λ‚˜ 필터링 λ‘œμ§μ€ μ•½κ°„ μ§€μ—°μ‹œμΌœ μ μš©ν•΄μ•Ό ν•  λ•Œ 이상적인 방법이닀 [4]. 주둜 검색 μƒμž, Typeahead μž…λ ₯κΈ°, μ‹€μ‹œκ°„ 폼 λ“±μ—μ„œ λŠκΉ€ ν˜„μƒ(jank)을 μ€„μ΄λŠ” 데 μ‚¬μš©λœλ‹€ [4]. * **λͺ¨λ²” 사둀 및 ν”„λ ˆμž„μ›Œν¬ μƒνƒœκ³„ 지원** λ™μ‹œμ„± κΈ°λŠ₯은 μ•±μ˜ λͺ¨λ“  곳이 μ•„λ‹Œ 'μΈν„°λž™ν‹°λΈŒ λ·°'에 ν•œμ •ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [4]. 데이터가 λ‘œλ“œλ˜λŠ” λ™μ•ˆ λŒ€μ²΄ UIλ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄ `Suspense`와 κ²°ν•©ν•˜λŠ” 것이 ꢌμž₯되며, κ΅¬ν˜• μƒνƒœ 관리 λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ λ Œλ”λ§μ„ μ°¨λ‹¨ν•˜λŠ” μ•ˆν‹° νŒ¨ν„΄κ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 것은 ν”Όν•΄μ•Ό ν•œλ‹€ [4]. 2025λ…„ κΈ°μ€€ Next.js(App Router), Remix, Vite 기반 ν™˜κ²½ λ“± λŒ€λ‹€μˆ˜μ˜ ν’€μŠ€νƒ ν”„λ ˆμž„μ›Œν¬κ°€ λ™μ‹œμ„± λ Œλ”λ§μ„ 기본적으둜 μ—°λ™ν•˜κ³  μ§€μ›ν•œλ‹€ [5]. ## πŸ”— Knowledge Connections ### Related Concepts - [[useTransition|useTransition]] - μ—°κ²° 이유: React 18 λ™μ‹œμ„± κΈ°λŠ₯의 핡심 ν›…μœΌλ‘œ, λΉ„κΈ΄κΈ‰ μ—…λ°μ΄νŠΈλ₯Ό μ§€μ—°μ‹œν‚€λŠ” ꡬ체적인 κ΅¬ν˜„μ²΄μ΄λ‹€ [3]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 라이브 κ²€μƒ‰μ΄λ‚˜ 필터링 μ‹œ λ Œλ”λ§ 병λͺ© ν˜„μƒμ„ λ°©μ§€ν•˜κ³ , μ–΄λ–»κ²Œ λΉ„κΈ΄κΈ‰ μž‘μ—…κ³Ό κΈ΄κΈ‰ μƒν˜Έμž‘μš©(타이핑 λ“±)을 λΆ„λ¦¬ν•˜λŠ”μ§€ 이해할 수 μžˆλ‹€ [3]. - [[useDeferredValue|useDeferredValue]] - μ—°κ²° 이유: κ°’μ˜ 읽기λ₯Ό μ§€μ—°μ‹œμΌœ UI μ—…λ°μ΄νŠΈμ™€ μ—°μ‚° λΆ€ν•˜λ₯Ό λΆ„λ¦¬ν•˜λŠ” λ™μ‹œμ„± κΈ°λŠ₯의 또 λ‹€λ₯Έ 핡심 훅이닀 [4]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 즉각적인 UI 반영이 ν•„μš”ν•œ λΆ€λΆ„κ³Ό μ§€μ—°μ‹œμΌœλ„ λ¬΄λ°©ν•œ 무거운 계산(derived data)을 μ–΄λ–»κ²Œ λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€ [4]. - Suspense - μ—°κ²° 이유: λ™μ‹œμ„± ν›…(`useTransition` λ“±)κ³Ό κ²°ν•©ν•˜μ—¬ λ°±κ·ΈλΌμš΄λ“œ λ Œλ”λ§μ΄ μ§„ν–‰λ˜κ±°λ‚˜ 데이터가 λ‘œλ“œλ  λ•Œ μŠ€μΌˆλ ˆν†€(fallback UI)을 보여쀄 수 μžˆλ„λ‘ μ„€κ³„λœ κΈ°λŠ₯이닀 [4]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ§€μ—° 쀑인 λ Œλ”λ§ μƒνƒœμ—μ„œ μ‚¬μš©μžμ˜ κ²½ν—˜(UX)을 μ–΄λ–»κ²Œ λΆ€λ“œλŸ½κ²Œ μ΄μ–΄κ°ˆ 수 μžˆλŠ”μ§€ 이해할 수 μžˆλ‹€ [4]. ### Deeper Research Questions - `useTransition`κ³Ό `useDeferredValue`λ₯Ό μ‚¬μš©ν•  λ•Œ React λ‚΄λΆ€μ μœΌλ‘œ 메인 μŠ€λ ˆλ“œμ˜ 유휴 μ‹œκ°„(idle time)을 μ–΄λ–»κ²Œ νŒλ‹¨ν•˜μ—¬ μž‘μ—…μ„ 쀑단 및 μž¬κ°œν•˜λŠ”κ°€? - κ΅¬ν˜• μƒνƒœ 관리 λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ 클래슀 기반 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ™μ‹œμ„± κΈ°λŠ₯κ³Ό ν˜Όμš©ν–ˆμ„ λ•Œ ꡬ체적으둜 μ–΄λ–€ λ Œλ”λ§ 차단 μΆ©λŒμ΄λ‚˜ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ”κ°€? - λ™μ‹œμ„± λ Œλ”λ§μ„ μ μš©ν–ˆμ„ λ•Œ Interaction to Next Paint (INP)λ‚˜ Total Blocking Time (TBT)κ³Ό 같은 Core Web Vitals μ§€ν‘œκ°€ μˆ˜μΉ˜μƒμœΌλ‘œ μ–΄λ–»κ²Œ λ³€ν™”ν•˜λŠ”κ°€? - Next.js의 App Router와 κ²°ν•©λœ λ™μ‹œμ„± λ Œλ”λ§μ—μ„œ, μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ(Server Components)와 ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ λ Œλ”λ§ μš°μ„ μˆœμœ„λŠ” μ–΄λ–»κ²Œ κ΄€λ¦¬λ˜λŠ”κ°€? - `isPending` 속성을 ν™œμš©ν•΄ λŒ€μ²΄ UI(μŠ€μΌˆλ ˆν†€, μŠ€ν”Όλ„ˆ)λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‹œκ°μ  κΉœλΉ‘μž„μ„ μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•œ 이상적인 μ§€μ—° μ‹œκ°„ 섀계 νŒ¨ν„΄μ€ 무엇인가? ### Practical Application Contexts - **Implementation:** 라이브 검색 κ²°κ³Ό λ Œλ”λ§μ΄λ‚˜ 수천 개의 ν•­λͺ©μ΄ μžˆλŠ” 데이터 λͺ©λ‘μ„ 필터링할 λ•Œ `useTransition`을 λ„μž…ν•˜μ—¬ μž…λ ₯창의 μž…λ ₯이 μ§€μ—°λ˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•œλ‹€ [3]. - **System Design:** 검색 μƒμž, Typeahead μž…λ ₯κΈ°, λ˜λŠ” μ‹€μ‹œκ°„ 폼을 섀계할 λ•Œ 즉각적인 μž…λ ₯ λ Œλ”λ§κ³Ό 연산이 무거운 데이터 λ Œλ”λ§ κ°„μ˜ 영ν–₯을 μ°¨λ‹¨ν•˜κΈ° μœ„ν•΄ `useDeferredValue` μ•„ν‚€ν…μ²˜λ₯Ό λ„μž…ν•œλ‹€ [4]. - **Operation / Maintenance:** Chrome DevTools의 Performance νƒ­κ³Ό Web Vitals μ§€ν‘œλ₯Ό 톡해 κΈ΄ μž‘μ—…(Long tasks)이 λ™μ‹œμ„± λ Œλ”λ§ 덕뢄에 μ„±κ³΅μ μœΌλ‘œ μͺΌκ°œμ Έ 메인 μŠ€λ ˆλ“œ 차단을 μ€„μ˜€λŠ”μ§€ μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•œλ‹€ [6, 7]. - **Learning Path:** React의 κΈ°λ³Έ λ Œλ”λ§ λͺ¨λΈ(props 및 state 변경에 λ”°λ₯Έ λ¦¬λ Œλ”λ§ 트리거)을 λͺ…ν™•νžˆ μ΄ν•΄ν•œ λ‹€μŒ, λ™μ‹œμ„± κΈ°λŠ₯을 톡해 μ΄λŸ¬ν•œ λ Œλ”λ§ 사이클이 μ–΄λ–»κ²Œ μΌμ‹œ μ€‘μ§€λ˜κ³  재개될 수 μžˆλŠ”μ§€ ν•™μŠ΅μ„ ν™•μž₯ν•œλ‹€ [2, 8]. - **My Project Relevance:** ν˜„μž¬ μ§„ν–‰ 쀑인 ν”„λ‘œμ νŠΈμ—μ„œ 데이터가 λ§Žμ€ μ°¨νŠΈλ‚˜ ν…Œμ΄λΈ” 필터링 μ‹œ UIκ°€ λŠκΈ°λŠ”(Jank) ν˜„μƒμ΄ μžˆλ‹€λ©΄, 이 λ™μ‹œμ„± κΈ°λŠ₯ 훅을 λ„μž…ν•˜μ—¬ 즉각적인 클릭/μž…λ ₯ 응닡성을 확보할 수 μžˆλ‹€ [3, 4]. ### Adjacent Topics - [[React Performance Optimization|React Performance Optimization]] - ν™•μž₯ λ°©ν–₯: λ™μ‹œμ„± λ Œλ”λ§ 외에도 λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§ 자체λ₯Ό λ§‰λŠ” `React.memo`, `useCallback`, `useMemo` ν™œμš©λ²•κ³Ό 같은 λ‹€μ–‘ν•œ React μ„±λŠ₯ μ΅œμ ν™” 기법 μ „λ°˜μœΌλ‘œ 지식을 ν™•μž₯ν•  수 μžˆλ‹€ [9-11]. - [[Server Components|Server Components]] - ν™•μž₯ λ°©ν–₯: Next.jsμ—μ„œ λ™μ‹œμ„± κΈ°λŠ₯κ³Ό ν•¨κ»˜ μ„±λŠ₯ ν–₯μƒμ˜ μ–‘λŒ€ 좕을 μ΄λ£¨λŠ” κΈ°λŠ₯으둜, ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ JavaScriptλ₯Ό μ „μ†‘ν•˜μ§€ μ•Šκ³  μ„œλ²„μ—μ„œ λ Œλ”λ§μ„ μ™„λ£Œν•˜μ—¬ λ²ˆλ“€ 크기λ₯Ό μ€„μ΄λŠ” μ „λž΅μ„ ν•™μŠ΅ν•  수 μžˆλ‹€ [12, 13]. --- *Last updated: 2026-04-30*