위클리 페이퍼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