티스토리 뷰

Programing/Java

IBATIS CacheModel

Tomining 2016. 9. 26. 23:45

@info
ibatis 프로젝트는 종료 되었으며, 2010/06/16 Mybatis로 이관되었습니다.


개요

웹 개발을 할 때, 자주 변경되지 않는 또는 거의 변경이 없는 값들이 있습니다. 성능을 위해 이런 값들을 매번 DB에서 조회하기 보다는 캐시에 저장할 수 있습니다. ibatis에서 캐시를 사용하려면 cacheModel을 설정하면 됩니다. cacheModel을 어떻게 사용할 수 있는지 소개하도록 하겠습니다.


환경

  • ibatis - 2.3.0.677-p5
  • java - 1.8.0


Ibatis CacheModel 설정

ibatis CacheModel 설정을 하기 전에 ibatis sqlmap settings에서 cacheEnabled 옵션을 true로 설정해 주어야 합니다.

<sqlMapConfig>
   <settings cacheModelsEnabled="true"
              statementCachingEnabled="false" />

   <!-- 설정 -->

</sqlMapConfig>

statementCachingEnabled 옵션은 SQL 자체를 캐시할 때 사용하는 옵션으로 CacheModel을 적용할 때는 false로 설정합니다.

그럼 product-cache라는 이름을 가진 CacheModel을 설정해 보겠습니다.
product-cache는 아래와 같은 옵션을 갖고 있습니다.
  • LRU 타입
  • read-only
  • cache 갱신 주기 - 24시간
  • cache size - 100
  • insertProduct, updateProduct, deleteProduct 쿼리가 실행 될 때, cache 갱신

<cacheModel id="product-cache" type="LRU" readOnly="true" serialize="false">
   <flushInterval hours="24"/>
   <flushOnExecute  statement="insertProduct"/>
   <flushOnExecute  statement="updateProduct"/>
   <flushOnExecute  statement="deleteProduct"/>
   <property name=“size" value="100"/>
</cacheModel>


statement에 cacheModel 적용

getProductList 쿼리에 product-cache를 적용한 예제입니다.

<statement id="getProductList" cacheModel="product-cache">
   select * from PRODUCT where PRD_CAT_ID = #value#
</statement>


CacheModel 옵션

  • readOnly
    기본값은 true로 cache된 객체가 변경이 불가능하나 조회 성능은 false인 경우보다 높습니다.

  • serialize
    readOnly=“false” 인 경우로 객체를 cache할 때 serialize 할 지 여부입니다. true로 설정하는 것이 성능이나 저장공간에서 이득을 볼 수 있습니다.

  • type
    Cache 종류를 의미합니다. ibatis cacheModel에는 3가지 타입이 있습니다.

    • MEMORY
      메모리에 Cache된 객체가 GC 대상이 될 때까지 Cache에 저장됩니다.
      MEMORY(메모리)로 설정한 경우 참조 타입을 설정할 수 있습니다.
      •  WEAK(기본값) - GC에 의해 수거되는 것을 막지 않기 때문에 캐시된 데이터를 빠르게 비워 줍니다.
      • SOFT - 메모리 용량 내에서 최대한 캐시된 객체를 보관합니다.
      • STRONG - 메모리 한계에 관계없이 캐시된 객체를 계속 보관합니다. GC에 수거되지 않고 계속 메모리에 저장되어 있어 메모리 부족이 발생할 수 있습니다.
    • LRU
      Least Recently Used의 약자로 가장 최근에 오랫동안 사용되지 않은 객체를 캐시로부터 제거하는 방식입니다. 캐시 용량을 넘겼을 때만 객체가 캐시에서 제거되는데, 캐시 용량은 size 속성으로 설정할 수 있습니다.

    • FIFO
      First In First Out의 약자로 먼저 캐시된 객체를 먼저 제거하는 방식입니다. LRU와 동일하게 캐시 용량을 넘겼을 때만 객체가 캐에서 제거됩니다.

    • Custom Cache
      사용자가 캐시 모델을 만들어서 적용할 수 있습니다. com.ibatis.sqlmap.engine.cache.CacheController 인터페이스를 구현합니다.
  • flushinterval
    특정 주기로 캐시된 객체를 제거하기 위한 옵션입니다. hours, minutes, seconds, milliseconds 4가지로 설정할 수 있습니다.

  • flushOnExecute
    특정 statement가 실행될 때 캐시된 객체를 모두 제거하는 옵션입니다. 보통 캐시된 객체를 DB에서 저장, 수정 또는 삭제할 때 적용합니다.
    statement를 설정할 때는 “Namespace.statement”로 설정해야 합니다.


결론

개인적으로 캐시를 적용할 때에는 기본값을 사용하기 보다는 사용하고자 하는 목적에 맞게 옵션들을 설정하여 사용하는 것이 좋다고 생각합니다. 각 옵션들이 설정되지 않으면 기본값으로 설정되지만 명시적으로 작성해 두는 것이 유지보수나 가독성 측면에서 좋다고 생각합니다.



참고

'Programing > Java' 카테고리의 다른 글

Java Collection Framework  (0) 2016.09.30
논리 연산자(||, &&)와 비트 연산자(|, &)  (0) 2016.09.28
Exception Propagation  (0) 2016.07.28
Java 로그에서 StackTrace 가 생략되는 현상  (0) 2016.04.04
json parser 정리  (0) 2016.04.04
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함