백엔드/캐싱

Spring에서 Cache 사용하기

JerryTheSWEngineer 2022. 3. 7. 01:27
반응형

캐싱을 하는 이유


 

만약에 우리가 데이터를 조회해오는 일이 있다고 가정해보자.

하지만 이 데이터가 거의 매번 동일하다고 생각해보면

매번 DB에 들려서 똑같은 데이터를 가지고 오는 일이 비효율적일 수 있다.

우리가 어딘가에 이 반복되는 데이터를 저장해놓고, 가져다가 쓰면 어떨까?

그럼 매번 DB를 들리지않고, 처음 1번만 들리면 될 것 같다.

 

 

Dependency에 추가


이후 추가 커스터마이징을 하려면 Bean도 설정해주자.

 

 

Bean 설정


 

@EnableCaching을 활용하여 캐시 사용을 꼭 알리자.

"exampleStore"는 저장소 이름이다. 알아서 바꾸자.

 

 

 

만약 여러개를 사용한다면, 위와 같이 활용할 수 있다.

 

 

 

 

Bean 설정


@Cacheable

- 보통 메서드 단위로 작동

- 캐시에 데이터가 없으면 로직을 수행, 만약 데이터가 있다면 캐시에 있는 데이터를 반환

- 캐시는 기본적으로 이름과 그 아래에 키-밸류로 저장이 된다.

- 만약 key값을 주지않는다면, 파라미터를 디폴트 값으로 가진다.

- Key값에는 spEL이 적용된다. 따라서 만약 파라미터가 객체라면, 다음과 같이 활용 가능하다.

@Cacheable(value = "캐시 저장소 이름", key = "#객체.객체속성") public 객체 객체가져오기함수명(객체 파라미터명) { }

 

 

@CachePut

- 그 외에도 캐시에 값을 저장하는 용도로만 사용하는 @CachePut도 있다. @CachePut은 @Cacheable과 유사하다. 하지만 차이점은, 저장 전용 용도라고 생각하면 편할 것 같다. 따라서 항상 로직이 실행된다는 것을 기억하자. @Cacheable은 처음만 저장하고 그 이후는 로직을 실행하지않지만, @CachePut은 매번 로직을 실행한다. 

- @Cacheable과 같이 쓰지 않는 경우가 많다고 한다. @Cacheable에서 원하는 기능을 사용할 수 있다면, @CachePut은 같이 쓰지 말자. 위의 Service에서는 설명을 위해 모두 들어가있긴하다. @Cacheable만 써도 잘 기능은 한다.

 

 

@CacheEvict

- 캐시 제거를 위해 쓰인다.

     일정한 주기

     값이 변할 때 

- 주로 위의 사유로 삭제를 한다.

- 캐시 저장소의 이름이나, Key 값, 전체를 활용하여 지울 수 있다.

@CacheEvict(value = "저장소 이름", allEntries = true) public void 함수명() { }

 

사용시 주의점


- Spring @Cacheable은 내부적으로 Spring AOP를 이용하기 때문에 @Async, @Transactional 등과 마찬가지로 pulbic method에만 사용가능

같은 객체내의 method끼리 호출시에는 @Cacheable이 설정되어있어도 캐싱되지 않음

Bean에서만 사용가능 (이말은 Bean이 의존하고있는 객체에서는 동작하지 않는다는 것)



 

 

참고

Spring Cache 공식 문서

https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#cache

 

Integration

As a lightweight container, Spring is often considered an EJB replacement. We do believe that for many, if not most, applications and use cases, Spring, as a container, combined with its rich supporting functionality in the area of transactions, ORM and JD

docs.spring.io

 

 

관련 블로그

https://sunghs.tistory.com/132

 

[SPRING] 스프링 캐시 사용하기

spring에서 cache 관련 된 기능을 지원한다. 기존 cache 처리라고 하면, Redis, memcached 등의 추가적인 memoryDB를 이용하거나, application 레벨에서 사용 가능한 EhCache 등이 많이 쓰이는데, 이 중 applicati..

sunghs.tistory.com

 

https://livenow14.tistory.com/56

 

[SpringBoot] Local-Memory 캐시를 사용해보자

@Service public class PathService { private static final Logger logger = LoggerFactory.getLogger(PathService.class); private final LineService lineService; private final StationService stationServic..

livenow14.tistory.com

 

 

https://mangkyu.tistory.com/179

 

[Spring] 캐시(Cache) 추상화와 사용법(@Cacheable, @CachePut, @CacheEvict)

Spring은 캐시 관련 기능을 추상화하여 편리하게 개발할 수 있도록 지원하고 있다. 이번에는 Spring이 제공하는 캐시와 관련된 기능들에 대해 알아보도록 하자. 1. Spring이 제공하는 캐시(Cache) 추상

mangkyu.tistory.com

 

반응형