데이터의 위치
로컬 캐시 (Local Cache)
애플리케이션 서버 내부 메모리(Heap)에 데이터를 저장한다.
해당 애플리케이션 서버 인스턴스 내에서만 접근이 가능하다.
Java 예시: Caffeine Cache, Ehcache, HashMap
특징: 네트워크를 지연이 없으니 속도가 매우 빠르고,
서버 메모리 용량에 한정되어 있기에 확정성은 제한적이고,
데이터의 일관성이 낮은 편이다.
분산 캐시 (Distributed Cache)
애플리케이션 서버와 분리된 별도의 캐시 전용 서버에 데이터를 저장한다.
여러 대의 서버 인스턴스가 네트워크를 통해 동일한 데이터를 공유한다.
예시: Redis, Memcached
특징: 네트워크 I/O 발생하니 속도는 상대적으로 느리지만
모든 서버가 동일 데이터를 참조하니 일관성이 높고,
확장성이 우수하다.
왜 로컬 캐시가 더 빠른가?
로컬 캐시는 데이터를 In-Process로 관리한다.
즉, 데이터 저장소와 로직 수행 주체가 동일한 메모리 공간을 사용하므로 데이터 직렬화/역직렬화(Serialization) 과정과 네트워크 전송 단계가 생략되기 때문입니다.
직렬화/역직렬화가 생략되는 이유는 Redis 같은 분산 캐시는 Java와
다른 동네에 사는 별도의 프로그램이다.
자바 입장에서는 나는 자바 객체라는 고유한 언어를 쓴다고 하고
네트워크/외부 저장소에서는 "나는 그런 복잡한 건 모르겠고,
내가 이해하기 쉽게 0과 1로 된 단순한 byte 형태의 데이터로 줘"
라고 말하고, 자바 객체를 0과 1의 덩어리로 바꾸는 직렬화 과정이 필요하다.
하지만 로컬 캐시는 자바 앱 내에서 쓰이는 것이기에 그냥 그 형태로
온전히 가져가서 이용할 수 있는 것이고, 직렬화 해야하는 이유가 전혀 없다.
왜 분산 캐시는 데이터 일관성이 유리한가?
비유를 통한 설명
로컬 캐시: "스마트폰 사진첩"
상황: 내가 찍은 사진을 내 폰 '갤러리' 앱에서 열어보는 것과 같다.
장점: 비행기 모드여도 상관없다.
누르자마자 즉시 뜨며, 데이터(네트워크)를 전혀 쓰지 않는다.
단점: 내가 내 폰에서 사진을 보정(데이터 수정)해도,
친구 폰에 있는 똑같은 사진은 바뀌지 않는다.
친구는 내가 사진을 고쳤는지조차 알 수 없다.
분산 캐시: "클라우드"
상황: 사진을 클라우드에 올려두고 확인하는 것과 같다.
장점: 내가 사진 설명을 수정하면, 친구가 자기 폰으로
접속해서 봐도 수정된 설명이 보인다.
클라우드에 접속한 모두가 항상 같은 사진을 보게 된다.
단점: 사진을 보려면 인터넷(네트워크) 연결이 필요하다.
사진첩에서 보는 것보다 로딩 속도가 미세하게나마 느릴 수밖에 없다.
실무 선택 기준
로컬 캐시를 선택해야 하는 경우
단일 서버 환경: 서버가 한 대뿐이라면 분산 캐시의 필요성이 낮습니다.
극도의 성능이 필요: 네트워크 지연시간(Latency)조차 허용되지 않는 초고속 응답이 필요한 경우.
데이터 일관성이 중요하지 않은 경우: 날씨 정보, 공지사항 등 자주 바뀌지 않거나 서버 간 데이터가 잠시 달라도 서비스에 지장이 없는 경우.
분산 캐시를 선택해야 하는 경우
다중 서버(MSA) 환경: 여러 인스턴스가 동일한 세션 정보나
공유 데이터를 참조해야 할 때.
데이터 무결성이 중요한 경우: 재고 수량, 포인트 결제 등
모든 서버가 반드시 최신 상태를 공유해야 할 때.
대용량 데이터 저장: 서버 메모리(Heap)에 담기에는
데이터 양이 너무 많아 별도의 저장 공간이 필요할 때.
보충 설명
실무에서는 성능과 일관성을 모두 잡기 위해
2차 캐시 전략(L1: 로컬, L2: 분산)을 사용하기도 한다.
자주 사용하는 데이터는 로컬에 두어 속도를 높이고,
로컬에 없으면 분산 캐시에서 찾아오는 방식이다.
다만, 이 경우 로컬 캐시 간의 동기화를 어떻게 처리할지가 설계의 핵심이 된다.