🧠 캐싱, μ™œ ν•„μš”ν• κΉŒ?

도두맨·2025λ…„ 6μ›” 9일

곡뢀

λͺ©λ‘ 보기
14/23

유튜브 [썬의 캐싱] κ°•μ˜λ₯Ό 보고 μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.
πŸ’‘ μΊμ‹œμ˜ ν•„μš”μ„±κ³Ό λ©”λͺ¨λ¦¬ ꡬ쑰, μžλ°” & μŠ€ν”„λ§μ—μ„œμ˜ 캐싱 μ‚¬μš©λ²•κΉŒμ§€ ν•œ λ²ˆμ— 정리!


πŸ“‰ λ“€μ–΄κ°€κΈ° 전에…

  • CPU μ„±λŠ₯은 λ§€λ…„ 60%μ”© ν–₯상
  • λ©”λͺ¨λ¦¬ μ§€μ—° μ‹œκ°„μ€ 9% 정도밖에 ν–₯μƒλ˜μ§€ μ•ŠμŒ

🧠 즉, CPUλŠ” λΉ¨λΌμ§€λŠ”λ° λ©”λͺ¨λ¦¬ 응닡 속도가 병λͺ©μ΄ λ˜λŠ” ꡬ쑰!


⚑ κ·Έλž˜μ„œ ν•„μš”ν•œ 게 μΊμ‹œ(Cache)

πŸ’¬ μΊμ‹œλž€?

ꡬ뢄섀λͺ…
사전적 μ •μ˜λ°μ΄ν„°λ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜κ±°λ‚˜ λ³΄κ΄€ν•˜λŠ” 곡간
컴퓨터 κ³Όν•™μžμ£Ό μ ‘κ·Όν•˜λŠ” 데이터λ₯Ό λΉ λ₯΄κ²Œ κΊΌλ‚Ό 수 있게 볡사해 놓은 μ €μž₯μ†Œ

μΊμ‹œλ₯Ό 톡해 느린 λ©”λͺ¨λ¦¬ 접근을 쀄이고 μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆμ–΄μš”.


πŸͺ‘ μΊμ‹±μ˜ μ˜ˆμ‹œ: μ±…κ³Ό 책상

  • πŸ“š 책상 μœ„μ˜ μ±…: κ°€μž₯ 빠름 β†’ Register, Cache
  • πŸ“š μ±…μž₯ μ•ˆμ˜ μ±…: 쀑간 β†’ Main Memory
  • πŸ“š λ„μ„œκ΄€μ˜ μ±…: κ°€μž₯ 느림 β†’ Disk, External Device

μœ„λ‘œ 갈수둝 μ†λ„λŠ” λΉ λ₯΄κ³  μš©λŸ‰μ€ μž‘μŒ
μ•„λž˜λ‘œ 갈수둝 μ†λ„λŠ” 느리고 μš©λŸ‰μ€ 큼


🧠 μΊμ‹œμ˜ μ’…λ₯˜

  • 🧾 CPU μΊμ‹œ λ©”λͺ¨λ¦¬
  • 🌐 μ›Ή μΊμ‹œ
  • 🌍 λΈŒλΌμš°μ € μΊμ‹œ
  • 🧱 ν”„λ‘μ‹œ / κ²Œμ΄νŠΈμ›¨μ΄ μΊμ‹œ λ“±

πŸ–₯️ CPU μΊμ‹œλ©”λͺ¨λ¦¬

  • 인텔 μ½”μ–΄ i7 μΏΌλ“œ μ½”μ–΄ μΉ©
  • 각 μ½”μ–΄λ§ˆλ‹€ L2 μΊμ‹œκ°€ 있고, 각 코어듀이 κ³΅μœ ν•˜λŠ” Shared L3 μΊμ‹œκ°€ 있음
  • μΊμ‹œμ˜ 면적만 봐도 μ–Όλ§ˆλ‚˜ μ€‘μš”ν•œ μ§€ μ•Œ 수 있음!

πŸŒμ›Ή μΊμ‹œ

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μš”μ²­μ„ ν•˜λ©΄ 데이터λ₯Ό μ‘λ‹΅λ°›λŠ” κ³Όμ •μ—μ„œ 캐싱을 톡해 μ„œλ²„ νŠΈλž˜ν”½ λ‚΄μš©κ³Ό μ ‘κ·Ό μ‹œκ°„μ„ μ€„μž„
  • μ—¬κΈ°μ—λŠ” λΈŒλΌμš°μ € μΊμ‹œ, ν”„λ‘μ‹œ μΊμ‹œ, κ²Œμ΄νŠΈμ›¨μ΄ μΊμ‹œκ°€ μ‘΄μž¬ν•¨

