kok202
스프링 부트 Cache

2019. 5. 27. 15:49[정리] 기능별 개념 정리/스프링 부트

스프링 부트 캐시 모듈

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

 

@EnableCaching : 프로젝트에 Cache 설정을 활성화 한다.

@EnableCaching
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

@Cacheable(value="캐시_아이디") :  이 메소드에 캐시를 적용하겠다. 이 캐시의 아이디는 "캐시_아이디"다.

@CacheEvict(value="캐시_아이디") :  이 메소드를 통해 캐시의 아이디가 "캐시_아이디"인 캐시는 만료되어 지우겠다.

 

 

 

 

 

default 는 메소드의 파라미터에 따라 캐시 아이디가 같아도 다른 캐시로 분류된다.

@Cacheable(value="myCache")
public String getHobbies(long memberId, String delimiter){
    List<String> hobbyList = hobbyRepository.findAllByMemberId();
    return String.join(delimiter, hobbyList);
}

getHobbies(1234, " ") 과 getHobbies(1234, "\t") 은 서로 다른 캐시를 참조한다.

 

 

 

 

 

캐시를 분류하는 키를 특정 파라미터에만 적용 시킬 수 있다.

@Cacheable(value="myCache", key="#memberId")
public String getHobbies(long memberId, String delimiter){
    List<String> hobbyList = hobbyRepository.findAllByMemberId();
    return String.join(delimiter, hobbyList);
}

getHobbies(1234, " ") 과 getHobbies(1234, "\t") 은 서로 같은 캐시를 참조한다.

 

 

 

 

 

괜찮은 포스팅 : 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

파라미터가 없을 때 key 문제 : https://stackoverflow.com/questions/33383366/cacheble-annotation-on-no-parameter-method/33384311

 

@Cacheble annotation on no parameter method

I want to have @Cacheable annotation on method with no parameter. In that case, I use @Cacheable as follows @Cacheable(value="usercache", key = "mykey") public string sayHello(){ return "test...

stackoverflow.com

 

 

 

 

 


캐쉬 예시

@Slf4j
@EnableCaching
@Configuration
@EnableScheduling
public class CacheManagerConfig {
    public static final String CACHE_ID = "MEMBER_CACHE_ID";

    @Scheduled(cron = "0 0/1 * * * *")
    @CacheEvict(value = {MEMBER_CACHE_ID}, allEntries = true)
    public void expiringCache() {
        log.debug("Scheduling : cache evict");
    }

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(
            new ConcurrentMapCache(MEMBER_CACHE_ID))); // 캐쉬 등록
        return cacheManager;
    }
}
@Slf4j
@Component
public class MemberCache {
    @Autowired
    private MemberRepository mebmerRepository;

    @Cacheable(value = CacheManagerConfig.MEMBER_CACHE_ID)
    public Map<Long, Member> getMemberMap(){
        log.debug("Trying to fetch cache data from repository module");
        ArrayList<Member> members = mebmerRepository.findAll();
        Map<Long, Member> membersMap = members
            .stream()
            .collect(Collectors.toMap(Member::getId, Function.identity()));
        return membersMap;
    }
}

스프링 부트 캐시만으로는 캐시의 expire 주기를 직접 관리해줘야한다.

 

 

 

 

 

'[정리] 기능별 개념 정리 > 스프링 부트' 카테고리의 다른 글

Ehcache  (0) 2019.06.04
필터, 인터셉터, AOP  (0) 2019.05.28
PSA (추상화 계층)  (0) 2019.05.01
스프링 부트의 Mock  (0) 2019.04.28
스프링 AOP, Transaction  (0) 2019.04.21