스프링 부트 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
파라미터가 없을 때 key 문제 : https://stackoverflow.com/questions/33383366/cacheble-annotation-on-no-parameter-method/33384311
캐쉬 예시
@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 |