목차 >> Core 
+- Glue Service  
----+- dependency  
----+- applicationContext.xml  
----+- GlueBizController

5장 Core

Glue Service

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
그림 : Glue Service (db & diagram)
Glue Service

Glue Service는 Activity와 Activity 간의 흐름으로 구성되어 있습니다. Glue Service의 크기는 설계자&개발자의 성향에 따라 다를 수 있습니다.

dependency

Glue Service를 실행시 다음 dependency 와 applicationContext.xml이 필요합니다. Glue Core 모듈의 프로젝트 정보에서 의존물들을 확인할 수 있습니다.

<dependency>
    <groupId>com.poscoict</groupId>
    <artifactId>glue-core</artifactId>
    <version>${glue.version}</version>
</dependency>

applicationContext.xml

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

GlueServiceLoader 는 GlueService를 file로 부터 생성합니다.
GlueServiceManagerImpl 이 참조하는 serviceLoader는 다음과 같은 속성을 갖을 수 있습니다 (GlueAPI).

  • rootPath : service file이 위치하는 디렉토리를 지정할 수 있습니다.
    default는 service
    <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>
    
  • extraServiceFiles : service file을 직접 지정할 수 있습니다.
    <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

GlueServiceDBLoader 는 GlueService를 DB로 부터 생성합니다.
DB 생성 Script는 glue-core 모듈안에 포함되어 있습니다. ( com.poscoict.glueframework.biz.control )
GlueServiceManagerImpl 이 참조하는 serviceLoader는 다음과 같은 속성을 갖을 수 있습니다 (GlueAPI).

  • dataSource : 참조할 DataSource Bean
    <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을 작성할 수 있습니다. queryManagerqueryIdMap 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>
    

GlueBizController

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)

  • GlueContext doAction(GlueContext ctx)
  • GlueContext doSubController(GlueContext ctx, boolean newTx)

제공되는 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)