@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 인터페이스를 구현합니다.
- MEMORY
- 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 |