# [[Lazy Loading]] ## πŸ“Œ Brief Summary μ§€μ—° λ‘œλ”©(Lazy Loading)은 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ¦¬μ†ŒμŠ€(이미지, λΉ„λ””μ˜€, JavaScript μ»΄ν¬λ„ŒνŠΈ λ“±)λ₯Ό 초기 λ‘œλ”© μ‹œμ μ— λͺ¨λ‘ κ°€μ Έμ˜€μ§€ μ•Šκ³ , μ‹€μ œ 화면에 μŠ€ν¬λ‘€λ˜κ±°λ‚˜ μ‚¬μš©μžκ°€ μƒν˜Έμž‘μš©ν•˜μ—¬ ν•„μš”ν•΄μ§€λŠ” μ‹œμ κΉŒμ§€ λ‘œλ“œλ₯Ό μ—°κΈ°ν•˜λŠ” μ„±λŠ₯ μ΅œμ ν™” 기법이닀 [1-3]. 이λ₯Ό 톡해 초기 λ²ˆλ“€ 크기λ₯Ό 쀄이고 λ‘œλ“œ μ‹œκ°„μ„ λ‹¨μΆ•ν•˜μ—¬ νƒ€μž„ 투 퍼슀트 λ°”μ΄νŠΈ(TTFB)λ₯Ό κ°œμ„ ν•˜λ©° μ‚¬μš©μžκ°€ 더 λΉ λ₯΄κ²Œ μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ λ•λŠ”λ‹€ [2, 4, 5]. 주둜 React μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ΅œμ ν™”μ™€ Core Web Vitals μ§€ν‘œ ν–₯상을 μœ„ν•΄ μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…(Code Splitting)κ³Ό ν•¨κ»˜ ν•„μˆ˜μ μœΌλ‘œ μ‚¬μš©λœλ‹€ [2, 6, 7]. ## πŸ“– Core Content * **κ°œλ… 및 μž‘λ™ 원리:** μ§€μ—° λ‘œλ”©μ€ μ‚¬μš©μžκ°€ μ‹€μ œλ‘œ μš”κ΅¬ν•˜κΈ° μ „κΉŒμ§€ λ¦¬μ†ŒμŠ€ λ Œλ”λ§ 및 λ‹€μš΄λ‘œλ“œλ₯Ό λ―Έλ£¨λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€ [1]. 단일 λ²ˆλ“€λ‘œ λ¬Άμ—¬ 있던 κ±°λŒ€ν•œ JavaScriptλ‚˜ λ―Έλ””μ–΄ νŒŒμΌμ„ μž‘κ²Œ μͺΌκ°œκ³ (Code Splitting), ν•„μš”ν•  λ•Œλ§Œ μ˜¨λ””λ§¨λ“œ(on-demand)둜 뢈러였게 ν•¨μœΌλ‘œμ¨ λŒ€μ—­ν­ μ‚¬μš©μ„ 쀄이고 초기 λ Œλ”λ§ 속도와 체감 μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚¨λ‹€ [2, 4, 5]. * **HTML 및 λ―Έλ””μ–΄ 적용:** 이미지, λΉ„λ””μ˜€, iFrame λ“± 비핡심 μžμ‚°(Non-critical assets)이 뷰포트(viewport) κ·Όμ²˜μ— 도달할 λ•Œ λ‘œλ“œλ˜κ²Œ ν•˜λ©΄ LCP(Largest Contentful Paint)와 TBT(Total Blocking Time)λ₯Ό κ°œμ„ ν•  수 μžˆλ‹€ [2]. μ΅œμ‹  HTMLμ—μ„œλŠ” 이미지와 iFrame에 `loading="lazy"` 속성을 λΆ€μ—¬ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ§€μ—° λ‘œλ”©μ„ κ΅¬ν˜„ν•  수 있으며 [8], ν™”λ©΄ λ°–(offscreen)에 μžˆλŠ” μ—μ…‹μ΄λ‚˜ μ„œλ“œνŒŒν‹° μœ„μ ―μ—λ„ μ§€μ—° λ‘œλ”©μ„ μ μš©ν•˜λŠ” 것이 ꢌμž₯λœλ‹€ [9, 10]. * **Reactμ—μ„œμ˜ κ΅¬ν˜„ 및 νŒ¨ν„΄:** React ν™˜κ²½μ—μ„œλŠ” `React.lazy` ν•¨μˆ˜μ™€ `` μ»΄ν¬λ„ŒνŠΈλ₯Ό ν™œμš©ν•΄ 동적 μž„ν¬νŠΈ(dynamic import)λ₯Ό μˆ˜ν–‰ν•˜κ³  λ‘œλ”© μƒνƒœ(fallback UI)λ₯Ό μ²˜λ¦¬ν•œλ‹€ [6, 11]. * **라우트 기반 λΆ„ν•  (Route-based splitting):** μ‚¬μš©μžκ°€ νŠΉμ • νŽ˜μ΄μ§€ 경둜둜 이동할 λ•Œλ§Œ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‘œλ”©ν•˜μ—¬ 초기 λ²ˆλ“€ 크기λ₯Ό 극적으둜 쀄일 수 μžˆλ‹€ [11-13]. * **μ»΄ν¬λ„ŒνŠΈ μˆ˜μ€€ λΆ„ν•  (Component-level splitting):** νƒ­ 기반 μ½˜ν…μΈ , ν™”λ©΄ μ•„λž˜(below-the-fold) μ½˜ν…μΈ , ν˜Ήμ€ ꡐ차 κ΄€μ°°μž(Intersection Observer)λ₯Ό ν™œμš©ν•˜μ—¬ μƒν˜Έμž‘μš© λ˜λŠ” 슀크둀 μ‹œμ μ— μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‘œλ“œν•œλ‹€ [11, 14]. * μ§€μ—° λ‘œλ”© μ‹œ λ°œμƒν•  수 μžˆλŠ” λ„€νŠΈμ›Œν¬ 였λ₯˜λ‚˜ 청크 λ‘œλ”© μ‹€νŒ¨μ— λŒ€λΉ„ν•΄ 였λ₯˜ 경계(Error Boundaries)λ₯Ό μ„€μ •ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΆ©λŒμ„ λ°©μ§€ν•΄μ•Ό ν•œλ‹€ [11, 15]. * **μ„±λŠ₯ μ΅œμ ν™” μ‹œ 유의점 (Core Web Vitals):** λ¬΄λΆ„λ³„ν•œ μ§€μ—° λ‘œλ”© 적용(Over-splitting)은 μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ 크기가 큰 μ£Όμš” κΈ°λŠ₯κ³Ό λΌμš°νŠΈμ— 집쀑해야 ν•œλ‹€ [13]. λ˜ν•œ Next.js와 같은 ν”„λ ˆμž„μ›Œν¬μ˜ `next/image` μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ μžλ™ 크기 쑰절과 μ§€μ—° λ‘œλ”©μ„ κ²°ν•©ν•΄ μ‹œκ°μ  μ•ˆμ •μ„±(CLS)κΉŒμ§€ 확보할 수 μžˆλ‹€ [16]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Code Splitting]], [[Core Web Vitals]], [[Largest Contentful Paint (LCP)]], [[React.lazy and Suspense]], [[Above-the-fold Content]] - **Projects/Contexts:** [[React Frontend Performance Optimization]], [[E-commerce and SaaS Web Development]] - **Contradictions/Notes:** μ†ŒμŠ€ μžλ£Œμ— λ”°λ₯΄λ©΄ μ§€μ—° λ‘œλ”©μ€ μ„±λŠ₯ κ°œμ„ μ˜ ν•΅μ‹¬μ΄μ§€λ§Œ, "ν™”λ©΄ 상단(Above-the-fold)"에 μœ„μΉ˜ν•œ μ€‘μš”ν•œ 핡심 μ‹œκ° μ½˜ν…μΈ (예: Hero 이미지)에 μ§€μ—° λ‘œλ”©μ„ μ μš©ν•  경우 였히렀 λ Œλ”λ§μ„ μ§€μ—°μ‹œμΌœ LCP μ μˆ˜μ— μ•…μ˜ν–₯을 λ―ΈμΉœλ‹€ [8, 17]. λ”°λΌμ„œ 핡심 LCP μš”μ†Œμ—λŠ” μ§€μ—° λ‘œλ”©μ„ ν”Όν•˜κ³  `loading="eager"` λ˜λŠ” `fetchpriority="high"`와 같은 속성을 톡해 λΉ λ₯΄κ²Œ λ‘œλ“œ(Eager-load)ν•΄μ•Ό ν•œλ‹€ [17-19]. --- *Last updated: 2026-04-26*