In-memory cache란 말 그대로 메모리(RAM) 에 데이터를 저장해서, 디스크나 데이터베이스보다 훨씬 빠르게 데이터를 읽고 쓸 수 있게 해주는 캐시를 말한다.
➡️ 쉽게 말하면,
예를 들어, 로그인한 사용자 정보를 매번 DB에서 가져오지 않고:
userCache.get(userId) // 메모리에서 빠르게 조회
이렇게 캐시에 담아두고 쓰는 방식이다.
| 항목 | 설명 |
|---|---|
| ⚡ 속도 | DB 조회보다 훨씬 빠름 (RAM 접근이니까) |
| 🔁 반복 호출 최적 | 자주 조회되는 데이터에 효과적 |
| 🔻 DB 부하 감소 | 요청이 DB까지 가지 않아서 DB 부담 줄어듦 |
| 항목 | 설명 |
|---|---|
| 메모리 사용 | 서버 메모리를 차지함 (많으면 OOM 위험) |
| 동기화 어려움 | DB와 캐시 사이 데이터 일관성 관리 필요 |
| 서버 재시작 시 초기화 | 메모리니까, 껐다 키면 날아감 |
| 기술 | 특징 |
|---|---|
✅ Caffeine | Java 앱 내에서 가장 빠른 in-memory cache |
✅ Ehcache | Spring에서 오래된 인기 캐시 라이브러리 |
✅ Redis (외부 메모리 서버) | 네트워크 기반이지만 여전히 매우 빠름, 분산 캐시로 많이 사용 |
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new CaffeineCacheManager("users");
}
}
@Cacheable(value = "users", key = "#userId")
public User getUserById(Long userId) {
return userRepository.findById(userId).orElseThrow();
}
이렇게 하면, users라는 캐시에 자동으로 저장/조회된다.
예를 들어, 검색 API에 캐시를 적용하면 좋은 이유는 "같은 요청이 반복될 때 처리 속도를 대폭 줄이고, 서버/DB 부하를 낮추기 위해서"이다.
LIKE 검색 쿼리를 수행하는 건 비용이 크다.🧠 예:
"LOL"이라는 검색어로 하루에 수천 명이 검색한다면?
→ 1번만 DB 조회 + 그 이후는 전부 캐시에서 응답 = 매우 빠름
LIKE %keyword% 같은 비효율적인 조건을 가짐 (인덱스 무시되는 경우도 많음)실시간성이 아주 중요한 검색이라면 캐시가 오히려 방해될 수 있음
키워드가 너무 다양해서 캐시 효율이 떨어지는 경우도 있음
| 항목 | 설명 |
|---|---|
| 🚀 속도 | DB 접근 없이 빠르게 결과 반환 |
| 🧠 효율 | 인기 키워드 반복 요청 최적 |
| 🧘 부하 감소 | DB 자원 낭비 줄임 |
| 💸 비용 절약 | DB 부하로 인한 비용 감소 |
원한다면 캐시 만료시간 설정, 캐시 키 설계 팁, Redis로의 확장도 가능하다.
ConcurrentMapCacheManager : Spring Boot 에서 기본 제공하는 로컬 메모리 기반 캐시 매니저 → 간단한 테스트용
CaffeineCacheManager : TTL, 용량 제한, 통계, 성능 최적화 등 실무에 적합
Redis : 데이터 저장과 캐싱에 모두 유리한 기능을 제공하는 초고속 인메모리 데이터 저장소
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
/*
캐시 적용 방법 3가지
1. ConcurrentMapCacheManager: Spring Boot 에서 기본 제공하는 로컬 메모리 기반 캐시 매니저 → 간단한 테스트용
2. CaffeineCacheManager: TTL, 용량 제한, 통계, 성능 최적화 등 실무에 적합
3. Redis: 데이터 저장과 캐싱에 모두 유리한 기능을 제공하는 초고속 인메모리 데이터 저장소
운영환경에서는 대부분 Caffeine 이나 Redis 를 사용
*/
// 2번 Caffeine 사용시
return new CaffeineCacheManager("searchPost");
// ↓ 1번으로 했을 경우
// return new ConcurrentMapCacheManager("searchPost");
}
}