캐시란 무엇일까

일상 회고록·2024년 5월 15일
0
post-thumbnail
post-custom-banner

안녕하세요!

바쁜 시간들을 보내다가 오랜만에 새로운 내용으로 돌아왔습니다.

취준은 바쁘고 힘들지만, 큰 성장의 기회라고 생각하고 열심히 공부해 나가겠습니다😎

이번 포스트에서는 시스템을 만들 때 한 번쯤 떠올리고, 고려해보는 캐시에 대해서 다룰예정입니다!

캐시는 무엇이고, 어떤 방법들이 있는지와 실제 스프링에서 어떤식으로 사용되는지 예제까지 한번 살펴보도록 하겠습니다

그럼 시작하겠습니다💨💨💨

1. 캐시(Cache)란?

캐시 메모리는 메인 메모리와 CPU간의 속도 향상을 위한 작은 메모리 공간입니다.

CPU 안에 존재하거나 외에 존재하며, 자주 사용하는 데이터 혹은 값을 미리 복사해 놓는 임시 장소입니다.

즉, 자주 사용되는 데이터는 캐시 메모리에 접근하여 빠르게 가져올 수 있습니다.

위와 같은 저장공간 계층 구조에서 L1~L3 캐시 공간에 저장됩니다.

1-1. 어떤 데이터를 다루나

모든 데이터를 캐시에 담아서 사용하면 좋겠지만, 현실은 그럴수 없기에 데이터를 선별해야합니다.

그럼 어떤 데이터를 캐시에 담아야 할까요?

이때 사용하는 개념이 지역성입니다.

지역성이란 기억장치 내의 데이터에 균일하게 접근하는 것이 아닌, 어느 한 순간에 특정 부분을 집중적으로 참조하는 특성을 말합니다.


시간적 지연성

특정 데이터가 한 번 접근 되었을 경우, 가까운 미래에도 동일 데이터에 접근할 가능성이 높은 것을 말합니다.

메모리 상의 같은 주소에 여러 차례 읽기 쓰기를 수행하는 경우 작은 크기의 캐시로도 큰 효율성을 얻을 수 있습니다.

공간적 지연성

특정 데이터와 서로 인접한 데이터들이 가까운 미래에도 다시 접근할 가능성이 높은 것을 말합니다.

즉, 주변에 초점이 좀 더 맞춰저 있습니다.

CPU캐시나 디스크 캐시의 경우 한 메모리 주소에 접근할 때 해당 주소뿐만 아니라 해당 블록을 전부 캐시에 가져옵니다.

이때 메모리 주소를 순차적으로 접근하면, 캐시에 같은 블록이 담겨 있기 때문에 캐시의 효율성이 높아집니다.

순차 지역성

특정 조건이 존재하지 않는 한 데이터에 순차적으로 접근하는 경향을 의미합니다. 공간적 지역성에 포함되어 설명되기도 합니다.

위와같은 지역성을 통해 캐시에 담을 데이터들을 선별합니다.

1-2. 언제 사용할까?

캐시의 목적은 DB에 매번 접근하여 데이터를 조회하는 것보다 빠르고 효율적으로 데이터를 가져오기 위함에 있습니다.

따라서 아래와 같은 경우 캐시의 사용을 고려하면 좋습니다.

  • 원본 데이터에 접근하는 시간이 더 오래걸리는 경우
  • 반복적으로 동일한 결과를 반환하는 경우 (이미지 혹은 썸네일)
  • 자주 접근하고, 수정이 잦지 않은 데이터

캐시에 데이터를 미리 복사해 놓기 때문에 계산이나 DB에 접근하지 않고 빠른 속도로 데이터를 조회할 수 있습니다.

만약 원하는 데이터가 캐시에 저장되어 있는 경우, 이를 Cache Hit 이라고 합니다.

반면 원하는 데이터가 없는 경우 Cache Miss라고 합니다. 즉, 원본 데이터를 조회하여 전달한 후, 캐시에 담아야합니다.

1-3. 캐싱 종류

