πΏ μΊμ(Cache)λ?
μΊμ(Cache)λ μμ£Ό μ¬μ©λλ λ°μ΄ν°λ μ°μ° κ²°κ³Όλ₯Ό μμλ‘ μ μ₯νμ¬ λΉ λ₯΄κ² μ κ·Όν μ μλλ‘ νλ μ μ₯μμ
λλ€.
μ£Όλ‘ CPU, λ©λͺ¨λ¦¬, λμ€ν¬, λ€νΈμν¬, λ°μ΄ν°λ² μ΄μ€ λ± λ€μν μμμμ μ±λ₯ μ΅μ νλ₯Ό μν΄ μ¬μ©λ©λλ€.
πΏ μΊμμ λͺ©μ κ³Ό νμμ±
1. μ±λ₯ ν₯μ
- λμΌν λ°μ΄ν°λ₯Ό λ°λ³΅μ μΌλ‘ μμ²ν κ²½μ°, μΊμμ μ μ₯λ λ°μ΄ν°λ₯Ό μ¬μ©νλ©΄ μ²λ¦¬ μλκ° λΉ¨λΌμ§.
- νΉν CPU, RAM, μΉ λΈλΌμ°μ , λ°μ΄ν°λ² μ΄μ€μμ μ±λ₯ μ΅μ νμ νμμ .
2. λΆν κ°μ
- λ°μ΄ν°λ² μ΄μ€(DB) μ‘°νλ API νΈμΆ λΉμ©μ΄ ν΄ κ²½μ°, μΊμ±μ νμ©νμ¬ μμ€ν λΆνλ₯Ό μ€μΌ μ μμ.
- νΈλν½μ΄ λ§μ μλΉμ€μμ μλ²μ λΆνλ₯Ό μ€μ΄κ³ μλ΅ μλλ₯Ό κ°μ .
3. λ€νΈμν¬ λΉμ© μ κ°
- μΊμλ₯Ό μ¬μ©νλ©΄ λΆνμν λ°μ΄ν° μμ²μ μ€μ¬ λ€νΈμν¬ νΈλν½μ μ΅μν.
- CDN(Content Delivery Network)μμ μλ³Έ μλ² λμ μΊμλ λ°μ΄ν°λ₯Ό μ 곡νμ¬ λμν μ¬μ©μ μ€μ.
πΏ μΊμμ λμ λ°©μ
μΊμλ κΈ°λ³Έμ μΌλ‘ Key-Value ννμ λ°μ΄ν° μ μ₯μλ‘ λμνλ©°, μΌλ°μ μΈ νλ¦μ λ€μκ³Ό κ°μ΅λλ€.
p.s) μΊμμ λ°©λ²λ³λ‘ λ€λ₯Ό μ μμ§λ§ κ°μ₯ κΈ°λ³Έμ μΈ ννλ₯Ό μ€λͺ !
μΌλ°μ μΈ μΊμ± νλ¦
- μμ²(Request) λ°μ
- μ¬μ©μκ° νΉμ λ°μ΄ν°λ₯Ό μμ².
- μΊμ νμΈ
- μμ²ν λ°μ΄ν°κ° μΊμμ μ‘΄μ¬νλμ§ νμΈ (Cache Hit λλ Cache Miss).
- μΊμ λ°μ΄ν° λ°ν λλ μλ³Έ λ°μ΄ν° μμ²
- Cache Hit: μΊμμ μ‘΄μ¬νλ©΄ μ¦μ λ°ν.
- Cache Miss: μΊμμ μμΌλ©΄ μλ³Έ λ°μ΄ν°(DB, API λ±)μμ κ°μ Έμ μ μ₯ ν λ°ν.

