코드 저장소.

[Cache] 캐시? 본문

웹개발/Spring

[Cache] 캐시?

slown 2023. 7. 22. 21:55

목차

  1. Cache?
  2. Cache를 사용하는 조건
  3. Cache의 종류
  4. Cache의 전략
  5. Spring에서 사용되는 캐시 어노테이션

1.Cache?

   캐시는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 데이터를 미리 복사를 해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다.

[출저: 위키피디]

2.Cache를 사용하는 조건

  • 단순한 구조의 정보를 (정보의 단순성) 반복적으로 동일하게 제공
  • 정보의 변경주기가 빈번하지 않고, 단위처리 시간이 오래걸리는 정보
  • 정보의 최신화가 반드시 실시간으로 이뤄지지 않아도 서비스 품질에 영향을 거의 주지 않는 정보  

3. LocalCache vs GlobalCache

로컬 캐시

  • 서버 내부 저장소에 캐시 데이터를 저장하는 방식
  • 장점이면 속도는 빠르지만 서버 간의 데이터가 공유가 안된다는 단점이 있습니다. 

 글로벌 캐시

  • 서버 내부 저장소가 아닌 별도의 캐시 서버를 두어 서버에서 캐시 서버를 참조하는 방식
  • 장점이면 서버 간의 데이터를 쉽게 공유할 수 있기 때문에 로컬 캐싱의 적합성 문제와 중복된 캐시 데이터로 인한 서버 자원 낭비 등의 문제점을 해결
  • 단점으로는 로컬캐시보다 속도가 느리다는 점

4.캐시전략

 캐시의 전략으로는 읽기전략과 쓰기전략이 있는데 읽기전략으로는 Look Aside ,Read Through가 있고 쓰기전략으로는 Write Back,Write Around 가 있습니다. 전략을 설명하기 전에 선수지식으로 Cache hit와 Cache miss 를 알아야 합니다.


-Cache hit: 캐시 스토어에 데이터가 있는 경우에는 바로 가져옴

-Cache miss: 캐시 스토어에 데이터가 없는 경우에는 어쩔수 없이 DB에서 가져옴

Look Aside

데이터를 찾을때 우선 캐시에 저장된 데이터가 있는지 우선적으로 확인하는 전략.만일 캐시에 데이터가 없으면 DB에서 조회함.

 

장점

  • 읽기가 많고 반복적으로 동일 쿼리를 수행하는 서비스에 적합.
  • Cache 서버에 장애가 발생해도 Data Store를 통해 지속적으로 서비스를 할 수 있음

단점

  • Cache Store, Data Store 사이에 정합성 유지 문제가 발생을 할 수 있다.
  • 캐시에 데이터가 없는 경우에는 시간이 오래 걸린다. 이 경우에는 DB에서 캐시로 데이터를 미리 넣어주는 작업을 하는데 이를 Cache Warming이라 합니다.
  • 데이터를 단건조회하는 방식으로는 힘듦.  

Read Through

  Cache Store에서만 데이터를 가져오는 방식
  Cache Store에 저장하는 주체가 Server가 아닌 Data Store인 점에서 Look Aside와 다르다.

 

장점

  • Cache Store, Data Store 사이의 정합성 문제를 해결 할 수 있다.   

단점

데이터를 조회하는데 있어서 전체적으로 속도가 느림.    

Write Back

모든 데이터를 CacheStore에 저장을 하고 일정 시간 후에 Data Store에 저장하는 방식.

    

장점

  • 캐시에 모아놨다가 DB에 쓰기 때문에 쓰기 쿼리 회수 비용과 부하를 줄일 수 있음.
  • 데이터의 정합성을 보장할 수 있음   

단점

  • 자주 사용되지 않는 불필요한 리소스 저장 ->데이터를 저장시에 불필요한 데이터도 저장되기에 TTL을 지정해서 사용되지 않는 데이터를 반드시 삭제해야 한다.
  • 캐시에서 오류가 발생하면 데이터를 영구 소실.

 Write Around

  모든 데이터를 DB에 저장하는 방식.

   Cache miss가 발생을 하는 경우에만 DB와 캐시에도 데이터를 저장
   단점으로는 데이터의 정합성에 문제가 있을 수가 있다.

Write Through

데이터를 저장할 때 디비와 캐시에 같이 저장하는 방식

 

장점

  • 데이터를 같이 저장을 하기 때문에 항상 동기화가 되어 있어서 최신정보를 가지고 있다.

단점

  • 저장할 때마다 2단계 과정을 거치기 때문에 상대적으로 느리다.
  • 저장을 할 때 모든 데이터를 저장하다 보니 캐시 데이터에 TTL을 설정을 해야 한다. 

5.스프링에서 사용되는 @Cache어노테이션

스프링에서도 캐시를 사용하기 위해서 Aop를 기반으로 한 @Cache어노테이션이 있습니다. 스프링 @Cache의 종류에는 @Cacheable,@CachePut,@CacheEvict가 있습니다.

