https://www.felgus.dev/blog/future-spa
μ΅κ·Ό νλ‘ νΈμλ μνκ³μμ κ°μ₯ λ¨κ±°μ΄ μ£Όμ μ€ νλλ μλ² μ»΄ν¬λνΈ(Server Components) μ μλ² λ λλ§μ
λλ€. Next.jsμ κ°μ λ©ν νλ μμν¬κ° κ°κ΄λ°μΌλ©΄μ βSPAλ μ΄μ λ€μ³μ§λ κ² μλκΉ?βλΌλ λ
Όμλ μμ£Ό λ±μ₯νμ£ .
νμ§λ§ λ¨μν SPA(Single Page Application), μ¦ μ μ HTMLκ³Ό JS νμΌ νλλ‘ μμνλ μ ν리μΌμ΄μ
λ μ¬μ ν κ°λ ₯ν κ²½μλ ₯μ κ°μ§λλ€. μ€νλ € μλ‘μ΄ React κΈ°λ₯λ€μ μ μ ν νμ©νλ©΄ κΈ°μ‘΄ SPAμ νκ³λ₯Ό 극볡νκ³ ν¨μ¬ λ§€λλ¬μ΄ μ¬μ©μ κ²½ν(UX)μ μ 곡ν μ μμ΅λλ€.
μ΄ κΈμμλ SPAμμ μ μ©ν μ μλ μ΅μ μ λ΅λ€μ μ΄ν΄λ³΄κ² μ΅λλ€.
1. Render-on-Fetchμμ Render-as-You-Fetchλ‘
μ ν΅μ μΈ SPAλ λ³΄ν΅ λ€μ λ¨κ³λ‘ λμν©λλ€:
1. HTML μμ²
2. JS λ€μ΄λ‘λ ν React μ΄κΈ°ν
3. μ»΄ν¬λνΈ λ λλ§ μμ
4. μ»΄ν¬λνΈ μμμ fetch νΈμΆ
5. Suspense fallback UI νμ
6. μλ΅ λμ°© ν μ€μ UI λ λλ§
μ΄ λ°©μμ λ¨μνμ§λ§ λ€νΈμν¬ μν°ν΄μ΄ μκΈ°λ©° UI νμκ° μ§μ°λ©λλ€.
λ°λ©΄ Render-as-You-Fetch ν¨ν΄μ μ¬μ©νλ©΄ μ»΄ν¬λνΈ λ λλ§ μ§μ μ λΌμ°νΈ λ‘λ(Route Loader) λ₯Ό μ€ννμ¬ λ°μ΄ν°λ₯Ό λ 빨리 μμ²ν μ μμ΅λλ€.
μ¦, νμν λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ³Όμ κ³Ό UI λ λλ§μ λ§λ¬Όλ € λμμ μ§ννλ―λ‘ μ΄κΈ° λ°μ μλκ° κ°μ λ©λλ€.
β React Router v7, Tanstack Router κ°μ μ΅μ λΌμ°ν°κ° μ΄ ν¨ν΄μ μ§μν©λλ€.
2. μλ² μ»΄ν¬λνΈμ μ μ νμ©
μλ² μ»΄ν¬λνΈλ μ΄λ¦ κ·Έλλ‘ μλ²μμ λ λλ§ν΄μΌ ν κ²μ²λΌ λ€λ¦¬μ§λ§, κΌ κ·Έλ μ§λ μμ΅λλ€.
λΉλ λ¨κ³μμ 미리 μμ±ν μ μ Server Component Payloadλ₯Ό νμ©ν΄ SPA μμ ν¬ν¨μν¬ μλ μμ΅λλ€.
μλ₯Ό λ€μ΄, μΈμ
μνλ μ¬μ©μ μ
λ ₯κ³Ό 무κ΄ν μ»΄ν¬λνΈλ λΉλ μμ μ 미리 λ§λ€μ΄ λκ³ , SPA μ€ν μ νμν μκ° λΆλ¬μ€λ λ°©μμ
λλ€.
β μ΄λ κ² νλ©΄ μλ² νκ²½μ΄ μμ΄λ SPA μ±λ₯κ³Ό μ΄κΈ° λ‘λ© κ²½νμ κ°μ ν μ μμ΅λλ€.
3. Concurrent Features: λ λ§€λλ¬μ΄ μΈν°λμ
React 18μμ λμ
λ useTransition, useDeferredValue κ°μ λμμ± κΈ°λ₯μ λ¨μν βλν μλΉμ€ μ μ©βμ΄ μλλλ€.
νλ‘ νΈμλμμμ κ·λͺ¨(scale) λ μ¬μ©μ μκ° μλλΌ βνμ΄μ§, μνΈμμ©, μ 보 νλ¦μ 볡μ‘λβλ‘ μ μλ©λλ€.
SPAμμλ μ¬μ©μλ μ무 λλ λ€μν μΈν°λμ
μ μνν μ μκΈ° λλ¬Έμ, μ
λ°μ΄νΈμ μ°μ μμλ₯Ό λͺ
νν μ§μ νμ§ μμΌλ©΄ UXκ° μ½κ² λκΈ°κ² λ©λλ€.
λμμ± κΈ°λ₯μ νμ©νλ©΄ Reactκ° λμ μ°μ μμ μμ
λΆν° μ²λ¦¬νλλ‘ μ§μν μ μκ³ , κ·Έ κ²°κ³Ό λ λΆλλ¬μ΄ νλ©΄ μ νκ³Ό λ°μμ±μ ν보ν μ μμ΅λλ€.
4. Preloadλ₯Ό ν΅ν μ μ μ μ¬μ©μ κ²½ν
μ½λ μ€ν리ν
κ³Ό μ§μ° λ‘λ©μ μ΄λ―Έ νν κΈ°λ²μ
λλ€. νμ§λ§ μ¬κΈ°μ λ λμκ° SPA λΌμ°ν°μ Link μ»΄ν¬λνΈλ₯Ό νμ©νλ©΄ μ±λ₯μ λ ν λ¨κ³ κ°μ ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, μ¬μ©μκ° νΉμ λ§ν¬ μμ λ§μ°μ€λ₯Ό μ¬λ €λμ μκ°, λΌμ°ν°κ° ν΄λΉ νμ΄μ§μ λ°μ΄ν°μ μ½λ μ€νλ¦Ώλ JSλ₯Ό 미리 μμ²νλλ‘ νλ κ²μ
λλ€.
μ΄λ κ² νλ©΄ μ€μ νμ΄μ§ μ ν μ μ΄λ―Έ μ€λΉλ μ½ν
μΈ κ° μ¦μ νμλμ΄, λ§μΉ λ€μ΄ν°λΈ μ±μ²λΌ λ°μνλ UXλ₯Ό μ 곡ν μ μμ΅λλ€.
5. React Labsμ μ κΈ°λ₯: ViewTransition & Activity
React νμ΄ λ°νν μ€νμ κΈ°λ₯ μ€ λ κ°μ§κ° SPA UXμ νΉν μ£Όλͺ©ν λ§ν©λλ€:
β’ ViewTransitionβ¨μλ‘μ΄ μΉ νμ€μΌλ‘, νμ΄μ§ μ ν μ μ λλ©μ΄μ
μ λ λΆλλ½κ² μ μ©ν μ μλλ‘ Reactμ λΈλΌμ°μ API κ°μ κ°κ·Ήμ λ©μμ€λλ€.β¨β κ²°κ³Όμ μΌλ‘ νλ©΄ μ ν κ²½νμ΄ ν¨μ¬ μμ°μ€λ¬μμ§λλ€.
β’ Activity (ꡬ Offscreen)β¨λ λλ§κ³Ό μ»€λ° κ³Όμ μ¬μ΄μ β미리 UI μ€λ
μ·μ μ€λΉν΄λλβ κΈ°λ₯μ
λλ€.
β¨μ¦, μ»΄ν¬λνΈλ₯Ό 보μ΄μ§ μλ μνλ‘ λ λλ§ν΄λ λ€, νμν λ μ¦μ νλ©΄μ μ μ©ν μ μμ΅λλ€.β¨β μ ν μμ μμ κΈ°λ€λ¦Ό μμ΄ κ³§λ°λ‘ μλ‘μ΄ νλ©΄μ 보μ¬μ€ μ μμ΅λλ€.
μ΄ κΈ°λ₯μ Preload μ λ΅κ³Ό ν¨κ» μ¬μ©νλ©΄, νμ΄μ§ μ ν μλ λ° μ°μμ±μ΄ λν κ°μ λ©λλ€.
κ²°λ‘ : SPAλ λ λΆλλ½κ², λ λΉ λ₯΄κ²
SPAκ° μλ² λ λλ§ νλ μμν¬μ λ°λ € μ¬λΌμ§ κ±°λΌκ³ μκ°νκΈ° μ½μ§λ§, μ€νλ € λ°λμ λλ€.
β’ Render-as-you-fetch ν¨ν΄
β’ Server Componentμ μ μ νμ©
β’ Concurrent Featuresλ‘ λΆλλ¬μ΄ μΈν°λμ
β’ Preload & Activity & ViewTransitionμΌλ‘ λ€μ΄ν°λΈ κ°μ μ ν κ²½ν
μ΄ μ λ΅λ€μ κ²°ν©νλ©΄ SPAλ μ§κΈλ³΄λ€ ν¨μ¬ κ°λ ₯νκ³ μΈλ ¨λ UXλ₯Ό μ 곡ν μ μμ΅λλ€.
π μ¦, SPAμ λ―Έλλ μ±λ₯κ³Ό UXλ₯Ό λͺ¨λ κ°μΆ βλ λλν ν΄λΌμ΄μΈνΈ μ¬μ΄λ λ λλ§βμ
λλ€.
