✅ In-memory cache란?

졸용·2025년 5월 19일

✅ In-memory cache란?

In-memory cache란 말 그대로 메모리(RAM) 에 데이터를 저장해서, 디스크나 데이터베이스보다 훨씬 빠르게 데이터를 읽고 쓸 수 있게 해주는 캐시를 말한다.

➡️ 쉽게 말하면,

  • 어떤 데이터를 매번 DB에서 꺼내면 느리다.
  • 자주 쓰는 데이터는 메모리에 저장해 두고, DB 대신 거기서 빠르게 읽어오자는 게 in-memory cache의 핵심이다.

✔️ 예시

예를 들어, 로그인한 사용자 정보를 매번 DB에서 가져오지 않고:

userCache.get(userId) // 메모리에서 빠르게 조회

이렇게 캐시에 담아두고 쓰는 방식이다.


⭕ 장점

항목설명
⚡ 속도DB 조회보다 훨씬 빠름 (RAM 접근이니까)
🔁 반복 호출 최적자주 조회되는 데이터에 효과적
🔻 DB 부하 감소요청이 DB까지 가지 않아서 DB 부담 줄어듦

❌ 단점

항목설명
메모리 사용서버 메모리를 차지함 (많으면 OOM 위험)
동기화 어려움DB와 캐시 사이 데이터 일관성 관리 필요
서버 재시작 시 초기화메모리니까, 껐다 키면 날아감

✅ 대표적인 In-Memory Cache 기술

기술특징
CaffeineJava 앱 내에서 가장 빠른 in-memory cache
EhcacheSpring에서 오래된 인기 캐시 라이브러리
Redis (외부 메모리 서버)네트워크 기반이지만 여전히 매우 빠름, 분산 캐시로 많이 사용

✅ Spring에서 In-Memory Cache 쓰는 방법 (Caffeine 예시)

@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라는 캐시에 자동으로 저장/조회된다.



✔️ 예시 #2

예를 들어, 검색 API에 캐시를 적용하면 좋은 이유는 "같은 요청이 반복될 때 처리 속도를 대폭 줄이고, 서버/DB 부하를 낮추기 위해서"이다.


✅ 캐시 적용의 핵심 이점

1. 빠른 응답 속도

  • DB에서 매번 LIKE 검색 쿼리를 수행하는 건 비용이 크다.
  • 검색 결과를 메모리에 저장해두면, 다음 번 같은 요청에 대해 DB를 거치지 않고 즉시 반환된다.
  • 특히, 인기 키워드에 대해 검색 요청이 반복될 경우 효과 극대화.

🧠 예: "LOL"이라는 검색어로 하루에 수천 명이 검색한다면?
1번만 DB 조회 + 그 이후는 전부 캐시에서 응답 = 매우 빠름


2. DB 부하 감소

  • 검색 쿼리는 보통 LIKE %keyword% 같은 비효율적인 조건을 가짐 (인덱스 무시되는 경우도 많음)
  • 같은 검색어로 자주 요청이 들어오면 DB에 중복된 부하가 가중됨
  • 캐시 덕분에 DB가 쉬고, 다른 중요한 요청을 처리할 수 있음

3. 응답 일관성 (단기적으로)

  • 검색 결과는 자주 바뀌지 않는 경우가 많기 때문에, 캐시된 데이터를 일정 시간 사용하는 것이 문제 되지 않음
  • 자주 요청되는 결과는 빠르게, 자주 안 바뀌는 결과는 효율적으로

4. 비용 절감 (클라우드 환경에서)

  • DB 트래픽은 비용과 직결됨 (RDS 쿼리 수, IOPS 등)
  • 캐시로 불필요한 DB 접근을 막으면 비용 최적화 효과

⚠️ 언제는 안 좋을까?

  • 실시간성이 아주 중요한 검색이라면 캐시가 오히려 방해될 수 있음

    • 예: 방금 등록된 글이 검색에 즉시 반영돼야 한다면 → 캐시 무효화 전략 필요
  • 키워드가 너무 다양해서 캐시 효율이 떨어지는 경우도 있음


✅ 요약

항목설명
🚀 속도DB 접근 없이 빠르게 결과 반환
🧠 효율인기 키워드 반복 요청 최적
🧘 부하 감소DB 자원 낭비 줄임
💸 비용 절약DB 부하로 인한 비용 감소

원한다면 캐시 만료시간 설정, 캐시 키 설계 팁, Redis로의 확장도 가능하다.



✅ 캐시 적용 방법 3가지

  1. ConcurrentMapCacheManager : Spring Boot 에서 기본 제공하는 로컬 메모리 기반 캐시 매니저 → 간단한 테스트용

  2. CaffeineCacheManager : TTL, 용량 제한, 통계, 성능 최적화 등 실무에 적합

  3. Redis : 데이터 저장과 캐싱에 모두 유리한 기능을 제공하는 초고속 인메모리 데이터 저장소

  • 운영환경에서는 대부분 Caffeine 이나 Redis 를 사용

✔️ CacheManager 적용 예시

@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");
	}

}
profile
꾸준한 공부만이 답이다

0개의 댓글