Browse Source

feat : cache 작업중

feature/cache
qkr7828 7 months ago
parent
commit
f017cc527b
  1. 6
      app/kac-app/build.gradle
  2. 105
      app/kac-app/src/main/java/kr/co/palnet/kac/app/config/CachingConfig.java
  3. 2
      app/kac-app/src/main/java/kr/co/palnet/kac/app/config/RedisCacheConfig.java
  4. 47
      app/kac-app/src/main/java/kr/co/palnet/kac/app/config/xml/ehcache.xml
  5. 2
      app/kac-app/src/main/resources/application.yml
  6. 35
      web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/controller/ComCodeController.java
  7. 48
      web/api-common/src/main/java/kr/co/palnet/kac/api/v1/common/code/service/ComCodeService.java

6
app/kac-app/build.gradle

@ -25,9 +25,9 @@ dependencies {
//cache //cache
implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.springframework.boot:spring-boot-starter-cache'
// implementation 'org.ehcache:ehcache:3.10.0' implementation 'org.ehcache:ehcache:3.10.8'
// implementation 'org.hibernate:hibernate-jcache:6.0.2.Final' implementation 'org.hibernate:hibernate-jcache:6.0.2.Final'
// implementation 'javax.cache:cache-api:1.1.1' implementation 'javax.cache:cache-api:1.1.1'
//redis //redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.2.2' implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.2.2'

105
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; package kr.co.palnet.kac.app.config;
//
//import java.time.Duration; import org.ehcache.config.builders.CacheConfigurationBuilder;
// import org.ehcache.config.builders.ExpiryPolicyBuilder;
//import javax.cache.CacheManager; import org.ehcache.config.builders.ResourcePoolsBuilder;
// import org.ehcache.config.units.EntryUnit;
//import org.ehcache.config.builders.CacheConfigurationBuilder; import org.ehcache.config.units.MemoryUnit;
//import org.ehcache.config.builders.ExpiryPolicyBuilder; import org.ehcache.jsr107.Eh107Configuration;
//import org.ehcache.config.builders.ResourcePoolsBuilder; import org.hibernate.cache.jcache.ConfigSettings;
//import org.ehcache.config.units.EntryUnit; import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer;
//import org.ehcache.config.units.MemoryUnit; import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
//import org.ehcache.jsr107.Eh107Configuration; import org.springframework.cache.CacheManager;
//import org.hibernate.cache.jcache.ConfigSettings; import org.springframework.cache.annotation.EnableCaching;
//import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer; import org.springframework.context.annotation.AdviceMode;
//import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; import org.springframework.context.annotation.Bean;
//import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration; import java.time.Duration;
//
//@EnableCaching @Configuration
//@Configuration @EnableCaching(proxyTargetClass = true, mode = AdviceMode.PROXY)
//public class CachingConfig { public class CachingConfig {
//
// private final javax.cache.configuration.Configuration<Object, Object> jCacheConfiguration; private final javax.cache.configuration.Configuration<Object, Object> jCacheConfiguration;
//
// public CachingConfig() { public CachingConfig() {
// this.jCacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class, this.jCacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class,
// ResourcePoolsBuilder.newResourcePoolsBuilder() ResourcePoolsBuilder.newResourcePoolsBuilder()
// .heap(10000, EntryUnit.ENTRIES)) .heap(10000, EntryUnit.ENTRIES))
// .withSizeOfMaxObjectSize(1000, MemoryUnit.B) .withSizeOfMaxObjectSize(1000, MemoryUnit.B)
// .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(200))) .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(10)))
// .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(400)))); .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(10))));
// } }
//
// @Bean
// @Bean public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(CacheManager cacheManager) {
// public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(CacheManager cacheManager) { return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager);
// return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager); }
// }
// @Bean
// @Bean public JCacheManagerCustomizer cacheManagerCustomizer() {
// public JCacheManagerCustomizer cacheManagerCustomizer() { return new JCacheManagerCustomizer() {
// return new JCacheManagerCustomizer() { @Override
// @Override public void customize(javax.cache.CacheManager cm) {
// public void customize(javax.cache.CacheManager cm) { cm.createCache("code", jCacheConfiguration);
// 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)))));
}
};
}
}

2
app/kac-app/src/main/java/kr/co/palnet/kac/app/config/RedisCacheConfig.java

