스프링 부트에 캐시 적용하기
캐시(Cache)
- 자주 사용하는 데이터를 미리 보관해둔 임시 장소
- 비교적 저장 공간이 적고, 전체적인 비용이 비쌈
- 빠른 IO를 통해 성능적 이점을 갖는다.
- 도중에 변경될 일이 없는 DB 조회 값이나 자주 호출되는 데이터에 사용
스프링 부트에서의 캐시
- 스프링 부트에서 사용할 수 있는 캐시는 대부분 JSR-107를 따른다.(JSR: Java Specification Requests, 자바 플랫폼에 대한 규격을 제안하거나 기술한 것을 의미, JSR-107은 JCACHE에 대한 내용)
- JSR-107을 따르는 캐시를 사용하면 어떤 구현체 캐시를 사용하는지에 관계없이 추상화를 지원
로컬 캐시와 글로벌 캐시
로컬 캐시
- 로컬에서만 사용하는 캐시
- 외부 서버와 트랜잭션 비용이 들지 않기 때문에 속도가 빠름
- 로컬에서만 사용하기 때문에 분산 서버의 구조에서 캐시를 공유하기 어려움
글로벌 캐시
- 여러 서버에서 접근할 수 있는 캐시 서버를 구축하여 사용하는 방식
- 네트워크를 통해 데이터를 가져오는 트랜잭션 비용이 있기 때문에 로컬 캐시에 비해 상대적으로 느림
- 별도의 서버로 운영되기 때문에 서버 간 데이터 공유에 용이함
코드 작성
나는 회사코드 중 정적인 데이터를 if문으로 확인하고, 없을 경우 데이터를 가져오고 있었는데,
스프링 캐시를 활용하여 if문 없이 정적인 데이터를 한 번 가져오고 계속 사용하게끔 수정했다.
- build.gradle
// Cahe 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-cache'
- 프로젝트 시작 application 파일
@EnableCaching 추가
@EnableJpaAuditing
@SpringBootApplication
@EnableJpaRepositories
@EnableCaching // 추가됨
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- CacheConfig ( 캐시 관련 설정 파일)
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
List<Cache> caches = new ArrayList<Cache>();
caches.add(new ConcurrentMapCache("menu"));
cacheManager.setCaches(caches);
return cacheManager;
}
}
- 데이터 가져오는 곳 (기존 코드)
if (Constant.menuList == null) {
Constant.menuList = menuService.findAllWithEbMenu();
}
@Transactional(readOnly = true)
public List<EbMenu> findAllWithEbMenu() {
logger.debug("menu : find all");
return ebMenuRepository.findAll();
}
- 캐시 사용 후
Constant.menuList = menuService.findAllWithEbMenu();
@Transactional(readOnly = true)
@Cacheable("menu")
public List<EbMenu> findAllWithEbMenu() {
logger.debug("menu : find all");
return ebMenuRepository.findAll();
}
- 참고
'개발 > Java&Kotlin' 카테고리의 다른 글
[Spring] 스프링 부트에서 크롤링 하기 (2) | 2022.11.28 |
---|---|
[Kotlin] 코틀린 기초 살펴보기 (0) | 2022.11.25 |
[Spring] 테스트 커버리지 확인하기 (0) | 2022.11.22 |
[Spring] 테스트 코드 적용하기 (0) | 2022.11.21 |
[Spring] 스프링 부트에서의 예외 처리 (2) | 2022.11.17 |