위클리 페이퍼11: 대용량 트래픽 관리 - 2주차
Q3. Spring Cache에서 @Cacheable, @CachePut, @CacheEvict의 차이점과 각각을 어떤 상황에서 사용하는 것이 적절한지 설명해주세요.
Q3-1. 답변
Spring Cache는 AOP(Aspect-Oriented Programming)를 기반으로 동작하며, 비즈니스 로직에서 캐시 관련 제어 코드를 작성하지 않고 애너테이션만으로 명시하여 손쉽게 캐시를 관리할 수 있게 해준다.
@Cacheable - 캐시 저장 및 조회
- 동작 방식
- 메서드 실행 전 프록시가 캐시를 먼저 확인
- 캐시에 동일한 Key로 저장된 결과가 있다면 실제 메서드를 실행하지 않고 캐시된 값을 즉시 반환
- 만약 캐시에 값이 없다면 메서드 실행 후 그 결과를 캐시에 저장
- 적합한 사용 상황
- 조회 빈도가 높고 변경이 적은 읽기 중심의 데이터
@CachePut - 캐시 강제 갱신
- 동작 방식
@Cacheable과 달리 캐시 존재 여부와 상관없이 항상 메서드를 실행하고, 그 실행 결과를 캐시에 강제로 업데이트
- 적합한 사용 상황
- 데이터 수정 후 캐시와 DB의 일관성 유지를 위해 동기화 해야 하는 경우
@CacheEvict - 캐시 삭제
- 동작 방식
- 캐시에 저장된 특정 데이터나 전체 영역을 삭제
allEntries = true옵션으로 캐시 전체를 비우거나beforeInvocation속성을 통해 메서드 실행 전/후 언제 캐시를 비울지 세밀하게 제어 가능
- 적합한 사용 상황
- 기존 캐시 데이터가 더 이상 유효하지 않을 때
Q4. 로컬 캐시와 분산 캐시의 개념 차이와 각각의 장단점, 그리고 실무에서 어떤 기준으로 선택해야 하는지 설명해주세요.
Q4-1. 답변
캐시를 시스템의 어느 위치에 배치하는지에 따라 로컬 캐시와 분산 캐시로 나뉜다.
로컬 캐시 (Local / In-Memory Cache)
애플리케이션이 구동 중인 서버의 내부 메모리(RAM)에 직접 데이터를 저장하는 방식
- 장점
- 외부 네트워크 통신을 거치지 않기 때문에 지연 시간(Latency)이 없어서 응답 속도가 가장 빠르다
- 별도의 캐시 서버를 구축할 필요가 없기 때문에 구조가 단순하고 운영 난이도가 낮다.
- 단점
- 다중 서버 환경에서 각 서버가 독립적인 메모리를 가지기 때문에, 한 서버에서 데이터가 갱신되어도 다른 서버는 예전 데이터를 응답하는 데이터 불일치 현상이 발생
- 서버 재시작 시 캐시 데이터가 전부 사라져서 DB 부하가 일시적으로 급증할 수 있다.
분산 캐시 (Distributed Cache)
여러 대의 애플리케이션 서버가 동일한 외부 캐시 서버를 네트워크를 통해 공유하는 방식
대표적으로 Redis, Memcached 등이 있다.
- 장점
- 모든 서버가 동일한 저장소를 바라보기 때문에 데이터 일관성을 쉽게 유지할 수 있다.
- 수평 확장(Scale-out), 고가용성(Failover), 데이터 영속화(Persistence)를 지원하기 때문에 시스템 안정성이 뛰어남
- 단점
- 데이터를 가져오기 위해 TCP 등 네트워크 통신이 필요하기 때문에 속도가 상대적으로 느리다
- 캐시 서버를 별도로 구축하고 모니터링해야 하기 때문에 운영 복잡도가 높다.
실무에서 선택 기준
- 로컬 캐시
- 서비스 규모가 작고 단일 서버로 운영될 때
- 분산 캐시
- 대규모 트래픽에 대응하기 위한 서버가 여러 대 구축되어 있는 환경일 때
- 다중 레벨 캐시
- 로컬 캐시(L1 캐시)와 분산 캐시(L2 캐시)를 함께 사용해 성능과 일관성의 균형을 맞출 수 있다.
Leave a comment