βœ… λΈŒλΌμš°μ € μΊμ‹œλž€?

  • 정적 λ¦¬μ†ŒμŠ€λ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•΄ 두고
  • λ‹€μŒ μš”μ²­ μ‹œ μ„œλ²„μ— κ°€μ§€ μ•Šκ³  λΈŒλΌμš°μ € λ‚΄λΆ€μ—μ„œ λ°”λ‘œ 꺼냄

⚠️ ν”„λ‘ νŠΈ 배포 ν›„ 반영이 μ•ˆ λ˜λŠ” 것도 μΊμ‹œ λ•Œλ¬ΈμΌ 수 있음


β˜• μžλ°”μ—μ„œμ˜ 캐싱 μ˜ˆμ‹œ

둜또 λ―Έμ…˜ μ˜ˆμ‹œ 🎰

  • κ·œμΉ™: 1~45 숫자, 쀑볡 X, μ •λ ¬λœ 6개의 번호
  • ν•œ μž₯λ‹Ή LottoNumber 객체 6개 ν•„μš”
  • πŸ’₯ 1000만 μž₯ λ°œκΈ‰ β†’ 6천만 객체 생성

πŸ’‘ ν•΄κ²° 방법: 캐싱

// 클래슀 λ‘œλ”© μ‹œ μΊμ‹œ μ΄ˆκΈ°ν™”
private static final Map<Integer, LottoNumber> CACHE = new HashMap<>();

static {
    for (int i = 1; i <= 45; i++) {
        CACHE.put(i, new LottoNumber(i));
    }
}

β†’ 객체λ₯Ό 맀번 μƒμ„±ν•˜μ§€ μ•Šκ³  미리 λ§Œλ“€μ–΄λ‘” 것을 κΊΌλ‚΄μ„œ μž¬μ‚¬μš©!


🌱 μŠ€ν”„λ§μ—μ„œμ˜ 캐싱

βœ… μΊμ‹œ 좔상화(Cache Abstraction)

  • λ©”μ„œλ“œμ— @Cacheable λ“±μœΌλ‘œ μΊμ‹œ 적용
  • λ‚΄λΆ€μ μœΌλ‘œ AOP μ‚¬μš©
  • Ehcache, Redis, Caffeine λ“± κ΅¬ν˜„μ²΄μ— 의쑴 X

🧰 μ£Όμš” CacheManager μ’…λ₯˜

μ’…λ₯˜μ„€λͺ…
ConcurrentMapCacheManagerκΈ°λ³Έ map 기반 μΊμ‹œ. 가볍고 μ„€μ • ν•„μš” μ—†μŒ
SimpleCacheManagerμΊμ‹œ 직접 λ“±λ‘ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό 함
EhCacheCacheManagerEhcache μ—°λ™μš©
CaffeineCacheManagerCaffeine μ—°λ™μš©
CompositeCacheManagerμ—¬λŸ¬ μΊμ‹œ λ§€λ‹ˆμ €λ₯Ό μ‘°ν•©ν•΄ μ‚¬μš©
JCacheCacheManagerJSR-107 기반 μΊμ‹œ μ—°λ™μš©

⚠️ μ£Όμ˜ν•  점

ν•­λͺ©μ£Όμ˜ λ‚΄μš©
βœ… μ ν•©ν•œ κ²½μš°λ™μΌν•œ μš”μ²­μ— 반볡된 κ²°κ³Όλ₯Ό 쀄 수 μžˆμ„ λ•Œ
⚠️ λΆ€μ ν•©ν•œ κ²½μš°μš”μ²­λ§ˆλ‹€ κ²°κ³Όκ°€ 달라져야 ν•  λ•ŒλŠ” μ„±λŠ₯ μ €ν•˜
πŸ› οΈ κΈ°νƒ€μΊμ‹œ μ €μž₯/탐색 μž‘μ—…λ„ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜λ―€λ‘œ λ‚¨μš© κΈˆμ§€

🧠 마무리

  • μΊμ‹œλŠ” 느린 λ©”λͺ¨λ¦¬ 병λͺ©μ„ λ³΄μ™„ν•˜λŠ” 핡심 기술
  • ν”„λ‘ νŠΈ & λ°± λͺ¨λ‘μ— 적용 κ°€λŠ₯
  • μŠ€ν”„λ§μ—μ„œλŠ” @Cacheable, @CachePut λ“±μœΌλ‘œ μ‰½κ²Œ μ‚¬μš© κ°€λŠ₯

πŸ“ λ³΅μž‘ν•œ λ‘œμ§λ³΄λ‹€, 자주 μ“°μ΄λŠ” 무거운 μ—°μ‚°λΆ€ν„° μΊμ‹œ μ μš©μ„ κ³ λ―Όν•΄λ³΄μž!


πŸŽ₯ μ°Έκ³  자료

0개의 λŒ“κΈ€