Caching
Last updated
Last updated
Router Cache
Full Route Cache
Request Memoization
Data Cache
π μΊμ : μ»΄ν¨ν° κ³Όνμμ λ°μ΄ν°λ κ°μ 미리 볡μ¬ν΄ λμ μμ μ₯μ
π μΊμ± : μ΄λ€ λ°μ΄ν°λ₯Ό νλ²μ λ°μμ¨ νμ κ·Έ λ°μ΄ν°λ₯Ό λΆλ¬μ¨ μ μ₯μλ³΄λ€ κ°κΉμ΄ κ³³μ μμλ‘ μ μ₯νμ¬, νμμ λ λΉ λ₯΄κ² λΆλ¬μμ μ¬μ©νλ νλ‘μΈμ€
Next.jsλ μ±λ₯μ ν₯μμν€κ³ λΉμ©μ μ κ°νκΈ° μν΄ μ΅λν μΊμνλ€. κ²½λ‘λ μ μ μΌλ‘ λ λλ§ λκ³ , λ°μ΄ν° μμ²μ μΊμ λλ€λκ²μ μλ―Ένλ€.
Next.jsμλ μ¬μ©μ μΈμ
λμ κ°λ³ κ²½λ‘ μΈκ·Έλ¨ΌνΈλ‘ λΆν λ React Server Component Payload(RSC Payload)
λ₯Ό μ μ₯νλ in-memoryλ₯Ό ν΄λΌμ΄μΈνΈ μΈ‘, μΊμλ₯Ό μλ―Ένλ€.
http://localhost:3000/a
λΌλ νμ΄μ§ μμ²μ νλ©΄Router Cache
λ ν΄λΉ νμ΄μ§μ μΊμκΈ°λ‘μ νμΈνλ€. Missλ‘ νλ¨νκ² λλ©΄ μΊμνκΈ° μν μ μ°¨λ₯Ό μ§ννλ€.http://localhost:3000/b
λΌλ νμ΄μ§λ₯Ό μμ²νλ©΄Router Cache
λ ν΄λΉ νμ΄μ§μ μΊμκΈ°λ‘μ νμΈνκ³ Missλ‘ νλ¨νκ² λλ©΄ μΊμνκΈ° μν μ μ°¨λ₯Ό μ§ννλ€. λ€μhttp://localhost:3000/a
λΌλ νμ΄μ§λ₯Ό μμ²νλ©΄Router Cache
λ ν΄λΉ νμ΄μ§μ μΊμκΈ°λ‘μ νλ¨νκ³ , κΈ°λ‘μ΄ μλ€λ©΄(HIT) νμ΄μ§λ₯Ό λ€μ λ‘λ νμ§ μκ³ , Reactμ λΈλΌμ°μ μνλ₯Ό μΊμ±ν 컨ν μΈ λ₯Ό μ¬μ©μμκ² λ³΄μ¬μ€λ€.
μ¬μ©μκ° λΌμ°νΈκ°μ μ΄λνλ λμ Next.jsκ° λ°©λ¬Έν λΌμ°νΈ μΈκ·Έλ¨ΌνΈλ₯Ό μΊμνκ³ , μ¬μ©μκ° μ΄λν κ°λ₯μ±μ΄ μλ κ²½λ‘λ₯Ό 미리 κ°μ Έμ΄μΌλ‘μ μ¬μ©μμ λ€λΉκ²μ΄μ κ²½νμ ν₯μμν¨λ€.
μΊμλ λΈλΌμ°μ μ μμ λ©λͺ¨λ¦¬μ μ μ₯λλ€. λΌμ°ν° μΊμμ μ§μμκ°μ κ²°μ νλ λκ°μ§ μμλ λ€μκ³Ό κ°λ€.
Session
: μΊμλ νμ μ λ°μ κ±Έμ³ μ§μλλ€. κ·Έλ¬λ μλ‘κ³ μΉ¨ νλ©΄ μ§μμ§λ€.
μλ 무ν¨ν κΈ°κ°
: κ°λ³ μΈκ·Έλ¨ΌνΈμ μΊμλ νΉμ μκ°μ΄ μ§λλ©΄ μλμΌλ‘ 무ν¨ν λλ€. μ΄κΈ°κ°μ κ²½λ‘κ° μ μ μΌλ‘ λμ μΌλ‘ λ λλ§ λλμ§μ λ°λΌ λ¬λΌμ§λ€.
λμ μΌλ‘ λ λλ§ λ κ²½μ° : 30μ΄
μ μ μΌλ‘ λ λλ§ λ κ²½μ° : 5λΆ
β οΈ κ°λ³ μΈκ·Έλ¨ΌνΈκ° λ§μ§λ§μΌλ‘ μμΈμ€ λκ±°λ μμ±λ μκ°λΆν° μν₯μ λ°λλ€.
RootLayout.tsx νμΌμλ
<Link>
μ»΄ν¬λνΈλ₯Ό μ¬μ©ν΄μ κ²½λ‘μ΄λμ΄ κ°λ₯νλλ‘ μ§μ ν΄λμλ€.
/about, /blog/:id μ μ κ²½λ‘μ λμ κ²½λ‘λ₯Ό μ§μ ν νμ΄μ§λ₯Ό μμ±ν΄λμκ³ , ν΄λΉ νμ΄μ§κ° λ‘λλλ©΄ νμ¬ μκ°μ μΆλ ₯νλλ‘ κ΅¬ννλ€.
π§ͺ Router Cacheκ° μ μ©λμ΄, RootLayoutμ μ»΄ν¬λνΈμ μ μ©λ μκ°μ μΊμ±λμ΄ λ€λ₯Έ κ²½λ‘ μ΄λμ νμ¬ μκ°μ 보μ¬μ£Όλκ² μλλΌ, 첫 RootLayoutμ μ»΄ν¬λνΈ λ λλ§μ μΆλ ₯λμλ μκ°μ μ μ§ν΄μ 보μ¬μ€λ€.
Next.jsμμ λΌμ°νΈμ λ λλ§ κ²°κ³Όλ₯Ό μΊμ
νμ¬ μλ²μμ ν΄λΌμ΄μΈνΈλ‘μ λ°λ³΅μ μΈ λ λλ§ μμ²μ μ€μ΄κ³ , νμ΄μ§ λ‘λ μ±λ₯μ ν₯μμν¨λ€.
λΌμ°ν°μΊμ : μ¬μ©μ μΈμ λμ λΈλΌμ°μ μ React μλ² κ΅¬μ±μμ νμ΄λ‘λλ₯Ό μμλ‘ μ μ₯νλ€. μ μ λ° λμ μΌλ‘ λ λλ§λ κ²½λ‘ λͺ¨λ μ μ©λλ€.
μ 체 κ²½λ‘ μΊμ : μ¬λ¬ μ¬μ©μ μμ²μ κ±Έμ³ μλ²μμ React μλ² κ΅¬μ±μμ νμ΄λ‘λμ HTMLμ μ§μμ μΌλ‘ μ μ₯νλ€. λΉλ λλ μ¬κ²μ¦ μ€μ μ μ μΌλ‘ λ λλ§λ κ²½λ‘λ§ μΊμνλ€.
βοΈ μ 체λΌμ°νΈμΊμ(Full Route Cache)λ μλ²μΈ‘μμ νμ΄μ§μ HTMLλ λλ§ κ²°κ³Όλ₯Ό μΊμνκ³ , λΌμ°ν° μΊμ(Router Cache)λ ν΄λΌμ΄μΈνΈμΈ‘μμ μ¬μ©μκ° λ°©λ¬Έν κ²½λ‘ μΈκ·Έλ¨ΌνΈλ₯Ό μΊμνμ¬ μ¬μ©μμ κ²½λ‘ μ΄λμ λ λΉ λ₯΄κ² λ§λ λ€.
Reactλ fetch
APIλ₯Ό νμ₯νμ¬ λμΌν URLκ³Ό μ΅μ
μ κ°μ§ μμ²μ μλμΌλ‘ λ©λͺ¨νλ€. μ΄λ React μ»΄ν¬λνΈ νΈλ¦¬μ μ¬λ¬ μμΉμ λμΌν λ°μ΄ν°μ λν κ°μ Έμ€κΈ° ν¨μλ₯Ό νλ²λ§ μ€ννλ©΄μ νΈμΆν μ μμμ μλ―Ένλ€. React μ»΄ν¬λνΈκ° λ λλ§λλ λμ
μλ§ μΊμλ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ μ±λ₯μ ν₯μμν€κ³ , μ€λ³΅λ μμ²μ λ°©μ§νκΈ° μν΄ μ¬μ©λλ€.
μΌλ°μ μΌλ‘ νμ΄μ§λ₯Ό λ λλ§ν λ μλ²μμ λ°μ΄ν°λ₯Ό κ°μ ΈμμΌ νλλ°, μ΄λ₯Ό μ¬λ¬ μ»΄ν¬λνΈμμ μ€λ³΅ν΄μ μμ²νλ κ²μ λΉν¨μ¨μ μΌ μ μλ€. λ°λΌμ νλ² μμ²λ λ°μ΄ν°λ₯Ό μΊμνμ¬ μ¬λ¬ μ»΄ν¬λνΈμμ μ¬μ¬μ©ν μ μκ² νλ€.
routeμ λ λλ§νλ λμ, μ²μ νΉμ ν μμ²μ΄ νΈμΆλλ©΄ κ·Έκ²μ κ²°κ³Όλ λ©λͺ¨λ¦¬μ μ μ₯λμ§ μκ³ cacheλλ€. MISS
ν¨μκ° μ€νλκ³ μΈλΆ μμ€μμ λ°μ΄ν°λ₯Ό κ°μ Έμ κ²°κ³Όκ° λ©λͺ¨λ¦¬μ μ μ₯λλ€.SET
λμΌν λλ κ²½λ‘μμ μμ²μ νμ ν¨μ νΈμΆμ μΊμκ° λλ©° HIT
(λ°μ΄ν°λ ν¨μλ₯΄ μ€ννμ§ μκ³ ) λ©λͺ¨λ¦¬μμ λ°νλλ€.
routeκ° λ λλ§ λκ³ , λ λλ§ ν¨μ€κ° μλ£λλ©΄ λ©λͺ¨λ¦¬κ° 'μ¬μ€μ 'λκ³ , λͺ¨λ μμ² λ©λͺ¨ νλͺ©μ΄ μ§μμ§λ€.
μ΄μ μμ²μ λν μΊμλ₯Ό μ μ§νλ κ²μ λ©λͺ¨λ¦¬λ₯Ό λλΉνκ³ , λΆνμν λ°μ΄ν°λ₯Ό μ μ§νλ κ² μΌ μ μλ€. νΉν React μμλ λ λλ§κ³Ό κ΄λ ¨λ μνμ λ°μ΄ν°λ₯Ό μ΅μ μνλ‘ μ μ§νλ κ²μ΄ μ€μνλ€. λ°λΌμ λ€μ μμ²μ λν λ©λͺ¨μ΄μ μ΄μ μ μν΄ μλ‘μ΄ κ³΅κ°μ ν보νλ€.
ποΈ Request Memoizationμ νμ΄μ§ λ λλ§μ μν κ²μ΄λ―λ‘ νμ΄μ§κ° λ λλ§ λ νμλ λΉμμ€λ€
Request Memoizationμ fetch μμ²μ GET λ©μλ
μλ§ μ μ©λλ€.
Request Memoizationμ React κ΅¬μ± μμ νΈλ¦¬(React Component tree)μλ§ μ μ©λλ€.
λ©νλ°μ΄ν° μμ±, μ μ 맀κ°λ³μ, λ μ΄μμ, νμ΄μ§ λ° κΈ°ν μλ² κ΅¬μ±μμ μμ±μμ μμ²μ κ°μ Έμ€λ λ° μ μ©
Route Handlerμ κ°μ Έμ€κΈ° μμ²μ React κ΅¬μ± μμ νΈλ¦¬μ μΌλΆκ° μλλ―λ‘ μ μ©λμ§ μλλ€.
/about
νμ΄μ§λ fetch APIλ₯Ό λλ² μμ²νλ€. νμ΄μ§κ° λ λλ§ λλ©΄μhttp://localhost:4000/posts
μμ² Callμ/
νμ΄μ§μμ λ λλ§μ λ©λͺ¨μ΄μ μ΄μ λμ΄ μλ²λ‘ λΆν° μμ²νμ§ μκ³ ,http://localhost:4000/blogs
API Callμ μμ²ν΄μ λ λλ§ν νλ©΄μ 보μ¬μ€λ€.
Next.jsμμλ λ€μ΄μ€λ μλ² μμ² λ° λ°°ν¬ μ λ°μ κ±Έμ³ λ°μ΄ν° κ°μ Έμ€κΈ° κ²°κ³Όλ₯Ό μ μ§νλ λ΄μ₯ λ°μ΄ν° μΊμκ° μλ€. Next.jsκ° κΈ°λ³Έ fetch
APIλ₯Ό νμ₯νμ¬ μλ²μ κ° μμ²μ΄ μ체 μꡬ μΊμ± μλ―Έλ₯Ό μ€μ ν μ μλλ‘ νκΈ° λλ¬Έμ κ°λ₯νλ€.
fetch μμ²μ λ°μ κ²°κ³Ό(Data)κ°μ μΊμ μ²λ¦¬νλλ°, μ¬κ²μ¦νκ±°λ μ νν΄μ νμ§ μλ ν λ€μ΄μ€λ μμ² λ° λ°°ν¬ μ λ°μ κ±Έμ³ μ§μλλ€.
μ²μ λ λλ§ μ€μ fetch μμ²μ΄ νΈμΆλλ©΄, Next.jsλ μΊμλ μλ΅μ νμΈνκΈ° λ°μ΄ν° μΊμλ₯Ό νμΈνλ€.
μΊμλ μλ΅μ΄ λ°κ²¬λλ©΄ μ¦μ λ°νλκ³ , λ©λͺ¨μ΄μ μ΄μ λλ€. μΊμλ μλ΅μ΄ λ°κ²¬λμ§ μμΌλ©΄ λ°μ΄ν° μμ€λ‘ μμ²μ΄ μ΄λ£¨μ΄μ§κ³ , κ²°κ³Όκ° λ°μ΄ν° μΊμμ μ μ₯λκ³ λ©λͺ¨μ΄μ μ΄μ λλ€.
μΊμλμ§ μμ λ°μ΄ν°μ κ²½μ°(μ: { cache: 'no-store' }), νμ λ°μ΄ν° μμ€μμ κ²°κ³Όλ₯Ό κ°μ Έμ λ©λͺ¨μ΄μ μ΄μ λλ€.
λ°μ΄ν°κ° μΊμλλ ,μΊμλμ§ μλ κ΄κ³μμ΄ μμ²μ React λ λ ν¨μ€ μ€μ λμΌν λ°μ΄ν°μ λν μ€λ³΅μ νΌνκΈ° μν΄ νμ λ©λͺ¨μ΄μ μ΄μ νλ€.
μ§μμ±
Request Memoization : μμ²μ μλͺ λμλ§ μ§μλλ€. νλ²μ μμ²μμ λ€μμμ²μΌλ‘μ λ©λͺ¨μ΄μ μ΄μ λ°μ΄ν°λ μ μ§ λμ§ μλλ€.
Data Cache : μμ μμ² λ° λ°°ν¬λ₯Ό κ±°μ³λ μ§μλλ€. μ¦, μ΄μ μ μΊμλ λ°μ΄ν°λ μ¬λ € μμ² λ° μλ² λ°°ν¬κ°μ μ μ§λλ€.
π§ νλμ μμ² λμ μ ν¨ν
Request Memoization
λ€λ₯΄κ²Data Cache
λ μΌμ μκ° λμ μΉ μλ²λ‘ λ€μ΄μ€λ λͺ¨λ μμ²μ λν΄ λμνλ€. λ§μ½ next.revalidate λ₯Ό 1μ΄λ‘ μ€μ νλ€λ©΄, 1μ΄μ 1000λͺ μ μ¬μ©μκ° μ μν΄λ μ€μ API μμ²μ 1ν μ μ‘λλ€.
λ€νΈμν¬ κ΅μ°¨μ
Request Memoization : λμΌν λ λμΌ ν¨μ€(λ λλ§νλ μ€)λ΄μ μ€λ³΅ μμ² μ
λ₯Ό μ€μΌ μ μλ€.
Data Cache : μλ³Έ λ°μ΄ν° μμ€μ λν μμ²μ
λ₯Ό μ€μΌ μ μλ€.
π€ μ΄ν΄λ³΄μλ©΄, Request Memoizationλ νλμ API Callμ λν μ€λ³΅ μμ²μλ₯Ό μ€μΌ μ μκ³ , Data Cacheλ μ¬λ¬ API Callμ κ΄λ¦¬νλλ°, κ°κ°μ API Callμ λν μμ²μλ₯Ό μ€μΌ μ μλ€λ λ§λ‘ μ°μ μ΄ν΄νλ€.
μκ° κΈ°λ° μ¬κ²μ¦
: μΌμ μκ°μ΄ μ§λ ν μλ‘μ΄ μμ²μ΄ λ°μν ν λ°μ΄ν°λ₯Ό μ¬κ²μ¦
π¨ revalidate μκ°μ΄ μ§λλλΌλ 첫 μμ²μ μΊμ±λ κ°μ (STALE μνμ¬λ) λ°ννλ€λ κ²μ΄λ€. λ°ν ν λ°±κ·ΈλΌμ΄λμμ APIλ₯Ό νΈμΆν΄μ κ°μ μ λ°μ΄νΈνλλ°, κ°λ°μ μλμ λ€λ₯΄κ² λμν μ μκΈ° λλ¬Έμ μΊμλ₯Ό μ μ©ν λ μ£Όμκ° νμνλ€.
μ£Όλ¬Έν μ¬κ²μ¦
: μ΄λ²€νΈλ₯Ό κΈ°λ°μΌλ‘ λ°μ΄ν°λ₯Ό μ¬κ²μ¦
νμμ λ°λΌ κ²½λ‘( revalidatePath) λλ μΊμ νκ·Έ( revalidateTag)λ₯Ό ν΅ν΄ λ°μ΄ν°μ μ ν¨μ±μ μ¬κ²μ¦
κ°λ³ λ°μ΄ν° fetchμ κ²½μ°, μΊμ μ΅μ μ no-storeλ‘ μ€μ νμ¬ μΊμ±μμ μ μΈν μ μλ€.
Next.jsλ μ ν리μΌμ΄μ μ μ±λ₯μ ν₯μνκ³ λΉμ©μ μ κ°νκΈ° μν΄ λ λλ§ μμ κ³Ό λ°μ΄ν° μμ²μ μΊμ±ν©λλ€. Next.jsμ μΊμ± λ©μ»€λμ¦μ 4κ°μ§λ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
첫 λ²μ§Έ Router Cacheλ ν΄λΌμ΄μΈνΈ μΈ‘μμ μ¬μ©μκ° νμ΄μ§λ₯Ό μ΄λνλ λμ λ°©λ¬Έν νμ΄μ§(λΌμ°νΈ μΈκ·Έλ¨ΌνΈ)λ₯Ό μΊμνκ³ , μ¬μ©μκ° μ΄λν κ°λ₯μ±μ΄ μλ κ²½λ‘λ₯Ό 미리 κ°μ Έμ΄μΌλ‘μ¨ μ¬μ©μμ λ΄λΉκ²μ΄μ κ²½νμ ν₯μν©λλ€. Router Cacheλ νμ΄μ§κ° μλ‘κ³ μΉ¨ λκ±°λ, μ μ λλ λμ κ²½λ‘μ μν΄ μ§μ λλ νΉμ μκ°μ΄ μ§λλ©΄ μλμΌλ‘ μΊμ± μ²λ¦¬λ₯Ό 무ν¨ν ν©λλ€.
λ λ²μ§Έ Full Route Cacheλ λΉλμ μ μ μΌλ‘ λ λλ§ λ κ²½λ‘λ§ HTML λ λλ§μ κ²°κ³Όλ₯Ό μΊμ νμ¬ μλ²μμ ν΄λΌμ΄μΈνΈλ‘μ λ°λ³΅μ μΈ λ λλ§ μμ²μ μ€μ΄κ³ νμ΄μ§ λ‘λ μ±λ₯μ ν₯μν©λλ€.
μΈ λ²μ§Έ Request Memoizationμ νλμ νμ΄μ§κ° λ λλ§νλ λμ λμΌν URLκ³Ό μ΅μ μ κ°μ§ μμ²μ μλμΌλ‘ λ©λͺ¨μ΄μ μ΄μ ν©λλ€. λμΌν λ°μ΄ν°μ λν μμ² ν¨μλ₯Ό μ¬λ¬ κ³³μμ νΈμΆν΄μΌ ν λ ν λ²λ§ μ€ννμ¬ κ²°κ΄κ°μ μΊμ±νμ¬ μ€λ³΅λ μμ²μ λ°©μ§νκΈ° μν΄ μ¬μ©λ©λλ€. fetch μμ²μ GET λ©μλμμλ§ μ μ©λ©λλ€.
λ€ λ²μ§Έ Data Cacheλ fetch APIλ₯Ό νμ₯νμ¬ μλ²μ κ° μμ² λ°μ κ²°κ΄κ°(λ°μ΄ν°)μ μλ² μμ² λ° λ°°ν¬ κ°μ μ μ§νλ λ΄μ₯λ μΊμμ λλ€. μ¬κ²μ¦νκ±°λ μ΅μ μ λ³κ²½νμ§ μλ ν λ€μ΄μ€λ μμ² λ° λ°°ν¬ μ λ°μ κ±Έμ³ μꡬμ μΌλ‘ μμ²λ°μ κ²°κ΄κ°μ΄ μ§μλ©λλ€. μ μ νκ² μΊμ± μ²λ¦¬λ₯Ό 무ν¨ν ν΄μΌ ν©λλ€. μΌμ μκ°μ΄ μ§λ ν μλ‘μ΄ μμ²μ΄ λ°μνλ©΄ λ°μ΄ν°λ₯Ό μ¬κ²μ¦νλ μκ° κΈ°λ°μΌλ‘ κ²μ¦νλ λ°©μμ΄ μκ³ , νμμ λ°λΌ κ²½λ‘(revalidatePath) λλ νκ·Έ(revalidateTag)λ₯Ό μ΄λ²€νΈμ μ°κ²°νμ¬ λ°μ΄ν°μ μ ν¨μ±μ κ²μ¦νλ λ°©μμ΄ μμ΅λλ€. κ°λ³μ μΈ μμ²μ κ²½μ°μλ μΊμ μ΅μ μ no-store(μ: { cache: 'no-store' })λ‘ μ€μ νμ¬ μΊμ±μμ μ μΈν μλ μμ΅λλ€.