πΏ μΊμ μ λ΅(Cache Strategy)
μΊμ μ λ΅μ μλ³Έ λ°μ΄ν° μ μ₯μ(μ: λ°μ΄ν°λ² μ΄μ€)μ μΊμκ° λ°μ΄ν°λ₯Ό μ΄λ»κ² λκΈ°ννλμ§μ λν λ°©λ²λ‘ μ λλ€. μ΄ κΈμμλ λνμ μΈ μ λ΅ 4κ°μ§μ λν΄ μ 리 νμ΅λλ€!
Look-Aside μ λ΅
π κ°λ
- Cache Aside ν¨ν΄μ΄λΌκ³ λ λΆλ¦Ό.
- λ°μ΄ν°λ₯Ό μ°Ύμ λ μ°μ μΊμμ μ μ₯λ λ°μ΄ν°κ° μλ μ§ νμΈ ν μΊμμ λ°μ΄ν°κ° μμΌλ©΄ DBμμ μ‘°ν
- μΊμμ DBκ° λΆλ¦¬λμ΄ κ°μ©λλ ννμ΄λ€.
- Cache storeμ μ μ₯νλ μ£Όμ²΄κ° Server(μ ν리μΌμ΄μ )μ΄λ€.
π λμ λ°©μ
- Cache Storeμ κ²μνλ λ°μ΄ν°κ° μλ μ§ νμΈ (cache hit)
- Cache Storeμ μμ κ²½μ° DBμμ λ°μ΄ν° μ‘°ν (cache miss)
- DBμμ μ‘°νν΄μ¨ λ°μ΄ν°λ₯Ό Cache Storeμ μ λ°μ΄νΈ
π μ₯μ
- λ°λ³΅μ μΈ μ½κΈ°κ° λ§μ νΈμΆμ μ ν©νλ€.
- μΊμμ DBκ° λΆλ¦¬λμ΄ κ°μ©λκΈ° λλ¬Έμ μΊμ μ₯μ λλΉκ° μ¬μ -> λ§μΌ redisκ° λ€μ΄ λλλΌλ DBμμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μλ€.
π λ¨μ
- μΊμμ λΆμ΄μλ connectionμ΄ λ§μλ€λ©΄ , redisκ° λ€μ΄λ μκ° DBλ‘ λͺ°λ €μ λΆνκ° λ°μν μ μλ€.
- Cache Storeμ DBκ° μ ν©μ± μ μ§ λ¬Έμ κ° λ°μν μ μλ€.
Read-Through μ λ΅
π κ°λ
- μ½κΈ° μμ² μ μΊμμ λ°μ΄ν°κ° μμΌλ©΄ μΊμ μμ€ν μ΄ μ§μ μλ³Έ λ°μ΄ν°λ² μ΄μ€μμ μ‘°ν ν μΊμμ μ μ₯
- Look Aside μ λΉμ·νμ§λ§ λ°μ΄ν° λκΈ°νλ₯Ό λΌμ΄λΈλ¬λ¦¬ λλ μΊμ μ 곡μμκ² μμνλ λ°©μμ΄λΌλ μ°¨μ΄κ° μμ.
- μ΄ν λμΌν μμ²μ΄ λ€μ΄μ€λ©΄ μΊμμμ λ°μ΄ν°λ₯Ό λ°ννμ¬ DB λΆνλ₯Ό μ€μ
π λμ λ°©μ
- ν΄λΌμ΄μΈνΈκ° λ°μ΄ν° μμ²
- μΊμμμ ν΄λΉ λ°μ΄ν° μ‘°ν (Cache Hit νμΈ)
- μλ€ -> μΊμμμ μ¦μ λ°ν
- μλ€(Cache Miss) -> DBμμ λ°μ΄ν° κ°μ Έμ΄
- κ°μ Έμ¨ λ°μ΄ν°λ₯Ό μΊμμ μ μ₯ (κ°±μ )
- ν΄λΌμ΄μΈνΈμκ² λ°μ΄ν° λ°ν
π μμ μ½λ - Spring
@Cacheable(value = "users", key = "#userId")
public User getUser(Long userId) {
return userRepository.findById(userId).orElseThrow();
}
//μΊμμ userIdκ° μμΌλ©΄ DBμμ μ‘°ν ν μ μ₯
π μ₯μ
- μΊμκ° μλμΌλ‘ λ‘λ©λλ―λ‘ μΌκ΄μ± μ μ§
- DB λΆν κ°μ (μμ£Ό μ‘°νλλ λ°μ΄ν° μ΅μ ν)
π λ¨μ
- DBμμ κ²°ν©μ΄ λμ (DBκ° λ³κ²½λλ©΄ μΊμκ° μ΅μ μνλ₯Ό μ μ§νλμ§ νμΈμ΄ νμν¨)
- μ΅μ΄ μμ² μ μ§μ° λ°μ
Write-Through μ λ΅
π κ°λ
- λ°μ΄ν° λ³κ²½(μ°κΈ°) μ, μΊμμ DBμ λμμ μ μ₯
- μ΄ν μ½κΈ° μμ²μ΄ λ€μ΄μ€λ©΄ νμ μ΅μ λ°μ΄ν°κ° μΊμμ μ‘΄μ¬
π λμ λ°©μ
- ν΄λΌμ΄μΈνΈκ° λ°μ΄ν° μ λ°μ΄νΈ μμ²
- μΊμμ DBμ λμμ μ μ₯
- μ΄ν μ½κΈ° μμ²μ΄ μ€λ©΄ νμ μ΅μ λ°μ΄ν°κ° μΊμμμ λ°ν
π μμ μ½λ - Spring
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
//updateUser μ€ν μ, DBμ μΊμμ λμμ λ°μλ¨
π μ₯μ
- νμ μ΅μ λ°μ΄ν° μ μ§
- μ½κΈ° μ±λ₯ μ΅μ ν
π λ¨μ
- μ°κΈ° μ±λ₯ μ ν κ°λ₯μ± (μΊμμ DBλ₯Ό λμμ μ λ°μ΄νΈ νλ―λ‘)
- λΆνμν μΊμ μ μ₯ κ°λ₯ (μμ£Ό μ‘°νλμ§ μλ λ°μ΄ν°κΉμ§ μΊμμ μ μ₯)
Write-Around μ λ΅
π κ°λ
- μ°κΈ° μ DBμλ§ μ μ₯νκ³ , μΊμλ μ λ°μ΄νΈνμ§ μμ
- μ΄ν λ°μ΄ν° μ‘°ν μ(Cache Miss) DBμμ κ°μ Έμ μΊμμ μ μ₯
π λμ λ°©μ
- ν΄λΌμ΄μΈνΈκ° λ°μ΄ν° μ λ°μ΄νΈ μμ²
- DBμ λ°μ΄ν° μ μ₯ , μΊμλ μ λ°μ΄νΈ νμ§ μμ
- ν΄λΌμ΄μΈνΈκ° λ°μ΄ν°λ₯Ό μμ²ν λ μΊμ λ―Έμ€ λ°μ
- DBμμ λ°μ΄ν°λ₯Ό κ°μ Έμ¨ ν μΊμμ μ μ₯
- μ΄ν λμΌν μμ²μ μΊμμμ μ²λ¦¬
π Tip
λ°μ΄ν°κ° ν λ² μ°μ¬μ§κ³ , λ μμ£Ό μ½νκ±°λ μ½μ§ μλ μν©μμ μ’μ μ±λ₯μ μ 곡νλ€.
π μ₯μ
- νμ μ΅μ λ°μ΄ν° μ μ§
- μ½κΈ° μ±λ₯ μ΅μ ν
π λ¨μ
- μ°κΈ° μ±λ₯ μ ν κ°λ₯μ± (μΊμμ DBλ₯Ό λμμ μ λ°μ΄νΈ νλ―λ‘)
- λΆνμν μΊμ μ μ₯ κ°λ₯ (μμ£Ό μ‘°νλμ§ μλ λ°μ΄ν°κΉμ§ μΊμμ μ μ₯)
Write-Back(Write-Behind) μ λ΅
π κ°λ
- μ°κΈ° μμ² μ, μΊμμ λ¨Όμ μ μ₯ ν λΉλκΈ°μ μΌλ‘ DB μ λ°μ΄νΈ
- DB λΆνλ₯Ό μ€μ΄κΈ° μν΄ μΌμ μκ° λμ λ³κ²½ μ¬νμ λͺ¨μμ λ°°μΉ μ λ°μ΄νΈ
π λμ λ°©μ
- ν΄λΌμ΄μΈνΈκ° λ°μ΄ν° μ λ°μ΄νΈ μμ²
- μΊμμ λ¨Όμ μ μ₯ (μ¦μ λ°μ)
- λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€κ° λΉλκΈ°μ μΌλ‘ DB μ λ°μ΄νΈ
- μ΄ν μ½κΈ° μμ²μ μΊμμμ μ¦μ μ 곡
π μμ
@CachePut(value = "users", key = "#user.id")
public User cacheUser(User user) {
return user; // DBμλ λμ€μ λΉλκΈ° μ μ₯
}
π μ₯μ
- μ°κΈ° μ±λ₯ μ΅μ ν (DB λΆν μ΅μν)
- λΉ λ₯Έ μλ΅ μλ (μ¦μ μΊμμ λ°μ)
π λ¨μ
- λ°μ΄ν° μ μ€ κ°λ₯μ± (μΊμ μ₯μ λ°μ μ λ°μ΄ν° μμ€)
- μΌκ΄μ± λ¬Έμ (DB λ°μ μ μ μΊμκ° λ³κ²½λ μ μμ)
λΉκ΅ ν μ 리

