From cf963cd1354017cdf8cbd311e7272c0e7dbabd14 Mon Sep 17 00:00:00 2001 From: limju Date: Tue, 12 Sep 2023 18:12:32 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20cache(CaffeineCache)=20API=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/spring/config/CacheKeyGenerator.java | 16 ++++ .../kr/xit/core/spring/config/CacheType.java | 26 ++++++ .../xit/core/spring/config/CachingConfig.java | 86 +++++++++++++++++++ .../mapper/biz/ens-cmm-mysql-mapper.xml | 42 +++++++++ .../mapper/core/auth-mysql-mapper.xml | 42 ++++----- .../mapper/core/logging-mysql-mapper.xml | 70 +++++++-------- 6 files changed, 226 insertions(+), 56 deletions(-) create mode 100644 mens-api/src/main/java/kr/xit/core/spring/config/CacheKeyGenerator.java create mode 100644 mens-api/src/main/java/kr/xit/core/spring/config/CacheType.java create mode 100644 mens-api/src/main/java/kr/xit/core/spring/config/CachingConfig.java create mode 100644 mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-mysql-mapper.xml diff --git a/mens-api/src/main/java/kr/xit/core/spring/config/CacheKeyGenerator.java b/mens-api/src/main/java/kr/xit/core/spring/config/CacheKeyGenerator.java new file mode 100644 index 0000000..12fded0 --- /dev/null +++ b/mens-api/src/main/java/kr/xit/core/spring/config/CacheKeyGenerator.java @@ -0,0 +1,16 @@ +package kr.xit.core.spring.config; + +import java.lang.reflect.Method; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.cache.interceptor.SimpleKeyGenerator; + +public class CacheKeyGenerator implements KeyGenerator { + + @Override + public Object generate(Object target, Method method, Object... params) { + StringBuilder keyBuilder = new StringBuilder(); + keyBuilder.append(method.getName()); + keyBuilder.append(SimpleKeyGenerator.generateKey(params)); + return keyBuilder.toString(); + } +} diff --git a/mens-api/src/main/java/kr/xit/core/spring/config/CacheType.java b/mens-api/src/main/java/kr/xit/core/spring/config/CacheType.java new file mode 100644 index 0000000..48f44bb --- /dev/null +++ b/mens-api/src/main/java/kr/xit/core/spring/config/CacheType.java @@ -0,0 +1,26 @@ +package kr.xit.core.spring.config; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum CacheType { + + NICE_CRTF("niceCrtfInfo", 60 * 60 * 24, 1), + ; + + /** + * 캐시 이름 + */ + private final String cacheName; + + /** + * 만료시간 + */ + private final int expireAfterWrite; + /** + * 최대갯수 + */ + private final int maximumSize; +} diff --git a/mens-api/src/main/java/kr/xit/core/spring/config/CachingConfig.java b/mens-api/src/main/java/kr/xit/core/spring/config/CachingConfig.java new file mode 100644 index 0000000..46a9594 --- /dev/null +++ b/mens-api/src/main/java/kr/xit/core/spring/config/CachingConfig.java @@ -0,0 +1,86 @@ +package kr.xit.core.spring.config; + +import com.github.benmanes.caffeine.cache.RemovalCause; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.caffeine.CaffeineCache; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.cache.support.SimpleCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.github.benmanes.caffeine.cache.Caffeine; + +/** + * + * ✔ initialCapacity: 내부 해시 테이블의 최소한의 크기를 설정합니다. + * ✔ maximumSize: 캐시에 포함할 수 있는 최대 엔트리 수를 지정합니다. + * ✔ maximumWeight: 캐시에 포함할 수 있는 엔트리의 최대 무게를 지정합니다. + * ✔ expireAfterAccess: 캐시가 생성된 후, 해당 값이 가장 최근에 대체되거나 마지막으로 읽은 후 특정 기간이 경과하면 캐시에서 자동으로 제거되도록 지정합니다. + * ✔ expireAfterWrite: 항목이 생성된 후 또는 해당 값을 가장 최근에 바뀐 후 특정 기간이 지나면 각 항목이 캐시에서 자동으로 제거되도록 지정합니다. + * ✔ refreshAfterWrite: 캐시가 생성되거나 마지막으로 업데이트된 후 지정된 시간 간격으로 캐시를 새로 고칩니다. + * ✔ weakKeys: 키를 weak reference로 지정합니다. (GC에서 회수됨) + * ✔ weakValues: Value를 weak reference로 지정합니다. (GC에서 회수됨) + * ✔ softValues: Value를 soft reference로 지정합니다. (메모리가 가득 찼을 때 GC에서 회수됨) + * ✔ recordStats: 캐시에 대한 Statics를 적용합니다. + * + * + * + * ⚠️ expireAfterWrite 와 expireAfterAccess 가 함께 지정된 경우, expireAfterWrite가 우선순위로 적용됩니다. + * ⚠️ maximumSize와 maximumWeight는 함께 지정될 수 없습니다. + */ +@Slf4j +@EnableCaching +@Configuration +public class CachingConfig { + + /** + *
+     * ✔ initialCapacity: 내부 해시 테이블의 최소한의 크기를 설정합니다.
+     * ✔ maximumSize: 캐시에 포함할 수 있는 최대 엔트리 수를 지정합니다.
+     * ✔ maximumWeight: 캐시에 포함할 수 있는 엔트리의 최대 무게를 지정합니다.
+     * ✔ expireAfterAccess: 캐시가 생성된 후, 해당 값이 가장 최근에 대체되거나 마지막으로 읽은 후 특정 기간이 경과하면 캐시에서 자동으로 제거되도록 지정합니다.
+     * ✔ expireAfterWrite: 항목이 생성된 후 또는 해당 값을 가장 최근에 바뀐 후 특정 기간이 지나면 각 항목이 캐시에서 자동으로 제거되도록 지정합니다.
+     * ✔ refreshAfterWrite: 캐시가 생성되거나 마지막으로 업데이트된 후 지정된 시간 간격으로 캐시를 새로 고칩니다.
+     * ✔ weakKeys: 키를 weak reference로 지정합니다. (GC에서 회수됨)
+     * ✔ weakValues: Value를 weak reference로 지정합니다. (GC에서 회수됨)
+     * ✔ softValues: Value를 soft reference로 지정합니다. (메모리가 가득 찼을 때 GC에서 회수됨)
+     * ✔ recordStats: 캐시에 대한 Statics를 적용합니다.
+     *
+     *
+     *
+     * ⚠️ expireAfterWrite 와 expireAfterAccess 가 함께 지정된 경우, expireAfterWrite가 우선순위로 적용됩니다.
+     * ⚠️ maximumSize와 maximumWeight는 함께 지정될 수 없습니다.
+     * 
+ */ + @Bean + public CacheManager cacheManager() { + List caffeineCaches = Arrays.stream(CacheType.values()) + .map(cache -> new CaffeineCache( + cache.getCacheName(), + Caffeine.newBuilder() + .recordStats() + .expireAfterWrite(cache.getExpireAfterWrite(), TimeUnit.SECONDS) + .maximumSize(cache.getMaximumSize()) + .evictionListener((Object key, Object value, RemovalCause cause) -> + log.info("Key {} was evicted ({}): {}", key, cause, value)) + .build() + )) + .collect(Collectors.toList()); + + final SimpleCacheManager cacheManager = new SimpleCacheManager(); + cacheManager.setCaches(caffeineCaches); + return cacheManager; + } + + @Bean + public KeyGenerator cacheKeyGenerator() { + return new CacheKeyGenerator(); + } +} diff --git a/mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-mysql-mapper.xml b/mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-mysql-mapper.xml new file mode 100644 index 0000000..9a8ac13 --- /dev/null +++ b/mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-mysql-mapper.xml @@ -0,0 +1,42 @@ + + + + + + + + /** ens-cmm-mysql-mapper|updateNiceCrtfPublickey-Nice publickey 인증정보 갱신|julim */ + UPDATE tb_cmm_nice_instn_crtf_info + SET site_code = #{siteCode}, + key_version = #{keyVersion}, + public_key = #{publicKey}, + valid_dtim = #{validDtim}, + updt_dt = now(), + updusr = #{updusr} + WHERE signgu_code = #{signguCode} + AND ffnlg_code = #{ffnlgCode} + AND client_id = #{clientId} + + + diff --git a/mens-api/src/main/resources/egovframework/mapper/core/auth-mysql-mapper.xml b/mens-api/src/main/resources/egovframework/mapper/core/auth-mysql-mapper.xml index 87d4f38..f4a3684 100644 --- a/mens-api/src/main/resources/egovframework/mapper/core/auth-mysql-mapper.xml +++ b/mens-api/src/main/resources/egovframework/mapper/core/auth-mysql-mapper.xml @@ -1,26 +1,26 @@ - + - - + + diff --git a/mens-api/src/main/resources/egovframework/mapper/core/logging-mysql-mapper.xml b/mens-api/src/main/resources/egovframework/mapper/core/logging-mysql-mapper.xml index ac4db08..f68b09f 100644 --- a/mens-api/src/main/resources/egovframework/mapper/core/logging-mysql-mapper.xml +++ b/mens-api/src/main/resources/egovframework/mapper/core/logging-mysql-mapper.xml @@ -1,43 +1,43 @@ - - - /** logging-mysql-mapper|saveLogging|julim */ - INSERT INTO tb_cmm_api_log ( - request_id - , system_id - , req_system_id - , method - , uri - , param - , ip - , access_token - , session_id - , success - , response - , message - , regist_dt - , regist_id - ) VALUES ( - #{requestId} - , #{systemId} - , #{reqSystemId} - , #{method} - , #{uri} - , #{param} - , #{ip} - , #{accessToken} - , #{sessionId} - , #{success} - , #{response} - , #{message} - , now(3) - , #{registId} - ) - + + /** logging-mysql-mapper|saveLogging|julim */ + INSERT INTO tb_cmm_api_log ( + request_id + , system_id + , req_system_id + , method + , uri + , param + , ip + , access_token + , session_id + , success + , response + , message + , regist_dt + , regist_id + ) VALUES ( + #{requestId} + , #{systemId} + , #{reqSystemId} + , #{method} + , #{uri} + , #{param} + , #{ip} + , #{accessToken} + , #{sessionId} + , #{success} + , #{response} + , #{message} + , now(3) + , #{registId} + ) + /** logging-mysql-mapper|updateLogging|julim */