πŸ€²λΆ„μ‚° ν™˜κ²½μ—μ„œμ˜ Cache μ„ νƒν•˜κΈ°

β–Ά λΆ„μ‚° μ„œλ²„ ν™˜κ²½μ—μ„œ κ³ λ €ν•˜κ³ μžˆλŠ” Cache μ „λž΅λ“€

λΆ„μ‚° μ„œλ²„λž€?

"μ—¬λŸ¬ λŒ€μ˜ μ„œλ²„(컴퓨터)κ°€ ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ²˜λŸΌ λ™μž‘ν•˜λ„λ‘ κ΅¬μ„±λœ ν™˜κ²½."

  1. μ‚¬μš©μžκ°€ Web λΈŒλΌμš°μ €λ‘œ 접속
  2. λ‘œλ“œλ°ΈλŸ°μ„œκ°€ μ—¬λŸ¬ λŒ€ μ„œλ²„ 쀑 ν•˜λ‚˜λ‘œ μš”μ²­ λΆ„λ°°
  3. 각 μ„œλ²„κ°€ ν•„μš”ν•œ 처리 μˆ˜ν–‰
  4. 곡톡 DB/μΊμ‹œ(Redis) μ ‘κ·Όν•΄μ„œ 데이터 읽기/μ“°κΈ°

즉, Spring기반이라면 μ—¬λŸ¬λŒ€μ˜ JVM을 λ„μ›Œλ†“κ³  μ‚¬μš©μžλ₯Ό λΆ„λ°°ν•˜λŠ” ν™˜κ²½μ΄λ‹€!

1. λ ˆλ””μŠ€(redis)

2. μŠ€ν‹°ν‚€ μ„Έμ…˜ μ „λž΅(Sticky Session)

3. μžλ°”μ˜ 콘컀런트 해쉬(ConcurrentHashMap)


β–Ά λΆ„μ‚° μ„œλ²„ ν™˜κ²½μ—μ„œμ˜ κ³ λ €ν•΄μ•Ό ν•  점

문제 μ„€λͺ…
데이터 일관성 문제 μ—¬λŸ¬ μ„œλ²„κ°€ λ™μ‹œμ— 데이터 μ“°λ©΄ 좩돌 κ°€λŠ₯ (ex: λ™μ‹œμ„± μ œμ–΄ ν•„μš”)
λ„€νŠΈμ›Œν¬ 이슈 μ„œλ²„ κ°„ 톡신 μ‹€νŒ¨, μ§€μ—°(latency) λ°œμƒ κ°€λŠ₯
μ„Έμ…˜/μƒνƒœ 관리 Sticky Session, Redis λ“± μ„Έμ…˜ μƒνƒœκ΄€λ¦¬ μ „λž΅ ν•„μš”
μž₯μ•  μ „νŒŒ μœ„ν—˜μ„± ν•˜λ‚˜μ˜ μž₯μ• κ°€ 전체 μ‹œμŠ€ν…œμ— νŒŒκΈ‰λ  수 있음

β–Ά 각 Cacheμ „λž΅ 별 μ„€λͺ…


1. Redis

λΆ„μ‚° ν™˜κ²½μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•œ, 독립적인 "In-memory Key-Value μ €μž₯μ†Œ"

RedisλŠ” Remote Dictionary Server.  
λ©”λͺ¨λ¦¬ 기반의 μ΄ˆκ³ μ† 데이터 μ €μž₯μ†Œ(DB처럼 μ‚¬μš© κ°€λŠ₯).
  • λ™μž‘ 원리:
    • μ„œλ²„ μ—¬λŸ¬ λŒ€(Spring μΈμŠ€ν„΄μŠ€λ“€)κ°€ κ³΅ν†΅λœ Redis μ„œλ²„μ— λ„€νŠΈμ›Œν¬λ₯Ό 톡해 접속.
    • 각 μΈμŠ€ν„΄μŠ€λŠ” ν‚€λ₯Ό 톡해 Redis에 데이터 μ €μž₯/쑰회.
    • RedisλŠ” 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜μ—¬ 맀우 λΉ λ₯Έ 읽기/μ“°κΈ° μ„±λŠ₯ 제곡.
    • 킀에 TTL(Time To Live) μ„€μ • κ°€λŠ₯: μžλ™ 만료.
  • 적용 사둀:
    • μ„Έμ…˜ μ €μž₯μ†Œ(Spring Session).
    • JWT ν‚€ 관리.
    • μΊμ‹œ(Cache) 계측.
    • λΆ„μ‚° 락(distributed locking).
  • νŠΉμ§•:
    • 인메λͺ¨λ¦¬ 기반, λ””μŠ€ν¬μ— μ˜μ†ν™” μ˜΅μ…˜ κ°€λŠ₯(AOF, RDB).
    • 볡제(replication), ν΄λŸ¬μŠ€ν„°λ§ 지원.
    • Pub/Sub(λ©”μ‹œμ§€ 브둜컀 κΈ°λŠ₯)도 있음.


