본문 바로가기

Spring Boot/Cache

캐시 아키텍처와 종류 : 주요 캐시 솔루션 비교

캐시 솔루션이 뭐지..?

 

- 다양한 캐시 솔루션(Caffeine, Guava, EhCache, Redis, Memcached, HTTP 캐시, ORM 캐시)의 특징

- 인메모리 캐시분산 캐시의 기술적 차이

- 각 솔루션의 적합한 사용 사례

- 캐시 동작 방식과 관리 정책(TTL, Eviction, Persistence 등) 비교

- 실무 환경에서 캐시 솔루션 선택시 고려해야할 기준

 


인메모리 캐시 솔루션

1. 개념

인메모리 캐시는 애플리케이션 내부 메모리(RAM)에 데이터를 저장하여 매우 빠르게 접근할 수 있는 캐시 방식

외부 네트워크 요청이 없기 때문에 지연(latency)이 거의 발생하지 않음, 로컬 캐시(Local Cache)로 분류됨

 

2. 주요 솔루션 비교 : 카페인, 구아바 캐시, 인캐시

솔루션 특징 장점 단점 주요 사용 사례
Caffeine 최신 Java 인메모리
캐시 라이브러리
빠른 성능, 다양한 Eviction 정책 제공
(LRU, LFU, Window TinyLFU)
분산 환경 미지원 SpringBoot @Cacheable
기본 캐시 엔진으로 자주 사용
Guava Cache Google의 범용 유틸리티 라이브러리 내 포함 TTL, 크기 제한, 동시 접근 제어 최근 업데이트 적음
기능 제한
단순 캐시 구조 구현
EnCache JVM기반 캐시 라이브러리(Spring 통합 쉬움) 디스크 스왑 지원
영속성 기능
구성 복잡도 높음 캐시 용량이 큰 엔터프라이즈 시스템

 

 

3. Caffeine 예제

import가 안되길래 의존성을 추가했다. 이걸 추가하지 않으면 import 할 수 없음

    implementation 'org.springframework.boot:spring-boot-starter-cache'
    implementation 'com.github.ben-manes.caffeine:caffeine:3.1.1'

 

출처 : https://myborn.tistory.com/24

package com.codeit.caffeinetest.cache;

import com.github.benmanes.caffeine.cache.*; // import1
import java.util.concurrent.TimeUnit; // import2

public class CaffeineExample {
    public static void main(String[] args) {
        Cache<String, String> cache = Caffeine.newBuilder()
                .expireAfterWrite(3, TimeUnit.SECONDS) // TTL 3초
                .maximumSize(100) // 최대 캐시 항목의 수
                .build();

        cache.put("user:1", "Alice"); // String, String 형태의 value key
        System.out.println("[Cache Put] user:1 -> Alice");
        System.out.println(cache.getIfPresent("user:1")); // key를 통해 value를 찾음

        try {
            Thread.sleep(4000); // 대기시간
        } catch(Exception e) {

        }
        System.out.println(cache.getIfPresent("user:1")); // 대기시간 만료, null
    }
}

 

결과

오후 6:51:39: 실행 중 ':CaffeineExample.main()'...

> Task :compileJava
> Task :processResources UP-TO-DATE
> Task :classes

> Task :CaffeineExample.main()
[Cache Put] user:1 -> Alice
Alice
null

BUILD SUCCESSFUL in 5s
3 actionable tasks: 2 executed, 1 up-to-date
오후 6:51:44: 실행이 완료되었습니다 ':CaffeineExample.main()'.

 

 

* Spring Boot 3.x 기준으로 Caffeine이 기본 캐시 라이브러리에 포함된다고 한다.

그런데 내 경우엔 import가 안되기에 의존성을 추가해줬음

* Guava Cache경량 서비스나 단일 인스턴스 테스트 환경에 적합하다

* EnCache대용량 데이터나 디스크 기반 캐시를 필요로 하는 환경에 유리하다


분산 캐시 솔루션

1. 개념

