WEB/Spring

Spring Ehcache example

Tony Lim 2021. 1. 23. 18:57
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