728x90
캐시 설정을 할 수있게 해주는 package를 gradle을 통해 다운받는다
CommandLineRunner 인터페이스를 구현한 클래스는 구동시 run()메소드를 자동으로 호출하게합니다. 캐시를 쓰고있는 지 확인하기위하여 loger.info안의 this.cacheManager.getClass().getName()을 통해서 확인합니다. 굳이 sout을 안하는 이유는 실제 상용시스템에서는 보안이슈가 있기 때문입니다.
ehcache 를 쓰기위한 xml 파일이다. 자기 스스로 캐시의 이름을 지정할 수 있다. 지금의 경우는 "findMemeberCache" 로 되어있다.
package com.blogcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
@SpringBootApplication
@EnableCaching // 어노테이션을 이용한 캐시기능을 사용하겠다는 선언
@Controller
public class Application {
private static Logger logger = LoggerFactory.getLogger(Application.class);
@Autowired
MemberRepository memberRepository;
@GetMapping("/member/nocache/{name}")
@ResponseBody
public Member getNoCacheMember(@PathVariable String name){
long start = System.currentTimeMillis(); // 수행시간 측정
Member member = memberRepository.findByNameNoCache(name); // db 조회
long end = System.currentTimeMillis();
logger.info(name+ "의 NoCache 수행시간 : "+ Long.toString(end-start));
return member;
}
@GetMapping("/member/cache/{name}")
@ResponseBody
public Member getCacheMember(@PathVariable String name){
long start = System.currentTimeMillis(); // 수행시간 측정
Member member = memberRepository.findByNameCache(name); // db 조회
long end = System.currentTimeMillis();
logger.info(name+ "의 Cache 수행시간 : "+ Long.toString(end-start));
return member;
}
@GetMapping("/member/refresh/{name}")
@ResponseBody
public String refresh(@PathVariable String name){
memberRepository.refresh(name); // 캐시제거
return "cache clear!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@GetMapping("/")
@ResponseBody
public String index(){
return "HelloWorld";
}
}
Controller 에 해당되는 곳이다. 캐시를 쓰는 라우팅과 안쓰는 라우팅 이 각각 되어있다. 수행시간을 측정하는 것이 하드코딩되어 있다. 추후에 AOP를 쓰면 더 좋아보인다.
domain Entity 클래스이다.
DAO 에 해당하는 인터페이스이다. 실제 구현은 아래와 같다.
@Cacheable 어노테이션에서 value 는 아까 xml에 적었던 캐시이름이고 key 의 #name은 주어진 메소드의 파라미터 String name을 기준으로 캐싱하겠다라는 뜻이다.
@CacheEvict 는 해당 #name의 캐시를 지우겠다는 뜻이다.
캐시가 아주 잘 적용되는것을 확인할 수 있다.
reference == SpringBoot + Ehcache 기본 예제 및 소개 (tistory.com)
728x90
'WEB > Spring' 카테고리의 다른 글
김영한 (스프링 부트 5) (0) | 2021.02.08 |
---|---|
김영한 (스프링부트 입문) 4 (0) | 2021.02.08 |
김영한 (스프링부트 입문) 3 (1) | 2021.01.31 |
김영한 (스트링부트 입문) 2 (1) | 2021.01.24 |
김영한 (스프링부트 입문) 1 (0) | 2021.01.24 |