목차 >> Cache Manager +- GlueCacheManager ----+- GlueCacheRegions ----+- GlueCacheLoader |
본 문서에서 언급하는 Cache라 함은 자바 오브젝트를 저장하는 메모리 상의 공간을 의미합니다.
Cache에 Data(자바 오브젝트)를 저장하면, 원래의 Data를 접근하는 시간을 절약 할 수 있습니다. 그렇기 때문에 Data Caching은 애플리케이션의 성능 향상을 위해 매우 중요한 고려사항 중 하나입니다.
Glue Framework 에서는 Service Definition, Message Definition, Query Definition 이 File에 관리됩니다. 필요시마다 File(디스크 IO)을 읽는다면, 애플리케이션 성능에 영향을 줄 수 있습니다. 그래서 Service Definition, Message Definition, Query Definition 등을 Caching 하고 있습니다.
애플리케이션에서도 오브젝트 생성에 코스트가 많이 소모되는 경우나 빈번하게 사용되는 read-only성 오브젝트들을 Cache에 저장하여 사용하는 것이 좋습니다.
Data Caching을 위한 open-source는 다양하나, Glue Framework에서는 EhCache와 JCS를 이용하고 있습니다. 다음은 EhCache와 JCS 사이트 입니다.
GlueCacheManager는 Data Caching 과 관련해서 오브젝트를 저장/추출/삭제 오퍼레이션을 제공합니다. GlueCacheManager에서 제공하는 메소드는 Java Doc을 참고합니다. (GlueAPI)
그림 : GlueCacheManager |
다음은 Glue Caching Component 아키텍처 입니다.
그림 : Glue Caching Component Architecture |
Client 에서 Cache Manager에게 필요한 오브젝트를 요구합니다.
Cache Manager는 해당하는 오브젝트가 존재할 때는 Cache 영역에서 캐싱된 오브젝트를 획득하여 Client에게 서비스합니다.
존재하지 않으면 원래의 Data를 Data Source에서 찾아서 캐싱하고 Client에서 서비스 합니다.
Client가 직접 3rd Party Caching Solution을 직접 사용하지 않고 Cache Manager라는 공통 인터페이스를 통해서 접근하기 때문에 향후 기존 Client 측 소스를 수정하지 않고도 다른 Caching Solution으로 교체 가능한 장점을 지닌 Flexible 아키텍처 입니다.
다음은 applicationContext.xml 의 일부와 activity 일부입니다.
<bean id="cacheManager" class=. . ./>
public class SampleActivity extends GlueActivity<GlueContext> { @Override public String runActivity( GlueContext ctx ) { GlueCacheManager cacheManager = GlueStaticContext.getBeanFactory().getBeanObject( "cacheManager", GlueCacheManager.class ); String cacheKey = "key"; Object data = null; if(cacheManager.isPresent(cacheKey)){ data = cacheManager.getCacheObject(cacheKey); }else{ data = loadData(); cacheManager.putCacheObject(cacheKey, data); } . . . return GlueBizControlConstants.SUCCESS; } private Object loadData(){ . . . return obj; } }
GlueCacheManager를 통해 Data Caching을 할 때, 오브젝트 성격에 따라 캐쉬 영역을 달리 할 수 있습니다. GlueCacheManager사용시 캐시영역을 지정하지 않으면, DEFAULT_REGION 으로 Data가 Caching됩니다.
다음은 GlueCacheRegions 의 종류이며, Java Doc을 참고합니다. (GlueAPI)
GlueCacheRegions에 정의된 예약어는 내부적으로 사용되니, application에서는 다른 이름을 사용하십시요. 다음은 캐시 영역으로 biz_region를 사용한 예입니다.
public class SampleActivity extends GlueActivity<GlueContext> { @Override public String runActivity( GlueContext ctx ) { GlueCacheManager cacheManager = GlueStaticContext.getBeanFactory().getBeanObject( "cacheManager", GlueCacheManager.class ); String cacheKey = "key"; String cacheRegion = "biz_region"; Object data = null; if(cacheManager.isPresent(cacheKey, cacheRegion)){ data = cacheManager.getCacheObject(cacheKey, cacheRegion); }else{ data = loadData(); cacheManager.putCacheObject(cacheKey, data, cacheRegion); } . . . return GlueBizControlConstants.SUCCESS; } private Object loadData(){ . . . return obj; } }
Cache Loader는 원래의 Data에 접근하는 기능을 담당합니다. 원래의 Data가 있는 Data Source는 File 일수도, DB 일수도, 그외의 다른 것 일수도 있기 때문에 GlueCacheLoader 라는 인터페이스를 제공하고 있습니다. application에서는 원래의 Data를 접근하는 기능을 개발하여야 하며, GlueCacheLoader를 구현하면 됩니다. 위의 SampleActivity에서 loadData() 부분을 Cache Loader로 구현하는 것과 같습니다.
다음 그림과 같이 Glue Framework에서도 Service Definition(name-service.xml)과 Query Definition(query.glue_sql)를 loading 하는 Cache Loader가 있습니다.
GlueBizController 장에 기술된 applicationContext.xml 을 보면, serviceManager는 cacheManager와 serviceLoader를 갖고 있으며, serviceLoader가 Cache Loader임을 알 수 있습니다.
그림 : GlueCacheLoader |
aplicationContext.xml에 다음과 같은 bean이 있을 때, activity는 아래와 같이 개발할 수 있습니다.
<bean id="cacheManager" class=. . ./> <bean id="bizCacheLoader" class=. . ./>
public class SampleActivity extends GlueActivity<GlueContext> { @Override public String runActivity( GlueContext ctx ) { GlueCacheManager cacheManager = GlueStaticContext.getBeanFactory().getBeanObject( "cacheManager", GlueCacheManager.class ); GlueCacheLoader cacheLoader = GlueStaticContext.getBeanFactory().getBeanObject( "bizCacheLoader", GlueCacheLoader.class ); String cacheKey = "key"; String cacheRegion = "biz_region"; Object data = cacheManager.getCacheObject(cacheKey, cacheRegion, cacheLoader); . . . return GlueBizControlConstants.SUCCESS; } }
다음은 GlueCacheLoader를 구현한 초간단 예입니다.
public class SampleCacheLoader implements GlueCacheLoader{ @Override public File loadCacheObject( Object cacheKey, String regionName ) throws GlueException { String baseDir = ...; String filename = baseDir + File.separator + cacheKey + ".txt"; File file = new File(filename); if( file.isFile()){ return file; }else{ throw new GlueException("invalid cacheKey"); } } }