분산 캐시는 외부 서버(캐시 서버)에 데이터를 저장하고, 여러 애플리케이션 인스턴스가 이를 공유하는 구조

대표적으로 Redis, Memcached가 있음

 

2. 솔루션 비교

솔루션 특징 장점 단점 사용 사례
Redis Key-Value 기반 인메모리 DB TTL, 영속성 지원,
Pub/Sub, SortedSet 등 강력한 기능들
메모리 의존성, 운영이 복잡함 세션 관리, 실시간 데이터, 랭킹 시스템 등
Memcached 단순 Key-Value 캐시 서버 빠름, 경량 TTL만 지원, 데이터 영속 불가 단순 데이터 캐싱, 트래픽 완화 등

 

3. Redis 기본 예제

 

* import redis.clients.jedis.Jedis 의존성 주입 방법에 대해서는 직접 해보면서 작성해보도록 하겠음! 

import redis.clients.jedis.Jedis;

public class RedisExample {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            jedis.setex("product:101", 10, "노트북"); // TTL 10초 설정

            String value = jedis.get("product:101");
            System.out.println("[Redis Hit] " + value);

            try { Thread.sleep(11000); } catch (Exception e) {}

            value = jedis.get("product:101");
            System.out.println("[After TTL] " + value);
        }
    }
}

 

결과

[Redis Hit] 노트북
[After TTL] null

 

 

* Redis는 단순 캐시뿐만 아니라 Pub/Sub, 세션 클러스터링, 랭킹 시스템, 큐(Queue)로도 활용됨

* Memcached는 구조가 단순하여 읽기 중심 트래픽 처리에 유리함

* Redis의 경우 maxmemory-policy를 통해 Eviction 정책(LRU, LFU, TTL 기반 등) 조정 가능


특화 캐시(HTTP / ORM)

1. HTTP 캐시

HTTP 캐시는 웹 애플리케이션 레벨에서 정적 콘텐츠(HTML, CSS, JS, 이미지 등)를 캐싱하는 방식

웹 애플리케이션 레벨에서 정적 데이터를 캐싱하는 HTTP 캐싱

 

Cache-Control : max-age, no-cache 등 캐시 정책을 설정함

ETag / Last-Modified : 변경 검증용 헤더로 조건부 요청이 가능함

CDN 연계 : Cloudflare, AWS CloudFront 등에서 정적 리소스를 캐싱함

 

2. ORM 캐시(Hibernate 예시)

ORM 캐시는 JPA / Hibernate 같은 ORM이 SQL 결과를 내부에 캐싱하여 DB 접근을 최소화하는 전략임

캐시 구분 설명 지속성
1차 캐시 EnitiyManager 단위로 동작함 요청(Request) 단위
2차 캐시 SessionFactory 전역 수준 애플리케이션 단위

 

이것도 다른 글에서 한번 해봅시다!

// Hibernate 설정 예시 (ehcache.xml)
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">
            org.hibernate.cache.ehcache.EhCacheRegionFactory
        </property>
    </session-factory>
</hibernate-configuration>

 

 

* HTTP 캐시는 정적 자산 최적화 및 CDN 활용에 필수적임

* ORM 캐시는 읽기 중심 트랜잭션에 효과적이지만, 데이터 일관성 문제가 발생할 수 있기 때문에 주의가 필요함

 


비교

구분 주요 기술 저장 위치 장점 단점 대표 사용 사례
인메모리 캐시 Caffeine, Guava, EnCache 애플리케이션 내부 초고속, 간단함 서버간 불일치 단일 서버, 설정값 캐싱
분산 캐시 Redis,
Memcached
외부 캐시 서버 일관성, 확장성 네트워크 지연 세션, 공용 데이터
HTTP 캐시 CDN, 브라우저 클라이언트 / 엣지 응답 속도 향상 정적 파일만 가능함 웹 정적 콘텐츠
ORM 캐시 Hibernate, JPA 내부 Entity Layer DB 부하 감소 일관성 관리 복잡 읽기가 많은 서비스