1. 캐싱(Caching)이란?
우리는 일상생활에서 자주 방문하는 웹사이트를 브라우저의 '즐겨찾기'나 '북마크'에 저장해두곤 한다. 매번 긴 주소를 입력하거나 검색 엔진을 거치는 대신, 북마크를 통해 빠르게 접속하기 위함이다. 이처럼 자주 사용하는 정보를 접근하기 쉬운 곳에 미리 저장해두고, 필요할 때 빠르게 꺼내 쓰는 행위가 바로 캐싱의 본질이다.
개발적인 관점에서 캐싱은 자주 사용되는 데이터(예: 데이터베이스의 유저 정보 등)를 원본 저장소보다 훨씬 빠른 임시 저장소에 보관하여 반복적인 접근 시 성능을 향상시키는 기술을 의미한다.
캐싱을 통해 얻을 수 있는 이점:
- 원본 데이터를 가져오는 데 드는 시간과 비용 절약
- 중복 연산 수행 방지를 통한 서버 부하 감소
- 전반적인 시스템 응답 속도 향상
2. 캐싱의 동작 원리와 Cache Hit Ratio
캐싱이 적용된 조회 연산은 일반적으로 다음과 같은 논리로 동작한다.
2.1. 캐싱 동작 프로세스
- 캐시 조회: 데이터를 요청받으면 먼저 캐시 저장소를 확인한다.
- 데이터 반환: 캐시에 데이터가 존재하면 즉시 반환한다. (Cache Hit)
- 원본 조회: 캐시에 데이터가 없으면 원본 데이터 저장소(DB 등)에서 데이터를 가져온다. (Cache Miss)
public Data fetchData(String key) {
// 1. 캐시에서 데이터 조회 시도
Data cachedData = cache.get(key);
// 2. 캐시 히트(Cache Hit): 존재하면 즉시 반환
if (cachedData != null) {
return cachedData;
}
// 3. 캐시 미스(Cache Miss): 없으면 DB에서 조회
return database.get(key);
}
2.2. 캐시 히트율(Cache Hit Ratio)

캐싱의 효율성을 측정하는 지표로 '캐시 히트율'을 사용한다. 이는 전체 요청 중 캐시에서 데이터를 성공적으로 찾아낸 비율을 뜻한다.
- 높은 히트율: 원본 데이터베이스 접근이 줄어들어 서버 부하가 감소하고 성능이 최적화되고 있음을 의미한다.
- 낮은 히트율: 캐싱이 효과적으로 이루어지지 않고 있음을 뜻하며, 전략 수정이 필요하다.
3. 성능과 용량 간의 트레이드오프(Trade-off)

컴퓨터 시스템은 성능과 용량 사이의 균형을 맞추기 위해 메모리 계층 구조를 사용한다.
- CPU 레지스터: 가장 빠르지만 용량이 극히 작음.
- L1/L2/L3 캐시: CPU 내부에 위치한 고속 메모리.
- 메인 메모리(RAM): 중간 정도의 속도와 크기.
- 디스크(HDD/SSD): 가장 느리지만 대용량 영구 저장이 가능함.
이 구조의 핵심은 접근 속도가 빠를수록 저장 용량이 작고 비용이 높으며, 접근 속도가 느릴수록 용량이 크고 저렴하다는 점이다. 이러한 한정된 고속 자원(캐시)을 효율적으로 활용하기 위해서는 어떤 데이터를 캐싱할지 결정하는 전략이 필요하다.
4. 데이터 지역성(Data Locality)
제한된 캐시 공간에서 효율을 극대화하기 위해 활용하는 개념이 바로 '데이터 지역성'이다. 이는 프로그램이 특정 데이터에 접근하는 특정한 패턴을 의미하며, 크게 두 가지로 나뉜다.
4.1 시간적 지역성 (Temporal Locality)
최근에 접근했던 데이터가 가까운 미래에 다시 접근될 가능성이 높다는 특성이다.
- 비유: 카카오톡 채팅 상황. 친구 A와 채팅을 주고받을 때, 채팅방을 나갔다가도 메시지가 오면 곧바로 다시 친구 A의 채팅방에 들어간다. 즉, 짧은 시간 내에 동일한 데이터(채팅방 A)를 반복해서 찾게 된다.
- 핵심: "현재 사용된 데이터는 곧 다시 사용될 가능성이 높다."
4.2 공간적 지역성 (Spatial Locality)
특정 데이터에 접근할 때, 그 주변에 있는 데이터도 곧 접근될 가능성이 높다는 특성이다.
- 비유: 책 읽기. 1페이지를 읽고 나면 자연스럽게 2페이지를 읽고, 그다음 3페이지를 읽는다. 현재 페이지에서 멀리 떨어진 랜덤한 페이지보다는 바로 인접한 데이터를 순차적으로 보게 된다.
- 핵심: "현재 접근한 데이터 주변의 데이터 역시 곧 사용될 가능성이 높다."
5. 결론
데이터 지역성을 이해하면 어떤 데이터를 캐시에 유지할지, 혹은 어떤 데이터를 미리 불러올지(Pre-fetch) 전략적으로 설계할 수 있다. 결과적으로 작은 캐시 공간으로도 시스템 전체의 성능을 극대화할 수 있게 된다.
데이터 지역성을 잘 활용하는 시스템은 가장 필요한 데이터를 선별적으로 저장하여 캐시 효율을 높인다. 이어지는 글에서는 실제 백엔드 환경에서 이러한 캐싱이 어떻게 적용되고 구체적으로 어떤 성능 이점을 제공하는지 살펴볼 예정이다.
'Database > Redis' 카테고리의 다른 글
| [Optimization-3] 캐싱 개념(3) (0) | 2025.12.28 |
|---|---|
| [Optimization-2] 캐싱 개념 (2) (0) | 2025.12.28 |
| [Basic-4] 세션 관리 (0) | 2025.07.03 |
| [Basic-3] DB 병렬 작업과 Lock 전략 (0) | 2025.07.03 |
| [Basic-2] 캐싱 전략 (0) | 2025.07.02 |
