Spring Boot에서 Cache를 사용하는 방법에 대해서 알아보도록 하겠습니다.
1. 의존성 추가
먼저, Spring Boot 프로젝트에 캐시 기능을 사용하기 위해 아래 의존성을 추가합니다. caffeine 캐시를 사용하기 위해 caffeine 캐시 의존성도 추가해줍니다.
Caffeine 캐시는 캐시 라이브러리 중 하나로, Spring Boot에서도 많이 사용됩니다. Caffeine 캐시는 특히 성능이 우수하고 유연한 구성 옵션을 제공하는 특징이 있습니다.
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'
2. 캐시 설정 추가
@EnableCaching 어노테이션을 사용하여 캐시 기능을 활성화합니다. Spring Boot의 구성 파일에 어노테이션을 추가합니다.
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
}
3. 캐시 적용할 메소드에 어노테이션 추가
@Cacheable, @CachePut, @CacheEvict 등의 어노테이션을 사용하여 메소드에 캐시를 적용할 수 있습니다.
- @Cacheable: 메소드의 결과를 캐시하고, 같은 인자로 호출될 때 캐시된 값을 반환합니다.
- @CachePut: 메소드의 결과를 강제로 캐시합니다. 항상 메소드가 실행되어 결과를 캐시에 저장하게 됩니다.
- @CacheEvict: 캐시의 특정 항목을 제거합니다.
예를 들어, 다음은 selectMenu 메소드에 @Cacheable 어노테이션을 적용한 예제입니다. menu라는 캐시데이터에 grpNo 를 key로 데이터를 저장하게 됩니다.
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class menuService {
private final MenuMapper menuMapper;
@Cacheable(value="menu", key="#userGroup.grpNo")
public Menu selectMenu(UserGroup userGroup) {
return menuMapper.selectMenu(userGroup);
}
}
데이터가 추가되거나 수정될 경우 캐시를 수정해줘야 합니다. @CachePut을 사용해서 변경되는 데이터를 cache에 저장합니다.
@CachePut(value="menu", key="#userGroup.grpNo")
public int insertMenu(UserGroup userGroup) throws Exception {
return menuMapper.insertMenu(userGroup);
}
데이터 삭제되었을 경우 캐시를 삭제해줘야 합니다. @CacheEvict을 사용해서 삭제되는 데이터를 cache에서 제거해줍니다.
만약 key에 상관없이 menu라는 캐시데이터에 있는 데이터를 전부 삭제할 경우에는 @CacheEvict(value = "menu", allEntries = true) 를 사용하면 됩니다.
@CacheEvict(value="menu", key="#userGroup.grpNo")
public int deleteMenu(UserGroup userGroup) throws Exception {
return menuMapper.deleteMenu(userGroup);
}
4. 캐시 설정 변경
application.properties 또는 application.yml 파일에서 캐시의 동작을 설정할 수 있습니다. 예를 들어, 캐시의 TTL(Time-To-Live)을 설정하거나 다른 캐시 프로바이더를 사용하는 등의 설정을 변경할 수 있습니다.
# application.yml
spring:
cache:
type: caffeine # 캐시 프로바이더 설정
caffeine:
spec: maximumSize=500, expireAfterAccess=600s # Caffeine 캐시 설정
위의 예제에서는 Caffeine을 캐시 프로바이더(저장소)로 사용하고 있으며, 최대 크기는 500이고 10분 동안 접근이 없으면 자동으로 만료되도록 설정되어 있습니다.
캐시 프로바이더를 설정하지 않으면 ConcurrentMapCache을 사용하게 됩니다. ConcurrentMapCache은 ConcurrentHashMap을 사용해서 캐시를 관리하고 메모리상에 캐시를 저장하게 됩니다.
caffeine 캐시가 작동하는지는 CacheManager를 bean으로 등록하면 디버깅 모드에서 확인할 수 있습니다.
@Autowired
private final CacheManager cacheManager;
참고자료
https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-caching.html