# [[Code Splitting]] ## πŸ“Œ Brief Summary 큰 μžλ°”μŠ€ν¬λ¦½νŠΈ λ²ˆλ“€μ„ 더 μž‘μ€ 청크(chunk) λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μ‚¬μš©μžκ°€ ν•„μš”λ‘œ ν•  λ•Œ(on demand) λ‘œλ“œν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€ [1, 2]. λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό μ΄ˆκΈ°μ— ν•œ λ²ˆμ— λ‹€μš΄λ‘œλ“œν•˜λŠ” λŒ€μ‹ , ν•„μš”ν•œ 파일만 λ¨Όμ € 뢈러였게 ν•˜μ—¬ 초기 λ²ˆλ“€ 크기λ₯Ό 극적으둜 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 3]. 결과적으둜 초기 νŽ˜μ΄μ§€ λ‘œλ“œ 속도λ₯Ό ν–₯μƒμ‹œν‚€κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 체감 μ„±λŠ₯을 κ°œμ„ ν•˜λŠ” 핡심적인 ν”„λ‘ νŠΈμ—”λ“œ μ΅œμ ν™” κΈ°λ²•μž…λ‹ˆλ‹€ [1, 4]. ## πŸ“– Core Content * **라우트 기반 λΆ„ν•  (Route-level Code Splitting):** κ°€μž₯ 일반적이고 효과적인 μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ νŠΉμ • 라우트둜 이동할 λ•Œλ§Œ ν•΄λ‹Ή νŽ˜μ΄μ§€μ˜ μ½”λ“œλ₯Ό λ‹€μš΄λ‘œλ“œν•˜λ„λ‘ ν•˜μ—¬ 초기 λ‘œλ”© μ‹œ λΆˆν•„μš”ν•œ μ½”λ“œ λ‹€μš΄λ‘œλ“œλ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€ [1, 2, 5]. * **μ»΄ν¬λ„ŒνŠΈ μˆ˜μ€€ μ§€μ—° λ‘œλ”© (Component-level Lazy Loading):** 차트, 지도, 리치 ν…μŠ€νŠΈ μ—λ””ν„°μ²˜λŸΌ 크고 무거운 μ»΄ν¬λ„ŒνŠΈλ‚˜ λ“œλ¬Όκ²Œ μ‚¬μš©λ˜λŠ” λͺ¨λ‹¬, μ„€μ • νŒ¨λ„ 등을 λ Œλ”λ§μ΄ ν•„μš”ν•œ μ‹œμ μ—λ§Œ λ‘œλ“œν•˜λ„λ‘ λΆ„λ¦¬ν•©λ‹ˆλ‹€ [6, 7]. Reactμ—μ„œλŠ” `React.lazy()`와 동적 μž„ν¬νŠΈ(dynamic imports), 그리고 ``λ₯Ό ν™œμš©ν•΄ 이λ₯Ό μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [4, 6, 8]. * **벀더 라이브러리 λΆ„ν•  (Vendor Splitting):** Vite(λ‚΄λΆ€μ μœΌλ‘œ Rollup μ‚¬μš©) λ“±μ˜ λ²ˆλ“€λŸ¬λ₯Ό μ‚¬μš©ν•  λ•Œ `manualChunks` μ˜΅μ…˜μ„ 톡해 React μ½”μ–΄ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ 차트 λ“± 무거운 벀더 μ½”λ“œλ₯Ό λ³„λ„μ˜ 파일둜 λΆ„ν• ν•©λ‹ˆλ‹€ [5, 9, 10]. 벀더 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 자주 λ³€κ²½λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λΈŒλΌμš°μ € 캐싱 νš¨μœ¨μ„ κ·ΉλŒ€ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [5, 11]. * **λ²ˆλ“€λŸ¬μ˜ μžλ™ν™” 지원:** μ΅œμ‹  λ²ˆλ“€λŸ¬(Webpack, Vite)λŠ” μ½”λ“œ 내에 μž‘μ„±λœ 동적 μž„ν¬νŠΈ(`import()`)λ₯Ό κ°μ§€ν•˜λ©΄ μžλ™μœΌλ‘œ ν•΄λ‹Ή μ½”λ“œλ₯Ό λ³„λ„μ˜ 청크둜 λΆ„λ¦¬ν•©λ‹ˆλ‹€ [4, 6]. ## βš–οΈ Trade-offs & Caveats * **ν•„μˆ˜ μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•œ μ˜€λ‚¨μš© κΈˆμ§€:** νŽ˜μ΄μ§€μ— μ¦‰μ‹œ ν•„μš”ν•œ 슀크둀 없이 λ³Ό 수 μžˆλŠ”(above-the-fold) 핡심 μ»΄ν¬λ„ŒνŠΈλ‚˜, λ Œλ”λ§ 속도가 빨라야 ν•˜λŠ” μš”μ†Œμ—λŠ” μ§€μ—° λ‘œλ”©κ³Ό μ½”λ“œ 뢄할을 ν”Όν•΄μ•Ό ν•©λ‹ˆλ‹€ [7]. 였히렀 첫 화면을 κ·Έλ¦¬λŠ” μ‹œκ°„μ„ μ§€μ—°μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. * **μ‚¬μš©μž κ²½ν—˜ μ €ν•˜ λ°©μ§€ (Fallback UI ν•„μš”):** μ½”λ“œλ₯Ό λ™μ μœΌλ‘œ λΆˆλŸ¬μ˜€λŠ” λ™μ•ˆ λ„€νŠΈμ›Œν¬ 지연이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ ``λ₯Ό μ‚¬μš©ν•΄ λͺ¨λ“ˆμ΄ λ‘œλ“œλ˜λŠ” λ™μ•ˆ μŠ€ν”Όλ„ˆλ‚˜ μŠ€μΌˆλ ˆν†€κ³Ό 같은 Fallback UIλ₯Ό μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€ [5, 8]. * **λ„€νŠΈμ›Œν¬ μš”μ²­ μ¦κ°€μ˜ μœ„ν—˜:** λ„ˆλ¬΄ 잘게 μ½”λ“œλ₯Ό λΆ„ν• ν•˜λ©΄ 였히렀 μˆ˜λ§Žμ€ λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ λ°œμƒν•΄ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ²ˆλ“€ 크기λ₯Ό μ‹œκ°μ μœΌλ‘œ 뢄석할 수 μžˆλŠ” `rollup-plugin-visualizer` λ“±μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•΄ 500kB μ΄μƒμ˜ 큰 청크λ₯Ό νƒ€κ²ŸμœΌλ‘œ μ‹λ³„ν•˜κ³  μ μ ˆν•˜κ²Œ λΆ„ν• ν•΄μ•Ό ν•©λ‹ˆλ‹€ [12, 13]. ## πŸ”— Knowledge Connections ### Related Concepts #### [μ•„ν‚€ν…μ²˜/기반 기술] - [[Lazy Loading]] - μ—°κ²° 이유: μ½”λ“œ 뢄할이 λ²ˆλ“€μ„ μͺΌκ°œλŠ” ν–‰μœ„λΌλ©΄, μ§€μ—° λ‘œλ”©(Lazy Loading)은 κ·Έ μͺΌκ°œμ§„ μ½”λ“œλ₯Ό ν•„μš” μ‹œμ μ— λ‘œλ“œν•˜λŠ” 기술적 λ°©λ²•λ‘ μž…λ‹ˆλ‹€ [2, 3]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λΆ„ν• λœ μ½”λ“œκ°€ μ–Έμ œ λΈŒλΌμš°μ €λ‘œ μ „μ†‘λ˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— λ³‘ν•©λ˜λŠ”μ§€ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [8]. - [[Core Web Vitals]] - μ—°κ²° 이유: μ½”λ“œ 뢄할을 μ μš©ν•˜λŠ” 주된 μ„±λŠ₯적 λͺ©μ μ€ 초기 μžλ°”μŠ€ν¬λ¦½νŠΈ 싀행을 μ΅œμ†Œν™”ν•˜μ—¬ LCP(Largest Contentful Paint)와 INP(Interaction to Next Paint) 같은 핡심 μ›Ή μ§€ν‘œλ₯Ό ν–₯μƒμ‹œν‚€λŠ” 데 μžˆμŠ΅λ‹ˆλ‹€ [1, 8, 14]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ΅œμ ν™” κ²°κ³Όκ°€ μ‹€μ œ μ‚¬μš©μžμ˜ 체감 μ„±λŠ₯ 및 νŽ˜μ΄μ§€ μΈ‘μ • μ§€ν‘œμ— μ–΄λ–»κ²Œ 긍정적 영ν–₯을 μ£ΌλŠ”μ§€ 평가할 수 μžˆμŠ΅λ‹ˆλ‹€ [15]. #### [κ΅¬ν˜„/ν™œμš© 도ꡬ] - [[React.lazy() and Suspense]] - μ—°κ²° 이유: React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ»΄ν¬λ„ŒνŠΈ 레벨 및 라우트 레벨의 동적 μ½”λ“œ 뢄할을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 곡식 APIμž…λ‹ˆλ‹€ [6, 8]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 동적 μž„ν¬νŠΈ 처리 κ³Όμ •μ—μ„œμ˜ 비동기 UI λ Œλ”λ§ 흐름과 μ˜ˆμ™Έ(μ§€μ—°) 처리 방식을 배울 수 μžˆμŠ΅λ‹ˆλ‹€ [5]. - [[Vite (Rollup)]] - μ—°κ²° 이유: 개발 및 ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ²ˆλ“€λ§ν•˜κ³  μ‹€μ œ 물리적인 청크 νŒŒμΌλ“€λ‘œ 뢄리해 λ‚΄λŠ” λ„κ΅¬μž…λ‹ˆλ‹€ [9, 11]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ²ˆλ“€λŸ¬μ˜ `manualChunks` 섀정을 톡해 μ–΄λ–»κ²Œ 벀더 λΌμ΄λΈŒλŸ¬λ¦¬μ™€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό 효율적으둜 λ‚˜λˆ„μ–΄ λΈŒλΌμš°μ € 캐싱을 ν™œμš©ν•  수 μžˆλŠ”μ§€ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [5]. ### Deeper Research Questions - 라우트 기반 λΆ„ν• κ³Ό μ»΄ν¬λ„ŒνŠΈ 기반 뢄할을 μ–΄λŠ 정도 λΉ„μœ¨λ‘œ μ μš©ν•΄μ•Ό 초기 λ Œλ”λ§ μ„±λŠ₯κ³Ό 이후 탐색 μ‹œμ˜ λ„€νŠΈμ›Œν¬ μ§€μ—° κ°„μ˜ κ· ν˜•μ„ 이룰 수 μžˆλŠ”κ°€? - Viteλ‚˜ Webpack ν™˜κ²½μ—μ„œ `manualChunks`λ₯Ό μ„€μ •ν•  λ•Œ, λΈŒλΌμš°μ €μ˜ HTTP/2 및 HTTP/3 닀쀑화(multiplexing) ν™˜κ²½μ„ κ³ λ €ν•œ κ°€μž₯ 이상적인 청크 κ°œμˆ˜μ™€ ν¬κΈ°λŠ” 무엇인가? - 동적 청크(chunk)λ₯Ό λ‘œλ“œν•˜λŠ” 도쀑 μ‚¬μš©μžμ˜ λ„€νŠΈμ›Œν¬ 연결이 λŠκΈ°κ±°λ‚˜ μ—λŸ¬κ°€ λ°œμƒν•  경우, React Error Boundaries와 κ²°ν•©ν•˜μ—¬ μ–΄λ–»κ²Œ μ•ˆμ •μ μΈ Fallback κ²½ν—˜μ„ 섀계할 것인가? - μ½”λ“œ λΆ„ν• λ‘œ 인해 μ»΄ν¬λ„ŒνŠΈκ°€ μ§€μ—° λ‘œλ“œλ  λ•Œ, ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈκ°€ μ˜μ‘΄ν•˜λŠ” μƒνƒœ(Context, Zustand λ“±)λŠ” λ‘œλ“œ μ‹œμ μ— μ–΄λ–»κ²Œ λ™κΈ°ν™”λ˜λŠ”κ°€? - Above-the-fold UI에 잘λͺ» μ§€μ—° λ‘œλ”©μ„ μ μš©ν–ˆμ„ λ•Œ LCP μ μˆ˜μ— λ―ΈμΉ˜λŠ” μ•…μ˜ν–₯을 ν™•μΈν•˜λ €λ©΄ λΈŒλΌμš°μ € 개발자 λ„κ΅¬μ˜ μ„±λŠ₯(Performance) νŒ¨λ„μ—μ„œ μ–΄λ–€ μ§€ν‘œλ₯Ό μ€‘μ μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•΄μ•Ό ν•˜λŠ”κ°€? ### Practical Application Contexts - **Implementation:** React μ½”λ“œμ—μ„œ `import { Chart } from 'chart.js'`와 같은 정적 μž„ν¬νŠΈλ₯Ό μ œκ±°ν•˜κ³ , `const HeavyComponent = React.lazy(() => import('./HeavyComponent'))`둜 κ°μ‹Έμ„œ νŠΉμ • λ²„νŠΌμ΄ λˆŒλ¦¬κ±°λ‚˜ λΌμš°νŠΈκ°€ μ „ν™˜λ  λ•Œ λ Œλ”λ§λ˜κ²Œ κ΅¬ν˜„ν•©λ‹ˆλ‹€ [4, 6, 8]. - **System Design:** μ•„ν‚€ν…μ²˜ 섀계 μ‹œ, λͺ¨λ“  μ½”λ“œκ°€ ν¬ν•¨λœ ν•˜λ‚˜μ˜ `index.js` λͺ¨λ†€λ¦¬μŠ€ λ²ˆλ“€ λŒ€μ‹ , Vite의 `vite.config.ts`μ—μ„œ `manualChunks` 섀정을 톡해 React μ½”μ–΄ 및 무거운 μ„œλ“œνŒŒν‹° 라이브러리λ₯Ό λ³„κ°œμ˜ 캐싱 κ°€λŠ₯ν•œ 청크둜 λΆ„λ¦¬ν•˜λ„λ‘ μ„€κ³„ν•©λ‹ˆλ‹€ [5, 10]. - **Operation / Maintenance:** CI/CD νŒŒμ΄ν”„λΌμΈμ΄λ‚˜ 둜컬 λΉŒλ“œ 과정에 `rollup-plugin-visualizer` λ“±μ˜ λ²ˆλ“€ 뢄석 도ꡬλ₯Ό μ—°κ²°ν•˜μ—¬ μ‹œκ°μ  νŠΈλ¦¬λ§΅μ„ ν™•μΈν•˜κ³ , 500kBλ₯Ό μ΄ˆκ³Όν•˜λŠ” κ±°λŒ€ 청크가 발견되면 좔가적인 λΆ„ν•  λŒ€μƒμ„ μ‹λ³„ν•˜μ—¬ μ΅œμ ν™”ν•©λ‹ˆλ‹€ [4, 12, 13]. - **Learning Path:** μš°μ„  React의 λ²ˆλ“€λ§ κ°œλ…μ„ μ΄ν•΄ν•œ ν›„, 동적 μž„ν¬νŠΈ ꡬ문 ν™œμš© -> `React.lazy()` 및 `` 적용 -> λΌμš°ν„°μ— μ½”λ“œ λΆ„ν•  κ²°ν•© -> λ²ˆλ“€ 뢄석기 및 Core Web Vitals 츑정을 ν†΅ν•œ 효과 검증 μˆœμ„œλ‘œ 지식을 ν™•μž₯ν•©λ‹ˆλ‹€ [6, 8]. - **My Project Relevance:** ν”„λ‘œμ νŠΈ 규λͺ¨κ°€ 컀짐에 따라 메인 μžλ°”μŠ€ν¬λ¦½νŠΈ λ²ˆλ“€μ΄ 수 λ©”κ°€λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ λ¬΄κ±°μ›Œμ Έ λͺ¨λ°”일 κΈ°κΈ° λ“±μ—μ„œ λ‘œλ”© 속도 μ €ν•˜ ν˜„μƒμ΄ 보일 경우, μ¦‰κ°μ μœΌλ‘œ 라우트 기반 μ½”λ“œ λΆ„ν• κ³Ό 차트/에디터 λ“± 무거운 UI의 μ§€μ—° λ‘œλ”©μ„ λ„μž…ν•˜μ—¬ LCP 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [3, 14, 16]. ### Adjacent Topics - [[Tree Shaking]] - ν™•μž₯ λ°©ν–₯: μ½”λ“œ 뢄할이 ν•„μš”ν•œ μ½”λ“œλ₯Ό 'μͺΌκ°œμ–΄' κ°€μ Έμ˜€λŠ” 방식이라면, 트리 쉐이킹은 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 죽은 μ½”λ“œ(Dead Code) 자체λ₯Ό λ²ˆλ“€μ—μ„œ '제거'ν•˜μ—¬ 초기 λ²ˆλ“€ 크기λ₯Ό μ€„μ΄λŠ” μƒν˜Έ 보완적인 μ΅œμ ν™” κΈ°λ²•μž…λ‹ˆλ‹€ [17, 18]. - [[Server Components (Next.js)]] - ν™•μž₯ λ°©ν–₯: ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ˜ μ½”λ“œ λΆ„ν• μ—μ„œ 더 λ‚˜μ•„κ°€, μ•„μ˜ˆ 정적인 UI λ Œλ”λ§μ„ μ„œλ²„μ—μ„œ μ²˜λ¦¬ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈλ‘œ λ³΄λ‚΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ λ²ˆλ“€μ˜ μ–‘ 자체λ₯Ό 획기적으둜 μ€„μ΄κ±°λ‚˜ μ œκ±°ν•˜λŠ” μ΅œμ‹  μ•„ν‚€ν…μ²˜ μ ‘κ·Όλ²•μž…λ‹ˆλ‹€ [19-21]. --- *Last updated: 2026-04-30*