> Ehcache 검색 (Search API)
Ehcache에서 제공하는 Search API를 이용하면 Index가 있는 Cache에 대하여 쿼리 검색이 가능하다. 참고로 Search API는 BigMemory Go, BigMemory Max라고 부르는 테라코타(사)의 Cache 전용 단일 및 분산 서버를 통해 이용할 때와, 오픈소스로 제공하는 별도의 Cache 서버 없이 Java-heap을 이용할때와 작동방식이 다르다. 하지만 두가지 방식다 EhCache Interface를 이용하기 때문에 Search API를 사용하는 방법은 동일하다.
> Cache Searchable 생성
Searchable이란? 검색가능한 “속성”이라고 이야기 할 수 있을 것 같다. Key – Value로 구성되는 EhCache의 기본 구성에서는 바로 검색을 위하여 색인을 해야하는 필드의 지정이 필요하다. 당연한 이야기지만, 원하는 Value의 Key를 특정할 수 있다면 검색은 필요없다. Value혹은 그 구성 항목의 일부, 혹은 Key의 일부 구성항목만으로 원하는 값/집합을 얻어야 할때 검색은 필요해진다. Key와 Value의 멤버나 Method의 반환값 등 을 Searchable로 지정해서 원하는 쿼리의 조건을 받을 준비를 하는 것이다.
프로그램으로 설정하는 방법도 있지만, 본 포스트에서는 설정파일을 이용하는 방법만 다루어 보려고 한다.
Ehcache 설정파일 (ehcache.xml)에서 검색을 원하는 Cache 항목에 아래와 같이 <searchable> 및 <searchAttribute> 를 추가한다.
<cache name="EventAll" maxElementsInMemory="2000" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> <searchable> <searchAttribute name="codename" expression="value.getCodename()"/> <searchAttribute name="title" expression="value.getTitle()"/> <searchAttribute name="program" expression="value.getProgram()"/> <searchAttribute name="end_date" expression="value.getEnd_date()"/> </searchable> </cache>
- <searchable> : 검색가능한 Cache로 지정한다.
- <searchAttribute> : 검색을 위해 색인(Indexing)해야 할 필드(속성)을 정한다. 위에 예에서는 해당 Cache의 Value에는 DTO형식의 Entity Class가 사용되기에 해당 멤버변수의 Getter가 Expression에 들어갔다. Expression은 항상 key, value, element 중 하나로 시작해야한다. 본 Tag로 지정된 항목만 Cache검색 Query의 조건으로 사용이 가능하다. expression은 위와 같이 표현하거나, 혹은 AttributeExtractor를 이용해 추출을 고도화 할 수 도 있다.
> 검색의 수행
Ehcache cache = ehCacheManager.getCacheManager().getEhcache("EventAll"); Attribute<String> cultcodeAt= cache.getSearchAttribute("cultcode"); Attribute<String> codenameAt= cache.getSearchAttribute("codename"); Attribute<String> titleAt = cache.getSearchAttribute("title"); Attribute<String> programAt = cache.getSearchAttribute("program"); Criteria searchCriteria = new Or( codenameAt.ilike ("*" + searchParam.getSearchText() + "*") , titleAt.ilike ("*" + searchParam.getSearchText() + "*")) .or(programAt.ilike ("*" + searchParam.getSearchText() + "*")) .and(endDateAt.ge(CommUtil.getToday())); Query query = cache.createQuery() .addCriteria(searchCriteria) .addOrderBy(cultcodeAt, Direction.DESCENDING) .includeValues() .end(); List<Result> resultList = query.execute().all();
위의 Ehcache Search API 사용 예는 like 조건과 And 조건을 중첩하여 조건(Criteria)가 작성된 예이다.
(codename like ‘%searchText%’
OR title like ‘%searchText%’
OR program like ‘%searchText%’)
AND endDate = ‘20180426’
- Attribute : (net.sf.ehcache.search.Attribute) 앞서 설정파일에 명시한 Searchable 값에 해당하는 Class.
- Criteria : (net.sf.ehcache.search.expression.Criteria) 조건식을 위한 Interface이다. 이를 구현한 비교, 논리 Operator들을 이용해 조건식을 만든다. 사용가능한 논리, 비교 Operator는 아래와 같다.
- Query : (net.sf.ehcache.search.Query) 검색 조건식과 정렬순서, 그리고 결과로 받을 대상등을 정하여 쿼리를 작성할 수 있게 해준다.
- addCriteria() : 작성한 검색 조건식을 주입해준다.
- addOrderBy() : 정렬을 위해 검색 대상 Attribute와 정렬방식을 정한다.
- includeValues() : 검색 결과가 포함할 대상을 정한다. (Key도 결과에 포함할 경우 : includeKeys())
- execute() : 검색을 실행하여 결과를 Ehcache의 결과표현 기본 객체로 반환해준다. (net.sf.ehcache.search.Results)
- all() : 결과를 (net.sf.ehcache.search.Results) 가 아닌 LIst<Result>로 받기 위해 사용되었다.
> 참고 URL
- http://www.ehcache.org/documentation/2.8/apis/search.html
(프로그램방식의 설정, DynamicAttributeExtractor, 쿼리효율화 등 더 많은 참고내용 확인)