─━ IT ━─

"DB야, 힘드니? 내가 대신 대답할게!" ⚡️ 느린 서비스를 구원하는 특효약, 캐시 (Cache)

DKel 2025. 9. 21. 23:00
반응형

"사이트 로딩이 너무 느려요!" 서비스가 성장하면서 사용자가 늘어날수록, 데이터베이스(DB)는 점점 더 힘겨운 비명을 지르기 시작합니다. 모든 요청이 DB까지 가서 데이터를 읽어오도록 두면, DB는 결국 과부하로 쓰러지고 서비스 전체가 마비될 수 있습니다. 🐌

이런 상황에서 우리 시스템을 구원해 줄 영웅이 바로 캐시(Cache) 입니다. 캐시는 비싼 연산이나 느린 접근을 통해 얻은 결과를, 나중에 더 빨리 접근할 수 있도록 임시로 저장해두는 더 빠른 저장소입니다.

캐시란? 자주 찾는 책을 꺼내두는 도서관 사서

캐시의 원리는 자주 방문하는 도서관에 비유할 수 있습니다. 🧑‍🏫

  1. 첫 방문 (Cache Miss): 여러분이 '컴퓨터 구조'라는 희귀한 책을 찾습니다. 사서님은 지하 서고(느린 DB)까지 한참을 내려가 책을 찾아옵니다. 시간이 꽤 걸리죠. 이것을 '캐시 미스(Cache Miss)' 라고 합니다.
  2. 캐시에 저장: 똑똑한 사서님은 "이 학생, 이 책을 또 찾을지도 몰라"라고 생각하며, 반납된 책을 지하 서고에 다시 넣는 대신, 자신의 바로 옆 책상(빠른 캐시 메모리) 위에 올려둡니다.
  3. 재방문 (Cache Hit): 다음 날, 여러분이 다시 '컴퓨터 구조' 책을 찾습니다. 사서님은 이제 지하 서고까지 갈 필요 없이, 바로 옆 책상에서 책을 꺼내줍니다. 1초도 걸리지 않죠. 이것을 '캐시 히트(Cache Hit)' 라고 합니다.

이처럼, 캐시는 비싼 DB 조회를 통해 얻은 결과를 Redis나 Memcached 같은 아주 빠른 인메모리(In-memory) 저장소에 임시로 저장해 둡니다. 똑같은 요청이 다시 들어오면, DB까지 가지 않고 캐시에서 즉시 결과를 반환하여 시스템 전체의 응답 속도를 극적으로 향상시키는 원리입니다.

똑똑한 캐시 전략: 무엇을 남기고 무엇을 버릴까?

캐시의 공간은 한정되어 있습니다. 그래서 새로운 데이터를 넣으려면, 기존의 어떤 데이터를 버릴지 결정하는 똑똑한 '캐시 교체 정책(Cache Eviction Policy)' 이 필요합니다.

  • LRU (Least Recently Used): "가장 오랫동안 안 쓴 놈, 너 나가!" 👴 가장 오랫동안 사용(참조)되지 않은 데이터를 우선적으로 삭제하는 전략입니다. "최근에 사용된 데이터는 곧 다시 사용될 가능성이 높다"는 '시간 지역성(Temporal Locality)' 원리에 기반합니다. 대부분의 캐시 시스템에서 기본적으로 사용하는, 가장 일반적이고 효율적인 전략 중 하나입니다.
  • LFU (Least Frequently Used): "가장 인기 없는 놈, 너 나가!" 📉 사용된 횟수(빈도)가 가장 적은 데이터를 우선적으로 삭제하는 전략입니다. "많이 사용된 데이터는 앞으로도 많이 사용될 것이다"라는 가정에 기반합니다. 어쩌다 한 번 사용된 데이터보다, 꾸준히 여러 번 사용된 데이터를 더 중요하게 여깁니다.
  • FIFO (First-In, First-Out): "가장 먼저 들어온 놈, 너 먼저 나가!" FIFO is a simple strategy where the first item to enter the cache is the first one to be removed. It's easy to implement but not always the most efficient.

캐시 사용 시 주의할 점: 데이터 동기화

캐시는 강력하지만 위험한 도구이기도 합니다. 가장 큰 문제는 원본 데이터(DB)와 캐시 데이터 간의 불일치입니다. 만약 DB에서 사용자의 닉네임이 '홍길동'에서 '전우치'로 변경되었는데, 캐시에는 여전히 '홍길동'이 남아있다면 어떻게 될까요? 사용자에게는 낡은 정보가 보이게 됩니다.

이 문제를 해결하기 위해 다음과 같은 전략을 사용합니다.

  • TTL (Time To Live): 캐시 데이터에 "유효 기간"을 설정합니다. 예를 들어, 5분으로 설정하면, 5분이 지난 데이터는 캐시에서 자동으로 삭제되어 다음 요청 시 DB에서 새로운 정보를 다시 읽어오게 합니다.
  • Cache Invalidation: DB의 원본 데이터가 변경(Update/Delete)될 때마다, 코드에서 직접 캐시에 있는 해당 데이터를 찾아 삭제하거나 갱신하는 '캐시 무효화' 로직을 실행합니다.

마치며

캐시는 느린 백엔드 시스템과 빠른 사용자 경험 사이의 간극을 메워주는 필수적인 다리입니다. 단순히 시스템의 속도를 높이는 것을 넘어, DB의 부하를 줄여 시스템 전체의 안정성과 확장성을 확보하는 핵심적인 역할을 하죠.

물론 데이터 동기화라는 까다로운 문제를 동반하지만, 이 '똑똑한 임시 저장소'를 잘 활용하는 능력은 현대의 개발자가 갖추어야 할 가장 중요한 역량 중 하나입니다. ✨

반응형