diff --git a/app/kac-app/build.gradle b/app/kac-app/build.gradle index 8cbdf65..f80f5a9 100644 --- a/app/kac-app/build.gradle +++ b/app/kac-app/build.gradle @@ -25,9 +25,9 @@ dependencies { //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' + implementation 'org.ehcache:ehcache:3.10.8' + implementation 'org.hibernate:hibernate-jcache:6.0.2.Final' + implementation 'javax.cache:cache-api:1.1.1' //redis implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.2.2' 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 index 8be8ecd..6959e18 100644 --- 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 @@ -1,50 +1,55 @@ -//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(200))) -// .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(400)))); -// } -// -// -// @Bean -// public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(CacheManager cacheManager) { -// return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager); -// } -// -// @Bean -// public JCacheManagerCustomizer cacheManagerCustomizer() { -// return new JCacheManagerCustomizer() { -// @Override -// public void customize(javax.cache.CacheManager cm) { -// cm.createCache("code", jCacheConfiguration); -// } -// }; -// } -//} +package kr.co.palnet.kac.app.config; + +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.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.AdviceMode; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.Duration; + +@Configuration +@EnableCaching(proxyTargetClass = true, mode = AdviceMode.PROXY) +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(10))) + .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(10)))); + } + + @Bean + public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(CacheManager cacheManager) { + return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager); + } + + @Bean + public JCacheManagerCustomizer cacheManagerCustomizer() { + return new JCacheManagerCustomizer() { + @Override + public void customize(javax.cache.CacheManager cm) { + cm.createCache("code", jCacheConfiguration); + cm.createCache("flight" , Eh107Configuration.fromEhcacheCacheConfiguration(CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class, + ResourcePoolsBuilder.newResourcePoolsBuilder() + .heap(5000, EntryUnit.ENTRIES)) + .withSizeOfMaxObjectSize(500, MemoryUnit.B) + .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(10))) + .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20))))); + } + }; + } +} diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/RedisCacheConfig.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/RedisCacheConfig.java index 2d5b357..044b629 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/RedisCacheConfig.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/RedisCacheConfig.java @@ -81,7 +81,7 @@ public class RedisCacheConfig { // .withInitialCacheConfigurations(cacheConfigurations).build(); // } - @Bean + @Bean(name = "redisCacheManager") public CacheManager redisCacheManager(RedisConnectionFactory cf) { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/xml/ehcache.xml b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/xml/ehcache.xml new file mode 100644 index 0000000..839c9be --- /dev/null +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/xml/ehcache.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/kac-app/src/main/resources/application.yml b/app/kac-app/src/main/resources/application.yml index 86820fa..b22293b 100644 --- a/app/kac-app/src/main/resources/application.yml +++ b/app/kac-app/src/main/resources/application.yml @@ -11,8 +11,6 @@ spring: ddl-auto: none naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - cache: - type: redis data: redis: host: 127.0.0.1 diff --git a/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/controller/ComCodeController.java b/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/controller/ComCodeController.java index aefba02..abdf126 100644 --- a/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/controller/ComCodeController.java +++ b/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/controller/ComCodeController.java @@ -1,38 +1,17 @@ package kr.co.palnet.kac.api.v1.common.code.controller; -import java.util.List; - -import kr.co.palnet.kac.api.v1.common.code.service.ComCodeService; -import kr.co.palnet.kac.data.com.domain.ComCdGroupBas; -import kr.co.palnet.kac.data.com.domain.ComCdLangCtg; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; -import kr.co.palnet.kac.api.v1.common.code.model.CodeDTO; -import kr.co.palnet.kac.api.v1.common.code.model.CodeGroupDTO; -import kr.co.palnet.kac.api.v1.common.code.model.CodeGroupRS; -import kr.co.palnet.kac.api.v1.common.code.model.CodeGroupRSWrapper; -import kr.co.palnet.kac.api.v1.common.code.model.CodeLangDTO; -import kr.co.palnet.kac.api.v1.common.code.model.CodeRS; -import kr.co.palnet.kac.api.v1.common.code.model.CodeRsWrapper; -import kr.co.palnet.kac.api.v1.common.code.model.FormCodeGroupRQ; -import kr.co.palnet.kac.api.v1.common.code.model.FormCodeLangRQ; -import kr.co.palnet.kac.api.v1.common.code.model.FormCodeRQ; -import kr.co.palnet.kac.api.v1.common.code.model.SearchCodeAllRQ; -import kr.co.palnet.kac.api.v1.common.code.model.SearchCodeRQ; +import kr.co.palnet.kac.api.v1.common.code.model.*; +import kr.co.palnet.kac.api.v1.common.code.service.ComCodeService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @Tag(name = "공통 - 코드", description = "코드 관련 API") @RequiredArgsConstructor diff --git a/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/service/ComCodeService.java b/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/service/ComCodeService.java index 3eb5cbb..376ea22 100644 --- a/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/service/ComCodeService.java +++ b/web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/service/ComCodeService.java @@ -1,32 +1,20 @@ package kr.co.palnet.kac.api.v1.common.code.service; -import java.util.Comparator; -import java.util.List; - -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import kr.co.palnet.kac.api.v1.common.code.model.CodeDTO; -import kr.co.palnet.kac.api.v1.common.code.model.CodeGroupDTO; -import kr.co.palnet.kac.api.v1.common.code.model.CodeGroupRS; -import kr.co.palnet.kac.api.v1.common.code.model.CodeGroupRSWrapper; -import kr.co.palnet.kac.api.v1.common.code.model.CodeLangDTO; -import kr.co.palnet.kac.api.v1.common.code.model.CodeRS; -import kr.co.palnet.kac.api.v1.common.code.model.CodeRsWrapper; -import kr.co.palnet.kac.api.v1.common.code.model.FormCodeGroupRQ; -import kr.co.palnet.kac.api.v1.common.code.model.FormCodeLangRQ; -import kr.co.palnet.kac.api.v1.common.code.model.FormCodeRQ; -import kr.co.palnet.kac.api.v1.common.code.model.SearchCodeAllRQ; -import kr.co.palnet.kac.api.v1.common.code.model.SearchCodeRQ; +import kr.co.palnet.kac.api.v1.common.code.model.*; import kr.co.palnet.kac.data.com.domain.ComCdBas; import kr.co.palnet.kac.data.com.domain.ComCdGroupBas; import kr.co.palnet.kac.data.com.domain.ComCdLangCtg; import kr.co.palnet.kac.data.com.service.ComCodeDomainService; 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.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Comparator; +import java.util.List; @Slf4j @RequiredArgsConstructor @@ -37,7 +25,7 @@ public class ComCodeService { private final ComCodeDomainService comCodeDomainService; // 모든 코드 조회 - @Cacheable(value = "code", key = "#rq?.siteCd", cacheManager = "redisCacheManager") + @Cacheable(value = "code", key = "#rq?.siteCd") public CodeGroupRSWrapper getAllGroup(SearchCodeAllRQ rq) { List comCdGroupBasList = comCodeDomainService.getComCdGroupBasList(rq.getSiteCd()); List codeGroupRSList = comCdGroupBasList.stream().map(group -> { @@ -68,7 +56,7 @@ public class ComCodeService { } // 그룹 목록 조회 - 코드 그룹만 - @Cacheable(value = "code", key = "'all'" , cacheManager = "reidsCacheManager") + @Cacheable(value = "code", key = "'all'" , cacheManager = "redisCacheManager") public CodeGroupRSWrapper getAllGroupCode() { List comCdGroupBasList = comCodeDomainService.getComCdGroupBasList(); List rs = comCdGroupBasList.stream().map(CodeGroupRS::toRS).toList(); @@ -79,7 +67,7 @@ public class ComCodeService { } // 코드 목록 조회 - 코드 - 언어 - @Cacheable(value = "code", key = "#rq?.groupCd", cacheManager = "redisCacheManager") + @Cacheable(value = "flight", key = "'KeyIs:' + #rq?.groupCd + '/' +#rq?.langDivCd") public CodeRsWrapper getAllCodeByGroup(SearchCodeRQ rq) { List comCdBasList = comCodeDomainService.getComCdBasList(rq.getGroupCd()); List rs = comCdBasList.stream().map(entity -> { @@ -121,7 +109,7 @@ public class ComCodeService { // 코드 그룹 수정 - @CachePut(value = "code", cacheManager = "redisCacheManager") + @CachePut(value = "code") public CodeGroupDTO updateCodeGroup(FormCodeGroupRQ rq) { ComCdGroupBas entity = rq.toEntity(); ComCdGroupBas comCdGroupBas = comCodeDomainService.updateComCdGroupBas(entity); @@ -129,7 +117,7 @@ public class ComCodeService { } // 코드 수정 - @CachePut(value = "code", cacheManager = "redisCacheManager") + @CachePut(value = "code") public CodeDTO updateCode(FormCodeRQ rq) { ComCdBas entity = rq.toEntity(); ComCdBas comCdBas = comCodeDomainService.updateComCdBas(entity); @@ -137,7 +125,7 @@ public class ComCodeService { } // 언어 수정 - @CachePut(value = "code", cacheManager = "redisCacheManager") + @CachePut(value = "code") public CodeLangDTO updateCodeLang(FormCodeLangRQ rq) { ComCdLangCtg entity = rq.toEntity(); ComCdLangCtg comCdLangCtg = comCodeDomainService.updateComCdLangCtg(entity); @@ -145,19 +133,19 @@ public class ComCodeService { } // 코드 그룹 삭제 - @CacheEvict(value = "code", key = "#groupCd" , cacheManager = "redisCacheManager") + @CacheEvict(value = "code", key = "#groupCd") public void deleteCodeGroup(String groupCd) { comCodeDomainService.deleteComCdGroupBas(groupCd); } // 코드 삭제 - @CacheEvict(value = "code", key = "'KeyIs' + #groupCd + #cdId" , cacheManager = "redisCacheManager") + @CacheEvict(value = "code", key = "'KeyIs' + #groupCd + #cdId") public void deleteCode(String groupCd, String cdId) { comCodeDomainService.deleteComCdBas(groupCd, cdId); } // 언어 삭제 - @CacheEvict(value = "code", key = "'KeyIs' + #groupCd + #cdId + #langDivCd" , cacheManager = "redisCacheManager") + @CacheEvict(value = "code", key = "'KeyIs' + #groupCd + #cdId + #langDivCd") public void deleteLang(String groupCd, String cdId, String langDivCd) { comCodeDomainService.deleteComCdLangCtg(groupCd, cdId, langDivCd); }