β μΊμμ λ΅ μ ν κΈ°μ€
| μ¬μ© μ¬λ‘ | μΆμ² μΊμ μ λ΅ |
| μμ£Ό μ‘°νλλ λ°μ΄ν°, μ½κΈ° μ±λ₯ μ€μ | Read-Through , Look-Aside |
| νμ μ΅μ λ°μ΄ν° μ μ§ νμ | Write-Through |
| μ°κΈ° λΆλ΄ μ€μ΄κ³ , μμ£Ό μ‘°νλμ§ μλ λ°μ΄ν° | Write-Around |
| μ°κΈ° μ±λ₯ μ΅μ ν, λΉλκΈ° DB λ°μ κ°λ₯ | Write-Back |
πΏ μΊμ μ¬μ© μ κ³ λ €ν λΆλΆ
1. λ°μ΄ν° μΌκ΄μ± λ¬Έμ
- μΊμλ μ΅μ λ°μ΄ν°κ° μλ μ μμΌλ―λ‘, μ μ ν κ°±μ μ λ΅μ΄ νμ.
2. μΊμ μ€ν¬νΌλ(Cache Stampede) λ°©μ§
- λ€μμ ν΄λΌμ΄μΈνΈκ° λμμ μΊμ λ―Έμ€(Cache Miss) λ°μ μ, μλ² λΆν μ¦κ°.
p.s) νλ¨μ μΆκ° μ€λͺ
3. μΊμ μ€λ²ν€λ
- μΊμ λ°μ΄ν°κ° λ무 λ§μΌλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λ μ¦κ° → ν¨μ¨μ μΈ κ΄λ¦¬ νμ.
4. μΊμ μ€λ³΅(Cache Redundancy)
- μ¬λ¬ κ³μΈ΅μμ μΊμλ₯Ό μ¬μ©ν κ²½μ°, μ€λ³΅ μ μ₯μΌλ‘ μΈν΄ λΆνμν λ©λͺ¨λ¦¬ λλΉ λ°μ.
π Cache Stampede νμ
λκ·λͺ¨ νΈλν½ νκ²½μμ TTL κ°μ΄ λ무 μκ² μ€μ νλ©΄ cache stampede νμμ΄ λ°μν κ°λ₯μ±μ΄ μμ΅λλ€.
λ§μ½ Look-aside ν¨ν΄μμ redisμ λ°μ΄ν°κ° μλ€λ μλ΅μ λ°μ μλ²κ° μ§μ DBλ‘ λ°μ΄ν° μμ²ν λ€,
λ€μ redisμ μ μ₯νλ κ³Όμ μ κ±°μΉλ€. κ·Έλ°λ° μ μν©μμ keyκ° λ§λ£(Key Expires)λλ μκ° λ§μ μλ²μμ
μ΄ keyλ₯Ό κ°μ΄ λ³΄κ³ μμλ€λ©΄ λͺ¨λ μ΄ν리μΌμ΄μ μλ²μμ DBλ‘ κ°μ μ°Ύκ² λλ duplicate read κ° λ°μνλ€.
λ μ½μ΄μ¨ κ°μ κ° redisμ μ°λ duplicate writeλ λ°μλμ΄, μ²λ¦¬λλ λ€ κ°μ΄ λλ €μ§ λΏ μλλΌ λΆνμν μμ μ΄
λ§μ΄ λμ΄λ μμ²μ κ³Όλ€λ‘ μ₯μ κΉμ§ μ΄μ΄μ§ μ μλ μν©μ Cache Stampede νμμ΄λΌκ³ λΆλ¦ λλ€.
πΏ λνμ μΈ μΊμ μ¬μ© κΈ°μ
π μΈλ©λͺ¨λ¦¬ μΊμ
- Redis: κ³ μ±λ₯ Key-Value μ μ₯μλ‘, TTL, LRU λ± λ€μν μ μ± μ§μ.
- Memcached: λΆμ° μΊμ μμ€ν μΌλ‘, λΉ λ₯Έ μλλ₯Ό μ 곡νμ§λ§ μ§μμ±μ΄ μμ.
π μ ν리μΌμ΄μ μΊμ
- Spring Cache: Spring Bootμμ μΊμ±μ μ½κ² μ μ©ν μ μλλ‘ μ§μ.
- Ehcache: Java κΈ°λ° μΊμ± λΌμ΄λΈλ¬λ¦¬.
π λ€νΈμν¬ μΊμ
- Cloudflare, Akamai (CDN): μΉ μ½ν μΈ λ₯Ό μΊμ±νμ¬ μ±λ₯ ν₯μ.
- NGINX μΊμ±: μΉ μλ²μμ μ μ νμΌμ μΊμ±νμ¬ μλ΅ μλ κ°μ .
πΏ κ²°λ‘
μΊμλ μ±λ₯ μ΅μ νμ νμμ μΈ κΈ°μ λ‘, CPU, λ©λͺ¨λ¦¬, λ€νΈμν¬, λ°μ΄ν°λ² μ΄μ€ λ± λ€μν νκ²½μμ νμ©λλ©°
μ μ ν TTL μ€μ , μΊμ κ΅μ²΄ μ μ± , λκΈ°ν μ λ΅μ μ¬μ©νλ©΄ ν¨μ¨μ μΈ μΊμ±μ΄ κ°λ₯ν©λλ€.
μ£Όλ‘ Redis, DNS , CDN, λΈλΌμ°μ μΊμ± λ±μ νμ©νμ¬ μλΉμ€ μλμ μμ μ±μ ν₯μν μ μμ΅λλ€.
'Database' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| Indexλ‘ μ‘°ν μ±λ₯μ μ΅μ ν ν΄λ³΄μ(2) (0) | 2025.02.11 |
|---|---|
| Indexλ‘ μ‘°ν μ±λ₯μ μ΅μ ν ν΄λ³΄μ(1) (0) | 2025.02.11 |