From eb5d56b4ef122fcad7848b4dfb068f73b8762dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jaewoo=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Wed, 14 Feb 2024 19:02:04 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20Cache=20=EC=83=9D=EB=AA=85=EC=A3=BC?= =?UTF-8?q?=EA=B8=B0=20=EB=93=B1=20=EA=B8=B0=EB=B3=B8=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20,=20code=20service=EB=8B=A8=EC=97=90=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/kac-app/build.gradle | 7 ++- .../palnet/kac/app/config/CachingConfig.java | 46 +++++++++++++++++++ .../com/service/ComCodeDomainService.java | 22 ++++++++- 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 app/kac-app/src/main/java/kr/co/palnet/kac/app/config/CachingConfig.java diff --git a/app/kac-app/build.gradle b/app/kac-app/build.gradle index d9c2784..3b26072 100644 --- a/app/kac-app/build.gradle +++ b/app/kac-app/build.gradle @@ -23,7 +23,12 @@ dependencies { // querydsl implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" - + //cache + implementation 'org.springframework.boot:spring-boot-starter-cache' + implementation 'org.ehcache:ehcache:3.10.0' + implementation 'org.hibernate:hibernate-jcache:6.0.2.Final' + implementation 'javax.cache:cache-api:1.1.1' + // rest doc asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor' diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/CachingConfig.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/CachingConfig.java new file mode 100644 index 0000000..bd0282b --- /dev/null +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/CachingConfig.java @@ -0,0 +1,46 @@ +package kr.co.palnet.kac.app.config; + +import java.time.Duration; + +import javax.cache.CacheManager; + +import org.ehcache.config.builders.CacheConfigurationBuilder; +import org.ehcache.config.builders.ExpiryPolicyBuilder; +import org.ehcache.config.builders.ResourcePoolsBuilder; +import org.ehcache.config.units.EntryUnit; +import org.ehcache.config.units.MemoryUnit; +import org.ehcache.jsr107.Eh107Configuration; +import org.hibernate.cache.jcache.ConfigSettings; +import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer; +import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +@EnableCaching +@Configuration +public class CachingConfig { + + private final javax.cache.configuration.Configuration jCacheConfiguration; + + public CachingConfig() { + this.jCacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class, + ResourcePoolsBuilder.newResourcePoolsBuilder() + .heap(10000, EntryUnit.ENTRIES)) + .withSizeOfMaxObjectSize(1000, MemoryUnit.B) + .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(30))) + .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(60)))); + } + + + @Bean + public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(CacheManager cacheManager) { + return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager); + } + + @Bean + public JCacheManagerCustomizer cacheManagerCustomizer() { + return cm -> { + cm.createCache("code", jCacheConfiguration); + }; + } +} diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComCodeDomainService.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComCodeDomainService.java index e1ff409..fdc056a 100644 --- a/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComCodeDomainService.java +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComCodeDomainService.java @@ -8,6 +8,11 @@ import kr.co.palnet.kac.data.com.repository.ComCdGroupBasRepository; import kr.co.palnet.kac.data.com.repository.ComCdLangCtgRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,47 +23,59 @@ import java.util.List; @Transactional @RequiredArgsConstructor @Service +@CacheConfig(cacheNames = "code") public class ComCodeDomainService { private final ComCdGroupBasRepository comCdGroupBasRepository; private final ComCdBasRepository comCdBasRepository; private final ComCdLangCtgRepository comCdLangCtgRepository; - + @CacheEvict(value = "code", allEntries = true) + @Scheduled(fixedRateString = "${caching.spring.ttl}") + public void removeCodeCache() { + log.info("removing code cache" ); + } // 그룹 조회 @Transactional(readOnly = true) + @Cacheable(value = "code", key = "'all'") public List getComCdGroupBasList() { return comCdGroupBasRepository.findAll(); } @Transactional(readOnly = true) + @Cacheable(value = "code", key = "#siteCd") public List getComCdGroupBasList(String siteCd) { return comCdGroupBasRepository.findBySiteCd(siteCd); } @Transactional(readOnly = true) + @Cacheable(value = "code", key = "#groupCd") public ComCdGroupBas getComCdGroupBas(String groupCd) { return comCdGroupBasRepository.findById(groupCd).orElse(null); } // 코드 조회 @Transactional(readOnly = true) + @Cacheable(value = "code", key = "#groupCd") public List getComCdBasList(String groupCd) { return comCdBasRepository.findByGroupCdAndUseYnOrderBySortOrdrAsc(groupCd, "Y"); } @Transactional(readOnly = true) + @Cacheable(value = "code", key = "'KeyIs' + #groupCd + #cdId") public ComCdBas getComCdBas(String groupCd, String cdId) { return comCdBasRepository.findByGroupCdAndCdIdAndUseYn(groupCd, cdId, "Y"); } // 언어 조회 @Transactional(readOnly = true) + @Cacheable(value = "code", key = "'KeyIs' + #groupCd + #cdId") public List getComCdLangCtgList(String groupCd, String cdId) { return comCdLangCtgRepository.findByGroupCdAndCdId(groupCd, cdId); } @Transactional(readOnly = true) + @Cacheable(value = "code", key = "'KeyIs' + #groupCd + #cdId + #langDivCd") public ComCdLangCtg getComCdLangCtg(String groupCd, String cdId, String langDivCd) { ComCdLangCtg.ComCdLangCtgId id = ComCdLangCtg.ComCdLangCtgId.builder() .groupCd(groupCd) @@ -187,11 +204,13 @@ public class ComCodeDomainService { } // 그룹 삭제 + @CacheEvict(value = "code", key = "#groupCd") public void deleteComCdGroupBas(String groupCd) { comCdGroupBasRepository.deleteById(groupCd); } // 코드 삭제 + @CacheEvict(value = "code", key = "'KeyIs' + #groupCd + #cdId") public void deleteComCdBas(String groupCd, String cdId) { var id = ComCdBas.ComCdBasId.builder() .groupCd(groupCd) @@ -201,6 +220,7 @@ public class ComCodeDomainService { } // 언어 삭제 + @CacheEvict(value = "code", key = "'KeyIs' + #groupCd + #cdId + langDivCd") public void deleteComCdLangCtg(String groupCd, String cdId, String langDivCd) { var id = ComCdLangCtg.ComCdLangCtgId.builder() .groupCd(groupCd)