티스토리 뷰

728x90
반응형

 

 

[Spring] Cache적용하여 속도 개선하기.

적용하게 된 계기 회사내에 프로젝트를 하다가 상품등록시에 상품마다 매번 Category, Brand 등의 테이블을 조회 해와서 유효성 검증을 하고 있었다. 이걸 개선해보고 싶어서 캐싱을 적용해 봤고 포

hoony-devblog.tistory.com

지난번 포스팅때 간단하게 JCache를 이용하여 cache를 적용해 보았는데,

요번 포스팅에는 간단하게 캐시 관련해서 eventListener를 추가해서 로그를 한번 찍어보려고 한다.

 

 

SimpleCacheEntryListener 구현

@Component
class SimpleCacheEntryListener :
  CacheEntryCreatedListener<Any, Any>,
  CacheEntryExpiredListener<Any, Any>,
    Log
{

  override fun onCreated(events: MutableIterable<CacheEntryEvent<out Any, out Any>>) {
    logger.info("[onCreated]")
    logger.info("[onCreated]")
    events.forEach { event ->
      logger.info("[onCreated] eventType: "+event.eventType)
      logger.info("[onCreated] oldValue: "+event.oldValue)
      logger.info("[onCreated] isOldValueAvailable: "+event.isOldValueAvailable)
      logger.info("[onCreated] key: "+event.key)
      logger.info("[onCreated] source: "+event.source)
      logger.info("[onCreated] value: "+event.value)
    }
  }

  override fun onExpired(events: MutableIterable<CacheEntryEvent<out Any, out Any>>) {
    logger.info("[onExpired]")
    events.forEach { event ->
      logger.info("[onExpired] eventType: "+event.eventType)
      logger.info("[onExpired] oldValue: "+event.oldValue)
      logger.info("[onExpired] isOldValueAvailable: "+event.isOldValueAvailable)
      logger.info("[onExpired] key: "+event.key)
      logger.info("[onExpired] source: "+event.source)
      logger.info("[onExpired] value: "+event.value)
    }
  }
}

CacheConfig

  • 지난 포스팅에 이어 CacheConfig에 SimpleCacheEntryListener 를 이용해 Log를 남기는 코드를 추가한다
object CacheNames {
  const val META_DATA_SERVICE_GET_CATEGORY: String = "cacheservice.category"
}

data class CacheSetting(
  val cacheNames: String,
  val config: MutableConfiguration<Any, Any>
)

@EnableCaching
@Configuration
class CacheConfig : Log {

  @Bean
  fun customCacheManager( cacheSettings : List<CacheSetting>): CacheManager {
    val cacheManager: CacheManager = Caching.getCachingProvider().cacheManager

    cacheSettings.forEach { cacheSetting ->
      cacheManager.createCache(cacheSetting.cacheNames, cacheSetting.config)
    }
    return cacheManager
  }

  @Bean
  fun getCategoryCache( customCacheEntryListenerConfiguration : MutableCacheEntryListenerConfiguration<Any, Any> ) : CacheSetting {
    return CacheSetting(
      CacheNames.META_DATA_SERVICE_GET_CATEGORY,
      MutableConfiguration<Any, Any>()
        .setTypes(Any::class.java, Any::class.java)
        .setExpiryPolicyFactory {
          object : ExpiryPolicy {
            override fun getExpiryForCreation(): Duration {
              logger.info("[getExpiryForCreation]")
              return Duration.ONE_MINUTE
            }

            override fun getExpiryForAccess(): Duration {
              logger.info("[getExpiryForAccess]")
              return Duration.ONE_MINUTE
            }

            override fun getExpiryForUpdate(): Duration {
              logger.info("[getExpiryForUpdate]")
              return Duration.ONE_MINUTE
            }
          }
        }
        .addCacheEntryListenerConfiguration( customCacheEntryListenerConfiguration )
        .setStoreByValue(true)
    )
  }

  @Bean
  fun customCacheEntryListenerConfiguration() : MutableCacheEntryListenerConfiguration<Any, Any> {
    return MutableCacheEntryListenerConfiguration<Any, Any>(
      FactoryBuilder.factoryOf(SimpleCacheEntryListener::class.java),
      null,
      true,
      true
    )
  }
}

Service 로직

@Service
class CacheService: Log {

  @Cacheable(value = [CacheNames.META_DATA_SERVICE_GET_CATEGORY], key = "#root.methodName", )
  fun getCategory() : List<CategoryDto> {
    logger.info("getCategory called")
    return mutableListOf(
        CategoryDto("11111111", "반팔" ),
        CategoryDto("11111112", "반바지" ),
        CategoryDto("11111113", "코트" ),
    )
  }
}

로그

호출해보면 정상적으로 생성되는 시점에 로그가 찍히는 것을 알 수 있다.

onExpire 이벤트

만료시간을 1분으로 하고

호출 후 2분뒤 호출하여 log확인하여 봤는데

1분이 지나고 바로 onExpire로그가 찍히지 않고

cache를 다시 요청했을 때에 로그가 찍히는 것을 볼 수 있었다.

728x90
반응형
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함