티스토리 뷰

Spring Boot에 Cache넣기

 

spring-boot-starter-cache만 import 하면 ConcurrentHashMap이 캐시 클래스가 된다.

이 클래스는 expire를 수동으로 해줘야 한다.

그래서 expire time을 줄 수 있는 caffein cache를 쓰는 것.

 

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine -->
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.6.2</version>
</dependency>

 

 

main(){

@SpringBootApplication
@EnableCaching
public class ChartDataServer extends SpringBootServletInitializer {}

 

CacheType.java

import lombok.Getter;

@Getter
public enum CacheType {
    GET_STUDENT("get_students_with_task", 5, 10000),
    COURSE_STUDENT("course_student", 5 * 60, 10000),
    ARTIST_INFO("artistInfo", 24 * 60 * 60, 10000);

    CacheType(String cacheName, int expiredAfterWrite, int maximumSize) {
        this.cacheName = cacheName;
        this.expiredAfterWrite = expiredAfterWrite;
        this.maximumSize = maximumSize;
    }

    private String cacheName;
    private int expiredAfterWrite;
    private int maximumSize;
}

 

CacheConfig.java

@Configuration
public class CacheConfig {
    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        List<CaffeineCache> caches = Arrays.stream(CacheType.values())
                .map(cache -> new CaffeineCache(cache.getCacheName(), Caffeine.newBuilder().recordStats()
                                .expireAfterWrite(cache.getExpiredAfterWrite(), TimeUnit.SECONDS)
                                .maximumSize(cache.getMaximumSize())
                                .build()
                        )
                )
                .collect(Collectors.toList());
        cacheManager.setCaches(caches);
        return cacheManager;
    }
}

 

어노테이션 달기

해당 method에 @Cacheable추가 하면 됩니다.

메소드로 넘어오는 파라메터에 맞게 잘 달아 주어야 합니다.

@Cacheable(value = "get_course_student", key = "#todayCourseInfo.id + '_' + #todayCourseInfo.week + '_' + #todayCourseInfo.dayOfWeek + '_' + #repoName")
public CourseStudent getCourseStudent(TodayCourseInfo todayCourseInfo, String repoName, String userName) {

 

 

Dto기반 캐싱

파라메터가 DTO인데 Dto의 멤버변수를 이용해 캐싱 하고 싶다면 다음과 같이 #dto.idCompany 등을 쓰면 됩니다.

@Cacheable(value = "kpi", key = "#dto.idCompany + '-' + #dto.factoryId.orElse('')")
public Kpi kpi(KpiRequestDto dto) {

 

 

cache가 적용 되었는지 보기 위해 로그 설정하기

 

application.yml

logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
        type.descriptor.sql.BasicBinder: DEBUG

 

 

 

참고

Spring boot 에 caffeine 캐시를 적용해보자 - 어떻게하면 일을 안 할까? (yevgnenll.me)

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함