@ -81,7 +81,7 @@ public class RedisCacheConfig {
// .withInitialCacheConfigurations(cacheConfigurations).build(); // .withInitialCacheConfigurations(cacheConfigurations).build();
// } // }
@Bean @Bean(name = "redisCacheManager")
public CacheManager redisCacheManager(RedisConnectionFactory cf) { public CacheManager redisCacheManager(RedisConnectionFactory cf) {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule()); objectMapper.registerModule(new JavaTimeModule());

47
app/kac-app/src/main/java/kr/co/palnet/kac/app/config/xml/ehcache.xml

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
maxBytesLocalHeap="300M"
updateCheck="false">
<!-- CacheManager에 의해 관리되는 캐시의 메모리를 300M로 제한 -->
<!-- 임시저장 경로를 설정 -->
<diskStore path="java.io.tmpdir" />
<!--
Cache에 저장할 레퍼런스의 최대값을 100000으로 지정,
maxDepthExceededBehavior = "continue" : 초과 된 최대 깊이에 대해 경고하지만 크기가 조정 된 요소를 계속 탐색
maxDepthExceededBehavior = "abort" : 순회를 중지하고 부분적으로 계산 된 크기를 즉시 반환
-->
<sizeOfPolicy maxDepth="100000" maxDepthExceededBehavior="continue"/>
<!-- default Cache 설정 (반드시 선언해야 하는 Cache) -->
<defaultCache
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="1200"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
<!-- 사용하고자 하는 캐시 별 설정 -->
<cache name="LocalCacheData"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="1200"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</cache>
<cache name="AuthMemberList"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="1200"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</cache>
</ehcache>

2
app/kac-app/src/main/resources/application.yml

@ -11,8 +11,6 @@ spring:
ddl-auto: none ddl-auto: none
naming: naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
cache:
type: redis
data: data:
redis: redis:
host: 127.0.0.1 host: 127.0.0.1

35
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; 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.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag; 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.*;
import kr.co.palnet.kac.api.v1.common.code.model.CodeGroupDTO; import kr.co.palnet.kac.api.v1.common.code.service.ComCodeService;
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 lombok.RequiredArgsConstructor; 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") @Tag(name = "공통 - 코드", description = "코드 관련 API")
@RequiredArgsConstructor @RequiredArgsConstructor

48
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; package kr.co.palnet.kac.api.v1.common.code.service;
import java.util.Comparator; import kr.co.palnet.kac.api.v1.common.code.model.*;
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.data.com.domain.ComCdBas; 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.ComCdGroupBas;
import kr.co.palnet.kac.data.com.domain.ComCdLangCtg; import kr.co.palnet.kac.data.com.domain.ComCdLangCtg;
import kr.co.palnet.kac.data.com.service.ComCodeDomainService; import kr.co.palnet.kac.data.com.service.ComCodeDomainService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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 @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@ -37,7 +25,7 @@ public class ComCodeService {
private final ComCodeDomainService comCodeDomainService; private final ComCodeDomainService comCodeDomainService;
// 모든 코드 조회 // 모든 코드 조회
@Cacheable(value = "code", key = "#rq?.siteCd", cacheManager = "redisCacheManager") @Cacheable(value = "code", key = "#rq?.siteCd")
public CodeGroupRSWrapper getAllGroup(SearchCodeAllRQ rq) { public CodeGroupRSWrapper getAllGroup(SearchCodeAllRQ rq) {
List<ComCdGroupBas> comCdGroupBasList = comCodeDomainService.getComCdGroupBasList(rq.getSiteCd()); List<ComCdGroupBas> comCdGroupBasList = comCodeDomainService.getComCdGroupBasList(rq.getSiteCd());
List<CodeGroupRS> codeGroupRSList = comCdGroupBasList.stream().map(group -> { List<CodeGroupRS> 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() { public CodeGroupRSWrapper getAllGroupCode() {
List<ComCdGroupBas> comCdGroupBasList = comCodeDomainService.getComCdGroupBasList(); List<ComCdGroupBas> comCdGroupBasList = comCodeDomainService.getComCdGroupBasList();
List<CodeGroupRS> rs = comCdGroupBasList.stream().map(CodeGroupRS::toRS).toList(); List<CodeGroupRS> 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) { public CodeRsWrapper getAllCodeByGroup(SearchCodeRQ rq) {
List<ComCdBas> comCdBasList = comCodeDomainService.getComCdBasList(rq.getGroupCd()); List<ComCdBas> comCdBasList = comCodeDomainService.getComCdBasList(rq.getGroupCd());
List<CodeRS> rs = comCdBasList.stream().map(entity -> { List<CodeRS> 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) { public CodeGroupDTO updateCodeGroup(FormCodeGroupRQ rq) {
ComCdGroupBas entity = rq.toEntity(); ComCdGroupBas entity = rq.toEntity();
ComCdGroupBas comCdGroupBas = comCodeDomainService.updateComCdGroupBas(entity); 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) { public CodeDTO updateCode(FormCodeRQ rq) {
ComCdBas entity = rq.toEntity(); ComCdBas entity = rq.toEntity();
ComCdBas comCdBas = comCodeDomainService.updateComCdBas(entity); 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) { public CodeLangDTO updateCodeLang(FormCodeLangRQ rq) {
ComCdLangCtg entity = rq.toEntity(); ComCdLangCtg entity = rq.toEntity();
ComCdLangCtg comCdLangCtg = comCodeDomainService.updateComCdLangCtg(entity); 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) { public void deleteCodeGroup(String groupCd) {
comCodeDomainService.deleteComCdGroupBas(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) { public void deleteCode(String groupCd, String cdId) {
comCodeDomainService.deleteComCdBas(groupCd, 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) { public void deleteLang(String groupCd, String cdId, String langDivCd) {
comCodeDomainService.deleteComCdLangCtg(groupCd, cdId, langDivCd); comCodeDomainService.deleteComCdLangCtg(groupCd, cdId, langDivCd);
} }

Loading…
Cancel
Save