π μΉ μ¬μ΄νΈκ° λΉ¨λΌμΌ νλ μ΄μ
λ κ΅³μ΄ κ΅¬κ΅¬μ μ λ§λ‘ μ€λͺ ν νμκ° μμ μ λλ‘ λͺ ννλ€. νλ©΄μ λ‘λ© μμ΄μ½μ΄ λΉκΈλΉκΈ νμ νλ κ²μ ꡬ경νλ μ·¨λ―Έκ° μλ μ¬λμ μλ§ μμ κ²μ΄λ€. λλ¬Έμ μΉ κ°λ°μλ€μ μ¬μ©μ κ²½ν κ°μ κ³Ό μ νμ¨ μ¦κ°λ₯Ό μν΄ μ±λ₯ ν₯μμ λ§μ λ Έλ ₯μ κΈ°μΈμΈλ€.
π HTTP Caching
μΊμ(not νκΈ)λ
μΊμλ νλμ€μ΄ λ¨μ΄ "Cacher"μμ μ λλμλ€. "Cacher"λ κ°μΆλ€ λλ μ¨κΈ°λ€λΌλ μλ―Έλ₯Ό κ°μ§λ€.
μΊμλ λ°μ΄ν°λ₯Ό μΌμμ μΌλ‘ μ¨κΈ°κ±°λ 보κ΄νλ κ°λ μμ μ λνμ¬, λ°μ΄ν°λ₯Ό λΉ λ₯΄κ² μ κ·Όν μ μλλ‘ μ¨κ²¨λμ μμ μ μ₯μλ₯Ό κ°λ¦¬ν€λ μ©μ΄λ‘ μ¬μ©λκ³ μλ€. μΊμλ μμ£Ό μ¬μ©λλ λ°μ΄ν°λ μμμ μμλ‘ μ μ₯ν΄ λμ΄, λμΌν λ°μ΄ν°λ μμμ λν μμ²μ΄ μμ λ λ°λ₯΄κ² μλ΅ν μ μλλ‘ λλλ€. μΊμλ₯Ό μ΄μ©νλ©΄ λ°μ΄ν° μ κ·Ό μλλ₯Ό ν₯μ, μλ²μ λΆνλ₯Ό μ€μ΄λ©°, λ€νΈμν¬ λμνμ μ μ½ν μ μλ€.
HTTP μΊμ±
HTTP μΊμ±μ μΉ μμμ μ±λ₯μ μ΅μ ννκΈ° μν κΈ°μ λ‘, κΈ°λ³Έμ μΌλ‘ μλ²μ μλ΅μ ν΄λΌμ΄μΈνΈ λλ μ€κ° μΊμ μλ²μ μ μ₯νκ³ λμΌν μμ²μ΄ λ€μ΄μ¬ λ μ μ₯λ μλ΅μ μ¬μ¬μ©νλ λ°©μμ΄λ€. μ΄λ₯Ό ν΅ν΄ μλ²μ λΆνλ₯Ό μ€μ΄κ³ νμ΄μ§ λ‘λ© μλλ₯Ό κ°μ ν μ μλ€.
Private Caches
Private cacheλ νΉμ ν΄λΌμ΄μΈνΈμ μ°κ²°λ μΊμλ‘, λνμ μΈ μμλ λΈλΌμ°μ μΊμκ° μλ€. λ€λ₯Έ ν΄λΌμ΄μΈνΈμ 곡μ λμ§ μλ μλ΅μ΄λ―λ‘, μ¬μ©μ λ§μΆ€ν μ€μ μ΄ λ°μλ νμ΄μ§ μ½ν μΈ λ₯Ό μ μ₯νκΈ°μλ μ μ©νλ€. μλ΅ ν€λμ λ€μκ³Ό κ°μ μ€μ μ ν΅ν΄ private cacheλ₯Ό νμ±νν μ μλ€.
Cache-Control: private
Shared Cache
Shared cacheλ ν΄λΌμ΄μΈνΈμ μλ² μ¬μ΄μ μμΉνμ¬, μ¬λ¬ ν΄λΌμ΄μΈνΈ κ°μ μλ΅μ 곡μ ν μ μλ μΊμμ΄λ€. μ΄ λ°©μμ λ€νΈμν¬ νΈλν½μ μ€μ΄κ³ , μλ² λΆνλ₯Ό κ°μμν¨λ€λ μ₯μ μ΄ μμΌλ©°, ISP μΊμ, CDN λ±μ΄ μ΄μ ν΄λΉνλ€.
μμ μ€λͺ μ λ°λΌ, Private Cacheλ λΈλΌμ°μ μ μ μ₯λκ³ , Shared Cacheλ νλ‘μλ CDN, 리λ²μ€ νλ‘μ λ±μ μΊμλμ΄ μλ κ²μ νμΈν μ μλ€.
π Heuristic caching
HTTP μΊμ±μ Cache-Control ν€λ λͺ μλ₯Ό ν΅ν΄ μ§μ ν μ μλλ°, μ΄ ν€λκ° λͺ μλμ§ μμ κ²½μ°μλ μμμ μΊμνκ³ μ¬μ¬μ©νκΈ° μν λ°©λ²μ΄ λ°λ‘ ν΄λ¦¬μ€ν± μΊμ±μ΄λ€. ν΄λ¦¬μ€ν± μΊμ±μ μΊμ λ§λ£ μκ°μ λͺ μμ μΌλ‘ μ€μ νμ§ μμ μμμ λν΄μλ μΌμ κΈ°κ° λμ μλμΌλ‘ μΊμλ₯Ό μ μ©νλ€.
ν΄λ¦¬μ€ν± μΊμ±μ λμ μ리
- μλ΅ μ μ₯: HTTP μλ΅μ΄ Cache-Control ν€λ μμ΄ λ°νλ κ²½μ°, μλ΅μ Last-Modified ν€λμ κ°μ μ 보λ₯Ό λ°νμΌλ‘, μΊμκ° μ μ©λ μ μλμ§ νλ¨νλ€.
- μλ λ§λ£ κΈ°κ° μ€μ : μλ΅μ μ λ°μ΄νΈ λ μ§κ° μ€λλ κ²½μ°, μλ΅μ΄ μΌμ κΈ°κ° λμ μ ν¨ν κ²μΌλ‘ μΆμ νκ³ , μ μ ν λ§λ£ κΈ°κ°(μΌλ°μ μΌλ‘, μλ΅ μ μ₯ μμ μμλΆν°μ μκ°μ μ½ 10% μ λ)μ μ€μ νλ€.
- μΊμ μ¬μ¬μ©: ν΄λΌμ΄μΈνΈλ μ§μ λ λ§λ£ κΈ°κ° λμ μ μ₯λ μλ΅μ μ¬μ¬μ©νκ³ , λ§λ£λ κ²½μ°μλ μλ²μ μλ΅μ μμ²νλ€.
μλ₯Ό λ€μ΄, μΉ λΈλΌμ°μ κ° μλ²λ‘λΆν° μμ κ°μ μλ΅μ λ°μλ€λ©΄, Last-Modified ν€λκ° 3λ μ λ μ§λ₯Ό λνλ΄κΈ°μ μΊμλ μλ΅μ΄ μλΉ κΈ°κ° λμ μ ν¨νλ€κ³ μΆμ νμ¬ μ¬μ¬μ©νλ€.
π μ νμ λ€μ²μ§μ§ μλ ν΄λΌμ΄μΈνΈκ° λλ λ²
If-Modified-Since
ν΄λΌμ΄μΈνΈκ° λ§μ§λ§μΌλ‘ μλ΅μ λ°μ μμ μ μλ²μ μ λ¬νμ¬, κ·Έ μμ μ΄νμ 리μμ€κ° μμ λμλμ§ νμΈνλ λ°©μμ΄λ€.
1. ν΄λΌμ΄μΈνΈλ μλ²λ‘λΆν° λ°μ μλ΅μ μ μ₯
2. μλ΅μ΄ 1μκ°(Cache-Controlμ max-ageκ° 1μκ°)μ λμΌλ©΄ stale μνκ° λλ©°, ν΄λΌμ΄μΈνΈλ λ³κ²½ μ¬νμ νμΈνκΈ° μν΄ λ€μκ³Ό κ°μ μμ²μ μ μ‘
3. μλ²λ μ½ν μΈ κ° λ³κ²½λμ§ μμλ€λ©΄ 304 Not Modified μν μ½λλ‘ μλ΅νκ³ , λ³κ²½ μ¬νμ΄ μλ€λ©΄ 200 OKμ ν¨κ» μ΅μ μ½ν μΈ λ₯Ό μλ΅μΌλ‘ λ°ν
ETag/If-None-Match
μλ²λ μλ΅ λ³Έλ¬Έμ λν ν΄μκ° λλ λ²μ λ²νΈ λ±μΌλ‘ ETagμ λν κ°μ μμ±ν μ μλ€. ν΄λΌμ΄μΈνΈλ μ΄ κ°μ μ¬μ©νμ¬ μλ²μ 리μμ€ μμ μ¬λΆλ₯Ό νμΈνλ λ°©μμ΄λ€. Last-Modified ν€λλ₯Ό μ¬μ©νλ κ²½μ° λ μ§ νμμ 볡μ‘νκ³ νμ±νκΈ° μ΄λ ΅κ³ , λΆμ° μλ² νκ²½μμλ νμΌ μμ μκ°μ λκΈ°ννκΈ° μ΄λ €μ΄ λ¬Έμ λ€μ ν΄κ²°ν΄ μ€λ€.
1. μλ²λ‘λΆν° ETag ν€λκ° ν¬ν¨λ μλ΅μ λ°λλ€.
2. ν΄λΌμ΄μΈνΈλ μ΄ μλ΅μ΄ stale μνκ° λλ©΄, μ μ₯λ ETag κ°μ If-None-Match ν€λμ ν¬ν¨νμ¬ μλ²μκ² μμ²μ 보λΈλ€.
3. μλ²λ If-None-Match κ°κ³Ό μλ²μ μ μ₯λ 리μμ€μ ETag κ°μ λΉκ΅νλ€. Last-Modified ν€λλ₯Ό μ¬μ©νλ κ²½μ°μ λ§μ°¬κ°μ§λ‘, μ½ν μΈ μ λ³κ²½ μ¬νμ΄ μλ€λ©΄ 304λ₯Ό, λ³κ²½ μ¬νμ΄ μλ€λ©΄ 200μ μλ΅νλ€.
Cache Busting
μΊμ λ²μ€ν μ μΉ λ¦¬μμ€μ λ³κ²½μ λΈλΌμ°μ μΊμμ μλ² μΊμμμ μΈμν μ μλλ‘ URLμ λ³κ²½νλ κΈ°λ²μ΄λ€. μ΄ λ°©λ²μ μμμ΄ μ λ°μ΄νΈλ λλ§λ€ ν΄λΌμ΄μΈνΈκ° μ΅μ λ²μ μ λ°μ μ μλλ‘ λ³΄μ₯νλ€.
μμμ URLμ λ²μ λ²νΈλ ν΄μκ°μ ν¬ν¨μμΌ URLμ΄ λ°λ λλ§λ€ μλ‘μ΄ μμμ΄ λ‘λλλλ‘ κ°μ νμ¬, μ ν리μΌμ΄μ μ UIκ° κΉ¨μ§λ λ±μ λ²κ·Έ λ°μμ μλ°©νλ€.
Cache Busting λ°©λ²
1. λ²μ λ²νΈ νΉμ ν΄μκ°μ νμΌλͺ μ ν¬ν¨μν€κΈ°
ex) bundle.v123.js, build.v123.css
2. 쿼리 λ¬Έμμ΄μ λ²μ νΉμ ν΄μκ°μ μΆκ°νκΈ°
ex) bundle.js?v=123, build.css?v=123
WebMvcConfigurer Cache Busting μ€μ
@Configuration
public class CacheBustingWebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler(PREFIX_STATIC_RESOURCES + "/" + version.getVersion() + "/**")
.addResourceLocations("classpath:/static/")
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)).cachePublic());
}
}
μμ κ°μ΄ μ€μ νμ¬ μ μ μμμ λν Cache Bustingμ μΆκ°ν μ μλ€.
π κ²°λ‘
μμ μ μ΄μ¬ν λ€μμλ€... π₯²
μ°Έκ³ μλ£
https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#validation
'CS > λ€νΈμν¬' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
ARP(Address Resolution Protocol) (0) | 2024.04.15 |
---|---|
λ€νΈμν¬ μ£Όμ(MAC / IP Address) (0) | 2024.04.11 |
λ€νΈμν¬ ν΅μ λ°©μ (0) | 2024.04.02 |
DNS(Domain Name Service) (19) | 2024.03.30 |
[λ€νΈμν¬] HTTP μμ² λ©μλ (0) | 2024.03.10 |