데이터베이스 캐싱

  • DB 쿼리는 DB 서버애서 수행되기 때문에 속도가 느려지고, 부하가 몰릴 수 있습니다.
  • 결과 값을 미리 DB에 캐싱함으로써 응답 시간을 향상 시킬 수 있습니다.
  • 여러 데이터베이스는 캐싱을 위한 기능을 기본적으로 지원합니다.

응답 캐싱

  • 가장 많이 사용되는 캐싱 방법입니다.
  • 웹 서버의 응답을 메모리에 캐싱합니다.
  • Local Cache와 Global Cache 가 있습니다.

1-4. 응답 캐싱 종류


Local Cache

  • 로컬 서버 내부 저장소에 데이터를 보관합니다
  • Application에서 바로 접근하기 때문에 속도가 빠르지만, 다중 서버 환경에서는 중복 데이터, 동기화 문제 등이 발생할 수 있습니다.
  • 종류에는 EhCache, Caffeine 등이 있습니다.

Global Cache

  • 서버와 분리된 별도의 캐시 서버에 데이터를 보관합니다.
  • Application에서 접근할 때 I/O가 발생하기 때문에 상대적으로 느리지만, 중복데이터, 동기화 문제를 해결할 수 있습니다.
  • 종류에는 Redis, Memcache, Couchbase 등이 있습니다.

만약 데이터의 양이 많지 않고, 중복 저장되어도 부하가 적고, 데이터의 일관성이 깨져도 비지니스에 큰 영향이 없는 데이터라면 Local Caching 방식이 적절합니다.

(반대의 경우는 Global Caching)

여기까지 캐시에 대한 기본 개념들을 알아보았습니다.

실제 예제를 통해 좀 더 깊게 알아볼까요?

2. Spring Cache

그렇다면 실제로 스프링에서 캐시를 사용하는 방법에 대해 알아보도록 하겠습니다.

캐싱을 사용하기 위해선 두가지 방법이 존재합니다.

  • Redis, Memcached 등 같은 MemoryDB를 사용
  • Application 레벨에서 사용가능한 EhCache 등

갓프링답게 캐시 기능의 추상화를 지원하여, EhCache, Couchbase, Redis 등의 추가적인 캐시 저장소와 빠르게 연동하여 빈으로 설정하도록 도와줍니다.

Ehcache는 스프링에서 간단하게 사용할 수 있는 Java 기반 오픈소스 라이브러리입니다.
Spring AOP 기능을 활용하여 Annotation을 이용해 간단하게 사용 가능합니다.

추가적인 캐시 저장소를 연결하지 않는다면, ConcurrentHashMap 기반의 맵 저장소가 자동으로 추가됩니다.

2-1. Annotation

앞서 말했던 것처럼 스프링은 AOP기반으로 메소드에 캐싱을 적용할 수 있도록 어노테이션들을 제공해줍니다.

  • @Cacheable
    • 캐시를 저장 / 조회
    • 해당 어노테이션이 있는 매소드를 실행하면 캐시를 조회하여 데이터를 반환하거나, 없을 경우 데이터를 추가해줍니다

  • @CachePut
    • 캐시 저장
    • 실행 결과를 캐시에 저장하지만, 조회 시에 캐시 데이터를 사용하지 않고 항상 메소드 로직을 실행합니다

  • @CacheEvict
    • 캐시 제거
    • 캐시 이름을 통해 메소드가 실행되면 캐시의 내용이 제거됩니다.
    • 값이 변경되는 경우를 대비해 주기적으로 제거하는 것이 좋습니다.

구체적인 예시는 향로님이 올려주신 글을 보시면 큰 도움이 될 것 같습니다!

지금까지 캐시에 대해서 알아보았습니다!

읽어주셔서 감사합니다😝




References

[Server] Cache(캐시)란?

Ehcache에 대해 알아보자

Cache - Server (Redis, Spring Cache)

[6주 차] - 메모리(데이터) 참조 지역성, 캐시(Cache) 메모리 (1)

SpringBoot + Ehcache 기본 예제 및 소개

profile
하고 싶은 것들이 많은 개발자입니다
post-custom-banner

0개의 댓글