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
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'

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;
//
//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<Object, Object> 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<Object, Object> 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)))));
}
};
}
}

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();
// }
@Bean
@Bean(name = "redisCacheManager")
public CacheManager redisCacheManager(RedisConnectionFactory cf) {
ObjectMapper objectMapper = new ObjectMapper();
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
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
cache:
type: redis
data:
redis:
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;
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

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;
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<ComCdGroupBas> comCdGroupBasList = comCodeDomainService.getComCdGroupBasList(rq.getSiteCd());
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() {
List<ComCdGroupBas> comCdGroupBasList = comCodeDomainService.getComCdGroupBasList();
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) {
List<ComCdBas> comCdBasList = comCodeDomainService.getComCdBasList(rq.getGroupCd());
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) {
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);
}

Loading…
Cancel
Save