Ehcache – 검색 (Search API)

> 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