@Cacheable

  • 캐시 생성 및 전달을 하는 어노테이션입니다. 캐시에 데이터가 없는 경우에는 기존의 로직을 실행 후에 
    캐시에 데이터를 추가하고, 캐시에 데이터가 있는 경우에는 캐시의 데이를 반환한다.
  • 캐시를 저장을 할때에는 key를 지정해서 데이터를 저장할 수 있고 조건을 정해서 데이터를 저장할 수 있다.
  • @Cacheable에 내장된 기능은 다음과 같습니다.
cacheName 캐시 이름 (설정 메서드 리턴값이 저장되는) String[]
value cacheName의 별칭 String[]
key 동적인 키 값을 사용하는 SpEL 표현식동일한 cache name을 사용하지만 구분될 필요가 있을 경우 사용되는 값 String
condition SpEL 표현식이 참일 경우에만 캐싱 적용- or, and 등 조건식, 논리연산 가능 String
unless 캐싱을 막기 위해 사용되는 SpEL 표현식condition과 반대로 참일 경우에만 캐싱이 적용되지 않음 String
cacheManager 사용 할 CacheManager 지정 String
sync 여러 스레드가 동일한 키에 대한 값을 로드하려고 할 경우, 기본 메서드의 호출을 동기화즉, 캐시 구현체가 Thread safe 하지 않는 경우, 캐시에 동기화를 걸 수 있는 속성 boolean

@CachePut

  • @Cacheable과 유사하게 실행 결과를 캐시에 저장하지만,조회 시에 저장된 캐시 내용을 사용하지 않고 항상
       메서드의 로직을 실행하므로 메서드 실행에 영향을 주지 않고, 캐시를 갱신해야 하는 경우에 사용합니다.
  • @CachePut에 내장된 내용은 다음과 같습니다. 
cacheName 입력할 캐시 이름 String[]
value cacheNamed의 별칭 String[]
key 동적인 키 값을 사용하는 SpEL 표현식동일한 cache name을 사용하지만 구분될 필요가 있을 경우 사용되는 값 String
cacheManager 사용 할 CacheManager 지정(EHCacheCacheManager, RedisCacheManager 등) String
condition SpEL 표현식이 참일 경우에만 캐싱 적용- or, and 등 조건식, 논리연산 가능 String
unless 캐싱을 막기 위해 사용되는 SpEL 표현식condition과 반대로 참일 경우에만 캐싱이 적용되지 않음 String

@CacheEvict

  • 저장된 캐시를 삭제합니다.
  • @CacheEvict의 내장된 기능은 다음과 같습니다.
cacheName 제거할 캐시 이름 String[]
value cacheName의 별칭 String[]
key 동적인 키 값을 사용하는 SpEL 표현식동일한 cache name을 사용하지만 구분될 필요가 있을 경우 사용되는 값 String
allEntries 캐시 내의 모든 리소스를 삭제할지의 여부 boolean
condition SpEL 표현식이 참일 경우에만 삭제 진행- or, and 등 조건식, 논리연산 가능 String
cacheManager 사용 할 CacheManager 지정 String
beforeInvocation true - 메서드 수행 이전 캐시 리소스 삭제false - 메서드 수행 후 캐시 리소스 삭제  

 

 

 

[출저]

https://kk-programming.tistory.com/83

 

[Cache] 캐시란?, 로컬캐싱 vs 글로벌 캐싱, 캐시전략들

✅ 파레토의 법칙 사회에서 일어나는 현상의 80%는 20%의 원인으로 인해 발생된다. 인터넷 통신의 80%가 20%의 사이트에 대한 액세스로 추정되며, 이 20%의 웹사이트 데이터를 캐시해두면 효율을 극

kk-programming.tistory.com

https://waspro.tistory.com/697

 

Redis5 설계하기 총정리

개요 이번 포스팅에서는 Redis를 효과적으로 구축/운영하기 위한 설계방법에 대해 알아보도록 하자. Redis는 대표적인 In-memory DB로 세션, 캐시, 큐 등으로 활용된다. 단일 환경으로 가볍게 구성이

waspro.tistory.com

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-%EC%BA%90%EC%8B%9CCache-%EC%84%A4%EA%B3%84-%EC%A0%84%EB%9E%B5-%EC%A7%80%EC%B9%A8-%EC%B4%9D%EC%A0%95%EB%A6%AC#write_around_%ED%8C%A8%ED%84%B4

'웹개발 > Spring' 카테고리의 다른 글

Spring Batch??  (0) 2024.05.12
Aop?? (관점지향 프로그래밍)  (0) 2024.05.04
스프링 Di (의존성 주입)  (0) 2024.04.15
Spring Security의 구조 및 흐름  (0) 2023.09.21
스프링 프레임 워크(Spring Frame Work)  (0) 2023.07.22