목차 >> Core +- Glue Service ----+- dependency ----+- applicationContext.xml ----+- GlueBizController |
Glue Service는 독립적인 Business의 한 기능을 수행하는 실행 단위입니다.
그림과 같이 Glue Service는 Glue Activity Diagram과 일치하며, XML 파일은 Glue Activity Diagram 을 통해 생성할 수 있습니다( ex> hello.glue_uml_ad -> hello-service.xml ).
Glue Service의 수정이 필요할 때는, XML 스키마(GlueService.xsd)를 준수하기 위해 Glue Activity Diagram을 수정해서 XML파일을 재생성 하도록 합니다.
그림 : Glue Service (xml & diagram) |
그림 : Glue Service (db & diagram) |
Glue Service는 Activity와 Activity 간의 흐름으로 구성되어 있습니다. Glue Service의 크기는 설계자&개발자의 성향에 따라 다를 수 있습니다.
Glue Service를 실행시 다음 dependency 와 applicationContext.xml이 필요합니다. Glue Core 모듈의 프로젝트 정보에서 의존물들을 확인할 수 있습니다.
<dependency> <groupId>com.poscoict</groupId> <artifactId>glue-core</artifactId> <version>${glue.version}</version> </dependency>
Glue Service 실행시 applicationContext.xml이 필요하며, applicationContext.xml에는 serviceManager(bean id 고정임)가 포함되어 있어야 합니다.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id="serviceManager" class="com.poscoict.glueframework.biz.control.GlueServiceManagerImpl"> <property name="cacheManager" ref="cacheManager" /> <property name="serviceLoader" ref="serviceLoader" /> </bean> <bean id="cacheManager" class=. . ./> <bean id="serviceLoader" class=". . ."/> </beans>
GlueServiceLoader 는 GlueService를 file로 부터 생성합니다.
GlueServiceManagerImpl 이 참조하는 serviceLoader는 다음과 같은 속성을 갖을 수 있습니다 (GlueAPI).
<bean id="serviceLoader" class="com.poscoict.glueframework.biz.control.GlueServiceLoader"/>
<bean id="serviceLoader" class="com.poscoict.glueframework.biz.control.GlueServiceLoader"> <property name="rootPath" ref="path/biz"/> </bean>
<bean id="serviceLoader" class="com.poscoict.glueframework.biz.control.GlueServiceLoader"> <property name="extraServiceFiles"> <list> <value>path/biz1-service.xml</value> <value>path/biz2-service.xml</value> </list> </property> </bean>
GlueServiceDBLoader 는 GlueService를 DB로 부터 생성합니다.
DB 생성 Script는 glue-core 모듈안에 포함되어 있습니다. ( com.poscoict.glueframework.biz.control )
GlueServiceManagerImpl 이 참조하는 serviceLoader는 다음과 같은 속성을 갖을 수 있습니다 (GlueAPI).
<bean id="serviceLoader" class="com.poscoict.glueframework.biz.control.GlueServiceDBLoader"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="dataSource" ... />
내부적으로 다음 SQL이 사용됩니다.
select SERVICE_NAME from SERVICE_INFO
select INITIAL_ACTIVITY from SERVICE_INFO where SERVICE_NAME=?
select TX_NAME, TX_VAL from SERVICE_TX_MAPPING where SERVICE_NAME=?
select ACTIVITY_NAME, ACTIVITY_CLASS from SERVICE_ACTIVITY_INFO where SERVICE_NAME=?
select TRANSITION_NAME, TRANSITION_VAL from SERVICE_ACTIVITY_FLOW where SERVICE_NAME=? and ACTIVITY_NAME=?
select PROPERTY_NAME, PROPERTY_VAL from SERVICE_ACTIVITY_PROPERTY where SERVICE_NAME=? and ACTIVITY_NAME=?
queryManager : 참조할 GlueQueryManager Bean
queryIdMap : service loading sql 정보 map
<bean id="serviceLoader" class="com.poscoict.glueframework.biz.control.GlueServiceDBLoader"> <property name="dataSource" ref="dataSource"/> <property name="queryManager" ref="queryManager"/> <property name="queryIdMap"> <map> <entry key="serviceList" value="meta.service.list.select" /> <entry key="serviceInfo" value="meta.service.select" /> <entry key="transactionManagerInfo" value="meta.tx.select" /> <entry key="activityList" value="meta.activity.select" /> <entry key="transitionInfo" value="meta.transition.select" /> <entry key="propertyInfo" value="meta.property.select" /> </map> </property> </bean> <bean id="dataSource" ... /> <bean id="queryManager" ... />
제공되는 DB script를 수정해서 사용하는 경우 다음과 같이 query file을 작성할 수 있습니다. queryManager와 queryIdMap property를 사용해서 default SQL를 수정할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?> <queryMap desc="" xmlns="http://www.poscoict.com/glueframework/query"> <query id="meta.service.list.select" desc="" resultType="" isNamed="false"><![CDATA[ select MVC_SERVICE_NM as "SERVICE_NAME" from TB_M00_GL_SERVICE_INFO ]]></query> <query id="meta.service.select" desc="" resultType="" isNamed="false"><![CDATA[ select ACTIVITY_NM as "INITIAL_ACTIVITY" from TB_M00_GL_SERVICE_INFO where MVC_SERVICE_NM=? ]]></query> <query id="meta.tx.select" desc="" resultType="" isNamed="false"><![CDATA[ select ATTRIBUTE1 as "TX_NAME", ATTRIBUTE2 as "TX_VAL" from TB_M00_GL_TX_MAPPING where MVC_SERVICE_NM=? ]]></query> <query id="meta.activity.select" desc="" resultType="" isNamed="false"><![CDATA[ select ACTIVITY_NM as "ACTIVITY_NAME", CLASS_NM as "ACTIVITY_CLASS" from TB_M00_GL_ACTIVITY_INFO where MVC_SERVICE_NM=? ]]></query> <query id="meta.trasition.select" desc="" resultType="" isNamed="false"><![CDATA[ select ATTRIBUTE1 as "TRANSITION_NAME", ATTRIBUTE2 as "TRANSITION_VAL" from TB_M00_GL_ACTIVITY_FLOW where MVC_SERVICE_NM=? and ACTIVITY_NM=? ]]></query> <query id="meta.property.select" desc="" resultType="" isNamed="false"><![CDATA[ select ATTRIBUTE1 as "PROPERTY_NAME", ATTRIBUTE2 as "PROPERTY_VAL" from TB_M00_GL_ACTIVITY_PROPERTY where MVC_SERVICE_NM=? and ACTIVITY_NM=? ]]></query> </queryMap>
Glue Service를 실행하기 위해서는 com.poscoict.glueframework.biz.control.GlueBizController를 사용합니다. (Quick Start의 Test.java 참고)
GlueContext ctx = . . . ctx.put( GlueBizControlConstants.SERVICE_NAME, "hello-service" ); . . . GlueBizController controller = GlueBizProvider.getController(); controller.doAction( ctx );
GlueBizController 는 다음과 같이 2가지 Method를 제공합니다. (GlueAPI)
제공되는 Method를 를 통해 Glue Service를 실행시킬 수 있으며, Glue Service 실행시 필요한 Data는 GlueContext 를 통해 전달합니다. Glue Service가 실행되기 위해서는 GlueContext에는 항상 ServiceName이 포함되어 있어야 합니다. 그렇지 않으면 다음과 같은 형태의 에러메세지를 확인할 수 있습니다.
Exception in thread "main" com.poscoict.glueframework.GlueException: ServiceName doesn't exist at com.poscoict.glueframework.biz.control.GlueBizControllerImpl.doAction(GlueBizControllerImpl.java:227) at test.Test.main(Test.java:18)