2. Sticky Session

"μ‚¬μš©μžκ°€ 항상 같은 μ„œλ²„ μΈμŠ€ν„΄μŠ€λ‘œ μš”μ²­μ„ 보내도둝 κ°•μ œν•˜λŠ”" λ‘œλ“œ λ°ΈλŸ°μ‹± μ „λž΅

Sticky Session은 λ‘œλ“œλ°ΈλŸ°μ„œκ°€ μš”μ²­μ„ μ„œλ²„μ— λ¬΄μž‘μœ„λ‘œ λΆ„μ‚°ν•˜μ§€ μ•Šκ³ ,  
νŠΉμ • μ‚¬μš©μžλŠ” 항상 같은 μ„œλ²„λ‘œ λΌμš°νŒ…λ˜κ²Œ λ§Œλ“œλŠ” 방식.
  • λ™μž‘ 원리:
    • 졜초 μš”μ²­ μ‹œ, μ„œλ²„κ°€ μ„Έμ…˜ ID(cookie λ˜λŠ” HTTP 헀더)λ₯Ό λ°œκΈ‰.
    • λ‘œλ“œλ°ΈλŸ°μ„œλŠ” 이 μ„Έμ…˜ IDλ₯Ό κΈ°μ–΅ν•˜μ—¬, 이후 μš”μ²­μ„ 같은 μ„œλ²„λ‘œ 보냄.
    • μ„œλ²„ 둜컬 λ©”λͺ¨λ¦¬μ— μ„Έμ…˜ 데이터 μ €μž₯.
  • 적용 사둀:
    • κ°„λ‹¨ν•œ ꡬ쑰의 μ„œλΉ„μŠ€.
    • μ„Έμ…˜ 기반 인증(Login μƒνƒœ μœ μ§€) μ‹œμŠ€ν…œμ—μ„œ μ„œλ²„ ν™•μž₯이 ν•„μš”ν•  λ•Œ.
    • μž„μ‹œλ°©νŽΈ(quick and dirty)으둜 λΆ„μ‚°μ²˜λ¦¬ ν•  λ•Œ.
  • νŠΉμ§•:
    • μ„œλ²„ 죽으면 μ„Έμ…˜λ„ μ†Œλ©Έ.
    • μ„œλ²„ κ°„ 데이터 κ³΅μœ λŠ” λΆˆκ°€λŠ₯.
    • μŠ€μΌ€μΌ 아웃(ν™•μž₯)에 μ œμ•½μ΄ 있음.


3. ConcurrentHashMap

Java λ‚΄λΆ€μ—μ„œ μ œκ³΅ν•˜λŠ” "μŠ€λ ˆλ“œ-세이프(Thread-safe)ν•œ ν•΄μ‹œ λ§΅ κ΅¬ν˜„μ²΄"

  • 정체:
    Java Collections Framework에 ν¬ν•¨λœ λ™μ‹œμ„±-safeν•œ HashMap.
    Java 5λΆ€ν„° 제곡. λ‚΄λΆ€μ μœΌλ‘œ μ„Έκ·Έλ¨ΌνŠΈλ₯Ό 락(lock) κ±Έμ–΄ 닀쀑 μŠ€λ ˆλ“œ λ™μ‹œ μ ‘κ·Ό ν—ˆμš©.
  • μ–΄λ–»κ²Œ μž‘λ™:
    • ν•˜λ‚˜μ˜ JVM μΈμŠ€ν„΄μŠ€(Spring μ„œλ²„) λ‚΄μ—μ„œ, λ©”λͺ¨λ¦¬μ— 데이터λ₯Ό μ €μž₯.
    • 닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ„ 동기화(Concurrency Control)κ°€ λ˜μ–΄ μžˆμ–΄ μ•ˆμ •μ .
    • μ™ΈλΆ€ μ„œλ²„μ™€λŠ” μ „ν˜€ κ³΅μœ λ˜μ§€ μ•ŠμŒ β†’ 였직 '자기 μžμ‹ ' JVM λ©”λͺ¨λ¦¬.
  • 적용 사둀:
    • μš”μ²­ 쀑 κ³΅μœ λ˜λŠ” 데이터 μ €μž₯.
    • μΌμ‹œμ  데이터 μΊμ‹œ.
    • μŠ€λ ˆλ“œ κ°„ μƒνƒœ μ €μž₯.
  • νŠΉμ§•:
    • μ§„μ§œ λΉ λ₯΄λ‹€ (둜컬 λ©”λͺ¨λ¦¬ μ ‘κ·Ό).
    • μ„œλ²„ 죽으면 데이터 사라진닀.
    • μ—¬λŸ¬ μ„œλ²„μ— λ™μΌν•œ 데이터 보μž₯ λΆˆκ°€.

