본문 바로가기
Spring Boot

[Spring Boot] API 스프링부트 캐싱 적용

by byeongoo 2021. 11. 21.

애플리케이션 개발 과정 중 자주 변하지 않는 정보는 캐싱해서 사용하기 위해서 스프링 부트 캐시를 적용해보았다. 만약 데이터가 신규로 추가되거나하면 캐시를 지워주고, 한번 더 select가 일어나게 해주면 된다. 

 

Spring Cache를 사용하면 자바 메소드에 캐싱을 적용하여 파라미터 값에 따라서 캐시를 적용한다.

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-cache', version: '2.6.0'

 

1. CacheConfig 작성 (@EnableCaching)

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CachingConfig {

}

 

2. API 결과 캐싱 적용 (@Cacheable)

  • 다음과 같이 site 목록을 전부 조회하는 API가 있을 때 처음 API 조회할 때만 쿼리를 조회하고 캐싱이 만료되기 전까지는 캐시에서 조회한다.
  • 캐싱을 저장하거나 조회할 때 사용한다.
@Cacheable("allSites")
@GetMapping(value = "/list")
public ResponseEntity<List<Site>> getAllSite() {
    List<Site> allSites = siteRepository.findAll();
    return ResponseEntity.ok(allSites);
}

 

만약 메소드의 파라미터가 없으면 0이라는 디폴트 값을 Key로 사용하여 저장한다. 그리고 만약 메소드의 파라미터가 여러개라면 파라미터들의 hashCode 값을 조합하여 키를 생성한다.

 

하지만 여러개의 파라미터중에서도 1개의 키 값을 지정하고 싶은 경우 다음과 같이 Key값을 별도로 지정해주면 된다.

@Cacheable(value = "site", key = "#siteNo")
@GetMapping(value = "/site")
public ResponseEntity<Site> getAllSite(String siteNo) {
    Site site = siteRepository.findBySiteNo(siteNo);
    return ResponseEntity.ok(site);
}

Key값의 지정에는 SpEL이 사용된다. 만약 파라미터가 객체라면 다음과 같이 하위 속성에 접근하면 된다.

@Cacheable(value = "site", key = "#site.siteNo")
@GetMapping(value = "/site")
public ResponseEntity<Site> getAllSite(Site site) {
    Site result = siteRepository.findBySiteNo(site.getSiteNo);
    return ResponseEntity.ok(result);
}

3.  캐싱 삭제 (@CacheEvict)

신규 데이터가 추가되거나해서 캐싱을 삭제해야하는 경우 @CacheEvict어노테이션을 선언한 API를 하나 만들어줘서 삭제할 수 있다.

@CacheEvict("allSites")
@DeleteMapping(value = "/cache")
public ResponseEntity<String> clearSiteCache( ) {
    return ResponseEntity.ok("success");
}

 

특정 키값을 가진 캐시를 제거하려면 다음과 같이 하면 된다.

@CacheEvict("site", key = "#site.siteNo")
@DeleteMapping(value = "/cache/site")
public ResponseEntity<String> clearSiteCache(Site site) {
    return ResponseEntity.ok("success");
}

 

4.  캐싱 업데이트(@CachePut)

조회 시에 저장된 캐시의 내용을 사용하지는 않고 항상 메소드의 로직을 실행한다. 캐시의 저장만을 위해서 사용한다.

 

5. Spring EhCache 적용

추가적으로 인기있는 캐시 매니저로 EhCache가 있는데 한번 사용해보면 좋을꺼 같다. 

링크 주소는 여기를 참고해보자.

 

REFERENCE

https://mangkyu.tistory.com/m/179?category=761302 

 

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

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

mangkyu.tistory.com

https://jeong-pro.tistory.com/170

 

3가지만 기억하자. 스프링 부트 초간단 캐시 @EnableCaching, @Cacheable, @CacheEvict (spring boot cache example)

스프링 부트 캐시 적용하는 가장 쉬운 방법 스프링 부트에 캐시를 적용하고 싶으면 3가지만 기억하면 된다. @EnableCaching, @Cacheable, @CacheEvict 1. "spring-boot-starter-cache" 라이브러리 불러온다. 1 2 3..

jeong-pro.tistory.com

https://dahye-jeong.gitbook.io/spring/spring/2020-04-09-cache

 

Cache - spring

JSR-107(JCACHE – Java Temporary Caching API) : 객체 생성, 공유 액세스, 스풀링, 무효화 및 JVM 전반에 걸친 일관성을 포함하여 Java 객체의 메모리 캐싱에서 사용할 API 에 대한 기준으로 볼 수 있다. 해당 Spe

dahye-jeong.gitbook.io