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