β–Ά 정리


  1. ConcurrentHashMap은 μŠ€λ ˆλ“œ μ„Έμ΄ν”„ν•˜κ³  맀우맀우 λΉ λ₯΄μ§€λ§Œ, λΆ„μ‚° μ„œλ²„ ν™˜κ²½μ—μ„œλŠ” μ„œλ²„κ°„ 데이터 κ³΅μœ κ°€ λΆˆκ°€λŠ₯ν•˜λ‹€. - (λ³„λ„μ˜ μ…‹νŒ… ν•„μš”)
  2. Sticky Session은 Spring의 μ…‹νŒ…μ„ λ³„λ„λ‘œ λ³€κ²½ν•˜μ§€ μ•Šκ³  μ μš©κ°€λŠ₯ν•˜λ‹€λŠ” μž₯점이 μžˆλ‹€.(λ‘œλ“œ λ²¨λŸ°μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • μ„œλ²„ κ³ μ •) ν•˜μ§€λ§Œ, νŠΉμ • μ„œλ²„μ— νŠΈλž˜ν”½μ΄ λͺ°λ¦΄ κ°€λŠ₯성이 μžˆμ–΄ λ‘œλ“œ λ²¨λŸ°μ‹± 효율이 λ–¨μ–΄μ§€κ²Œ λœλ‹€. λ˜ν•œ νŠΉμ •μ„œλ²„κ°€ 죽으면 ν•΄λ‹Ή μ„Έμ…˜μ΄ μ†Œλ©Έλ˜μ–΄ 찾을 수 μ—†κ²Œλœλ‹€.
  3. RedisλŠ” μœ„μ˜ 단점을 λͺ¨λ‘ 컀버할 수 μžˆλŠ” 방식이닀. ν•˜μ§€λ§Œ, μ„œλ²„-μ„œλ²„κ°„ 톡신이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— λ‘œμ»¬λ³΄λ‹€λŠ” 느릴 수 있고, 좔가적인 인프라 ꡬ좕 λΉ„μš©μ΄ ν•„μš”ν•˜λ‹€. λ˜ν•œ SPOF (Single Point of Failure) 이 λ°œμƒν•  수 있기 λ•Œλ¬Έμ—, Redis Cluster, Redis Replication λ“±μ˜ μ „λž΅μ΄ ν•„μš”ν•˜λ‹€.
SPOF (Single Point of Failure) μ΄λž€?

μ‹œμŠ€ν…œμ—μ„œ 단 ν•˜λ‚˜μ˜ μž₯μ•  지점이 전체 μ„œλΉ„μŠ€ μž₯μ• λ‘œ μ΄μ–΄μ§€λŠ” 것

  • μ‹œμŠ€ν…œμ˜ νŠΉμ • μ»΄ν¬λ„ŒνŠΈκ°€ μž₯μ• λ‚˜λ©΄ 전체가 λ©ˆμΆ°λ²„λ¦¬λŠ” 상황.
  • κ³ κ°€μš©μ„±(HA, High Availability)을 κΉ¨λœ¨λ¦¬λŠ” μ£Όλ²”


✨ 결둠

  • Redis인프라가 ꡬ성 λ˜μ–΄μžˆλŠ” μƒν™©μ—μ„œ, λΆ„μ‚° μ„œλ²„ μΊμ‹œλŠ” Redisκ°€ κ°€μž₯ ν•©λ¦¬μ μœΌλ‘œ 보인닀.