애플리케이션 개발 과정 중 자주 변하지 않는 정보는 캐싱해서 사용하기 위해서 스프링 부트 캐시를 적용해보았다. 만약 데이터가 신규로 추가되거나하면 캐시를 지워주고, 한번 더 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
https://jeong-pro.tistory.com/170
https://dahye-jeong.gitbook.io/spring/spring/2020-04-09-cache
'Spring Boot' 카테고리의 다른 글
Spring Oauth2.0 Google 로그인 구현 (1) (0) | 2022.01.24 |
---|---|
[Spring Boot] Elastic Stack 연동 (ELK 연동) (0) | 2021.11.28 |
[Spring] @Transactional 어노테이션 (0) | 2021.10.10 |
[Spring Boot] Resource 추상화 (0) | 2020.08.27 |
[Spring Boot] @Valid를 이용한 유효성 검사 (0) | 2020.08.09 |