캐시 솔루션이 뭐지..?
- 다양한 캐시 솔루션(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, 이미지 등)를 캐싱하는 방식
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 부하 감소 | 일관성 관리 복잡 | 읽기가 많은 서비스 |
'Spring Boot > Cache' 카테고리의 다른 글
| Spring Cache 추상화 : 추상화의 필요성 (0) | 2026.01.05 |
|---|---|
| 캐시 아키텍처와 종류 : 실무 캐시 아키텍처 설계 (0) | 2026.01.04 |
| 캐시 아키텍처와 종류 : 캐시 계층 구조 (0) | 2025.12.31 |
| 캐시의 기본 개념과 필요성 : 캐시 적용 고려사항 (0) | 2025.12.31 |
| 캐시의 기본 개념과 필요성 : 대용량 트래픽에서 캐시의 역할 (0) | 2025.12.21 |