- 1 - 전자정부개발프레임워크실행환경
5. 업무처리레이어 1. 개요 2. Process Control 3. Exception Handling - 2 -
1. 개요 - 실행환경업무처리레이어 (1/3) 5. 업무처리레이어 업무처리레이어는업무프로그램의업무로직을담당하는 Layer 로서, 업무흐름제어, 에러처리등 의기능을제공함 전자정부개발프레임워크실행환경 서비스그룹 Presentation Layer 설명 업무프로그램과사용자간의 Interface 를담당하는 Layer 로서, 사용자화면구성, 사용자입력정보검증등의기능을제공함 Layer Presentation Layer Logic Business Layer Persistence Integration Layer Business Logic Layer 업무프로그램의업무로직을담당하는 Layer 로서, 업무흐름제어, 에러처리등의기능을제공함 Persistence Layer 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 Foundation Layer ( 공통기반레이어 ) Integration Layer 타시스템과의연동기능을제공하는 Layer 임 환경 서비스그룹 Foundation Layer ( 공통기반레이어 ) 실행환경의각 Layer 에서공통적으로사용하는공통기능을제공함 - 3 -
1. 개요 - 실행환경업무처리레이어 (2/3) 5. 업무처리레이어 업무처리레이어는 Process Control, Exception Handling 등총 2 개의서비스를제공함 실행환경 화면처리레이어 업무처리레이어 데이터처리레이어 연계통합레이어 MVC Internationalization Process Control DataSource Data Access Naming Service Ajax Support Security Exception Handling ORM TBD Transaction Integration Service UI Adaptor Web Service 공통기반레이어 AOP Cache Compress/Decompress Encryption/Decryption Excel File Handling File Upload/Download FTP Server Security ID Generation IoC Container Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource Scheduling String Util XML Manipulation 실행환경서비스그룹서비스 - 4 -
1. 개요 - 실행환경업무처리레이어 (3/3) 5. 업무처리레이어 업무처리레이어는 Spring Web Flow, Spring 등총 2 개의오픈소스 SW 를사용하고있음 서비스오픈소스 SW 버전 Process Control Web Flow 2.0 Exception Handling Spring 3.0.5-5 -
2. Process Control 개요 5. 업무처리레이어 서비스개요 Spring Web Flow(SWF) 는웹애플리케이션내페이지흐름 (flow) 의정의와수행에집중하는 Spring프레임워크웹스택의컴포넌트이다. Spring Web Flow는추상화의좀더높은레벨에존재하고 Struts, Spring MVC, Portlet MVC, 그리고 JSF와같은기본프레임워크내에서자족적인페이지흐름 (flow) 엔진 (page flow engine) 처럼통합된다. SWF는선언적이고높은이식성을가지며뛰어난관리능력을가지는형태로명시적으로애플리케이션의페이지흐름 (flow) 을획득하는기능을제공한다. - 6 -
2. Process Control - 설명 (1/9) 5. 업무처리레이어 Getting Started - Hello 프로젝트 화면시나리오 1 2-7 -
LAB 303-swf Demo Lab303-swf - 8 -
2. Process Control - 설명 (2/9) 5. 업무처리레이어 1 번 Hello 시나리오 Flow 정의 <?xml version="1.0" encoding="utf-8"?> <flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> </flow> <view-state id="hello"> <transition on="say" to="helloworld" /> </view-state> <view-state id="helloworld"> <transition on="return" to="return" /> </view-state> <end-state id="return" view="externalredirect:servletrelative:/start" /> - 9 -
2. Process Control - 설명 (3/9) 5. 업무처리레이어 2 번 Hello 시나리오 Flow 정의 <?xml version="1.0" encoding="utf-8"?> <flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> <on-start> <evaluate expression="helloservice.saymessage()" result="flowscope.message" /> </on-start> <view-state id="hello2" model="message"> <binder> <binding property="str" required="true" /> </binder> <transition on="proceed" to="actionhello" /> <transition on="return" to="return" /> </view-state> <action-state id="actionhello"> <evaluate expression="helloservice.addhello(message)" /> <transition on="yes" to="moredecision" /> <transition on="no" to="hello" /> </action-state> <decision-state id="moredecision"> <if test="helloservice.getdecision(message)" then="helloworld2" else="return" /> </decision-state> <view-state id="helloworld2"> <transition on="return" to="return" /> </view-state> <end-state id="return" view="externalredirect:servletrelative:/start" /> </flow> - 10 -
2. Process Control - 설명 (4/9) 5. 업무처리레이어 Flow Definition <?xml version="1.0" encoding="utf-8"?> <flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> </flow> <view-state id="hello"> <transition on="say" to="helloworld" /> </view-state> <view-state id="helloworld"> <transition on="return" to="return" /> </view-state> <end-state id="return" view="externalredirect:servletrelative:/start" /> view-state: Flow 중화면을보여주는 State 를정의하는구성요소 편의상 Flow 정의파일이있는디렉터리내에서 view-state id 와일치하는화면템플릿을맞추어보여주게된다. transition: State 내에서발생한이벤트를제어하는구성요소. 화면이동을일으킨다. end-state: Flow의결과를정의 - 11 -
2. Process Control - 설명 (5/9) 5. 업무처리레이어 decision state action-state 를대신해서편리하게 if/else 문법을사용해서이동하고자하는의사결정을해주는 decision-state 를사용한다. <decision-state id="moredecision"> <if test="helloservice.getdecision(message)" then="helloworld2" else="return" /> </decision-state> action-state 액션은대부분 POJO 의메소드를호출한다. action-state 와 decision-state 을호출했을때, 이들메소드가반환하는값은상태를전이하게해주는데사용할수있다. 전이가이벤트에의해서발생되기때문에, 우선메소드가반환하는값은반드시 Event 객체에매핑되야한다. <action-state id="actionhello"> <evaluate expression="helloservice.addhello(message)" /> <transition on="yes" to="moredecision" /> <transition on="no" to="hello" /> </action-state> - 12 -
2. Process Control - 설명 (6/9) 5. 업무처리레이어 환경설정 with Spring MVC - 13 -
2. Process Control - 설명 (7/9) 5. 업무처리레이어 webmvc-config.xml - 14 -
2. Process Control - 설명 (8/9) 5. 업무처리레이어 webflow-config.xml - 15 -
2. Process Control - 설명 (9/9) 5. 업무처리레이어 화면 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html> <head> <title>welcome to Spring Web Flow</title> </head> <body> <h1>welcome to Spring Web Flow</h1> <form:form id="start"> <input type="submit" name="_eventid_say" value="click to say hello!" /> </form:form> </body> </html> <view-state id="hello"> <transition on="say" to="helloworld" /> </view-state> <view-state id="helloworld"> <transition on="return" to="return" /> </view-state> transition 은화면에서발생한이벤트와매핑을할까? hello.jsp 소스를잠시보겠다. 코드에서보는봐와같이 form으로둘러싸인곳에해답은있다. <input type= submit name= _eventid_say. /> 에서 name 을보면 _eventid_say 로답을찾을수있다. _eventid 가답이다. say는 transition 의 on 과같음을확인할수있다. eventid 에정의된특정위치의문자열을가지고 transition 를분석한다. transition 에대한내용은 flow 정의에서자세히살펴보길바란다. eventid 가 say 를가지고 form 이전달되면 flow 정의에따라 transition 을찾고그에맞는 state 로넘어가게된다. 결과는별도의값을가지고보여주는화면이아닌단지아래와같은화면을보여주도록되어있다. - 16 -
2. Process Control - 참고자료 5. 업무처리레이어 The Spring Framework - Reference Documentation http://static.springsource.org/spring/docs/2.5.x/reference/ http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ - 17 -
3. Exception Handling - 개요 5. 업무처리레이어 서비스개요 전자정부표준프레임워크기반의시스템개발시 Exception 처리, 정확히는 Exception 별특정로직을흐를수있도록하여 Exception 에따른적절한대응이가능도록하고자하는데목적이있다. AOP 의 After throwing advice 로정의된다. 전자정부표준프레임워크기반의처리되는 Exception 은현재 EgovBizException, DataAccessException, FdlException, 그외나머지로구분되어제공한다. 샘플코드 : processexception ( 메시지키 ) 를던지는형태이다. Exception 을던지지않고 Exception 후처리로직처럼수행후계속비즈니스로돌아오는방법도필요 LeaveaTrace - 18 -
3. Exception Handling - 설명 (1/11) 5. 업무처리레이어 Exception EgovBizException 은 Biz flow 상에 Biz Exception.( 사용자에의해발생시키는 Exception ) DataAccessException 의경우는 Spring 에서 persistence layer 에서발생하는 Exception. FdlException 은전자정부표준프레임워크에서확장 / 추가된영역에서던져주는 Exception. 그외나머지는앞에서나열한 Exception 을제외한 Exception Exception 후처리흐름 Exception 후처리방식은 AOP(pointCut after-throw) ExceptionTransfer.transfer() ExceptionHandlerService Handler 순으로실행된다. - 19 -
3. Exception Handling - 설명 (2/11) 5. 업무처리레이어 ServiceImpl 클래스개발 업무로직이담기는 ServiceImpl 클래스는아래와같이 AbstractServiceImpl 을상속받는다. @Service("categoryService") public class CategoryServiceImpl extends AbstractServiceImpl implements CategoryService { AbstractServiceImpl 클래스는추상클래스로 processexception 메소드를하위클래스에서사용할수있도록 해준다. public abstract class AbstractServiceImpl { @Resource(name = "messagesource") private MessageSource messagesource; @Resource(name = "leaveatrace") private LeaveaTrace traceobj; protected EgovBizException processexception(final String msgkey) { return processexception(msgkey, new String[] {); protected EgovBizException processexception(final String msgkey, final String[] msgargs) { return processexception(msgkey, msgargs, null); - 20 -
3. Exception Handling - 설명 (3/11) 5. 업무처리레이어 egov Exception Handling 설정및설명 ServiceImpl 업무클래스에서발생한 Exception 은아래설정에따라 ExceptionTransfer.transfer(..) 로위임된다. Aop Config : Bean 설정 (after-throwing Advice ) <aop:config> <aop:pointcut id="servicemethod" expression="execution(* egov.sample.service.*impl.*(..))" /> <aop:aspect ref="exceptiontransfer"> <aop:after-throwing throwing="exception" pointcut-ref="servicemethod" method="transfer" /> </aop:aspect> </aop:config> <bean id="exceptiontransfer class="egovframework.rte.fdl.cmmn.aspect.exceptiontransfer"> <property name="exceptionhandlerservice"> <list> <ref bean="defaultexceptionhandlemanager" /> </list> </property> </bean> AspectJ req expression (pointcut) 해당되는클래스상에 Exception 발생시 ExceptionTransfer 클래스로위임. 실제로직은 transfer 메소드에구현을하고있음. - 21 -
3. Exception Handling - 설명 (4/11) 5. 업무처리레이어 ExceptionTransfer : Exception 종류에따라구분하고있다. public class ExceptionTransfer { public void transfer(joinpoint thisjoinpoint, Exception exception) throws Exception { // BizException 인경우는이미메시지처리되었음. 로그만기록 if (exception instanceof EgovBizException) { EgovBizException be = (EgovBizException) exception; getlog(clazz).error(be.getmessage(), be.getcause()); // Exception Handler 에발생된 Package 와 Exception 설정. processhandling(clazz, exception, pm, exceptionhandlerservices, false); throw be; else if (exception instanceof RuntimeException) { // Exception Handler 에발생된 Package 와 Exception 설정. processhandling(clazz, exception, pm, exceptionhandlerservices, true); if (be instanceof DataAccessException) { log.debug("runtimeexception case :: DataAccessException "); DataAccessException sqlex = (DataAccessException) be; throw sqlex; throw be; AspectJ req expression (pointcut) 해당되는클래스상에 Exception 발생시 ExceptionTransfer 클래스로위임. else if (exception instanceof FdlException) { FdlException fe = (FdlException) exception; getlog(clazz).error(fe.getmessage(), fe.getcause()); 실로직은 transfer 메소드에구현을하고있음. throw fe; else { getlog(clazz).error(exception.getmessage(), exception.getcause()); throw processexception(clazz, "fail.common.msg", new String[] {, exception, locale); - 22 -
3. Exception Handling - 설명 (5/11) 5. 업무처리레이어 ExceptionHandleManager : Exception 발생클래스와등록된 Handlers 사이의매핑을해주는역할수행 <bean id="exceptiontransfer class="egovframework.rte.fdl.cmmn.aspect.exceptiontransfer"> <property name="exceptionhandlerservice"> <list> <ref bean="defaultexceptionhandlemanager" /> </list> </property> </bean> <bean id="defaultexceptionhandlemanager" class="egovframework.rte.fdl.cmmn.exception.manager.defaultexceptionhandlemanager"> <property name="patterns"> <list> <value>**service.*impl.methodname</value> </list> </property> <property name="handlers"> <list> <ref bean="egovhandler" /> </list> </property> </bean> 여기서는발생한 Exception 이 **service.*impl.methodname 조건에맞는경우 egovhandler 를실행시킨다. Patterns 나 handlers 는여러개를등록할수있다. - 23 -
3. Exception Handling - 설명 (6/11) 5. 업무처리레이어 ExceptionHandleManager 구현체는 AbsExceptionHandleManager 를상속해야하며 ExceptionHandlerService 를인터 페이스로취해야한다. 실제구현메소드는 run (..) 이다. public class DefaultExceptionHandleManager extends AbsExceptionHandleManager implements ExceptionHandlerService { @Override public boolean run(exception exception) throws Exception { log.debug(" DefaultExceptionHandleManager.run() "); // 매칭조건이 false 인경우 if (!enablematcher()) return false; for (String pattern : patterns) { log.debug("pattern = " + pattern + ", thispackagename = " + thispackagename); log.debug("pm.match(pattern, thispackagename) =" + pm.match(pattern, thispackagename)); if (pm.match(pattern, thispackagename)) { for (ExceptionHandler eh : handlers) { eh.occur(exception, getpackagename()); break; return true; - 24 -
3. Exception Handling - 설명 (7/11) 5. 업무처리레이어 EgovServiceExceptionHandler ( 샘플 ) Handler 를간단하게구현한예이다. 발생한 Exception 을메일로발송하고있다. public class EgovServiceExceptionHandler implements ExceptionHandler { @Resource(name = "othersslmailsender") private SimpleSSLMail mailsender; public void occur(exception ex, String packagename) { log.debug(" EgovServiceExceptionHandler run..."); try { mailsender.send(ex, packagename); log.debug(" sending a alert mail is completed "); catch (Exception e) { // TODO Auto-generated catch block e.printstacktrace(); ExceptionHander 인터페이스를구현하여 Bean 설정에넣어주기만하면된다. <bean id="defaultexceptionhandlemanager" class="egovframework.rte.fdl.cmmn.exception.manager.defaultexceptionhandlemanager"> <property name="patterns"> <list> <value>**service.*impl</value> </list> </property> <property name="handlers"> <list> <ref bean="egovhandler" /> </list> </property> </bean> <bean id="egovhandler class="egovframework.rte.fdl.cmmn.exception.handler.egovserviceexceptionhandler" /> - 25 -
3. Exception Handling - 설명 (8/11) 5. 업무처리레이어 LeavaTrace 설정및설명 Exception 이거나 Exception 이아닌경우에도 Trace 후처리로직을실행시키고자할때사용한다. 실제 Exception 이발생하지는않고후처리로직만흐른다. 구현 / 적용방식은 Exception 후처리로직과유사하다. <bean id="leaveatrace" class="egovframework.rte.fdl.cmmn.trace.leaveatrace"> <property name="tracehandlerservices"> <list> <ref bean="tracehandlerservice" /> </list> </property> </bean> <bean id="tracehandlerservice" class="egovframework.rte.fdl.cmmn.trace.manager.defaulttracehandlemanager"> <property name="patterns"> <list> <value>*</value> </list> </property> <property name="handlers"> <list> <ref bean="defaulttracehandler" /> </list> </property> </bean> <bean id="defaulttracehandler" class="egovframework.rte.fdl.cmmn.trace.handler.defaulttracehandler" /> - 26 -
3. Exception Handling - 설명 (9/11) 5. 업무처리레이어 TraceHandler 구현체만들기 public class DefaultTraceHandler implements TraceHandler { public void todo(class clazz, String message) { System.out.println(" log ==> DefaultTraceHandler run..."); leaveatrace 코드상발생 Sample public CategoryVO selectcategory(categoryvo vo) throws Exception { CategoryVO resultvo = categorydao.selectcategory(vo); try { // 강제로발생한 ArithmeticException int i = 1 / 0; catch (ArithmeticException athex) { //Exception 을발생하지않고후처리로직실행. leaveatrace("message.trace.msg"); return resultvo; - 27 -
3. Exception Handling - 설명 (10/11) 5. 업무처리레이어 Exception 화면 Handling 화면단의 Exception 처리는 Controller 로전달된 Excpetion에따른지정된에러화면이동으로이루어져있다. Controller 인터페이스의 handlerequest() 메소드는 Excetpion 을발생하도록정의되어있다. DispathcherServlet 은 HandlerExceptionResolver가등록되어있는경우에는 Exception이발생하는경우 HandlerExceptionResolver에게위임한다. HandlerExceptionResolver는아래와같은인터페이스이다. - 28 -
3. Exception Handling - 설명 (11/11) 5. 업무처리레이어 Bean Configuration <bean class="org.springframework.web.servlet.handler.simplemappingexceptionresolver"> <property name="defaulterrorview" value="exception/commoncaseexception"/> <property name="exceptionmappings"> <props> <prop key="org.egovframe.exception.acaseexception">exception/acaseexception</prop> <prop key="org.egovframe.exception.bcaseexception">exception/bcaseexception</prop> </props> </property> </bean> 발생한 Exception 의종류를 ACaseException, BCaseException, 기타 Exception 이발생하는경우 ACaseException 은 exceptionmapping 규칙에서보이는것처럼해당 Exception 과매핑된 excpetion/acaseexcetpion 을결과값을가져오게된다. BCaseException 의경우도마찬가지다. 가져온값은 ViewResolver에의해해당화면으로이동을하게된다. 그리고 excpetionmappings 에서정의되지않은 Exception 인경우 defaulterrorview 에매핑된 exception/commoncaseexceptio 을리턴하게된다. 결과적으로보면발생한 Exception 에대한별도의정의를하지않는다면 defaulterrorview 에지정된값의화면으로이동하게된다는것이다. - 29 -
3. Exception Handling 참고자료 5. 업무처리레이어 The Spring Framework - Reference Documentation http://static.springsource.org/spring/docs/2.5.x/reference/ http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ - 30 -
1. 개요 - 실행환경연계통합레이어 (1/3) 연계통합레이어는타시스템과의연동기능을제공하는 Layer 임 전자정부개발프레임워크실행환경 서비스그룹 Presentation Layer 설명 업무프로그램과사용자간의 Interface 를담당하는 Layer 로서, 사용자화면구성, 사용자입력정보검증등의기능을제공함 Layer Presentation Layer Logic Business Layer Persistence Integration Layer Business Logic Layer 업무프로그램의업무로직을담당하는 Layer 로서, 업무흐름제어, 에러처리등의기능을제공함 Persistence Layer 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 Foundation Layer ( 공통기반레이어 ) Integration Layer 타시스템과의연동기능을제공하는 Layer 임 환경 서비스그룹 Foundation Layer ( 공통기반레이어 ) 실행환경의각 Layer 에서공통적으로사용하는공통기능을제공함 - 31 -
1. 개요 - 실행환경연계통합레이어 (2/3) 연계통합레이어는 Naming Service, Integration Service, Web Service 등총 3 개의서비스를제 공함 실행환경 화면처리레이어 업무처리레이어 데이터처리레이어 연계통합레이어 MVC Internationalization Process Control DataSource Data Access Naming Service Ajax Support Security Exception Handling ORM TBD Transaction Integration Service UI Adaptor Web Service 공통기반레이어 AOP Cache Compress/Decompress Encryption/Decryption Excel File Handling File Upload/Download FTP Server Security ID Generation IoC Container Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource Scheduling String Util XML Manipulation 실행환경서비스그룹서비스 - 32 -
1. 개요 - 실행환경연계통합레이어 (3/3) 연계통합레이어는 Naming Service, Web Service 등총 2 종의오픈소스 SW 를사용하고있음 서비스오픈소스 SW 버전 Naming Service Spring 3.0.5 Web Service Apache CXF 2.3.3-33 -
2. Naming Service 개요 (1/3) 서비스개요 원격에있는모듈및자원등을찾아주는서비스 Naming 서비스를지원하는 Naming 서버에자원을등록하여다른어플리케이션에서사용할수있도록공개하고, Naming 서버에등록되어있는자원을찾아와서이용할수있게함 - 34 -
2. Naming Service 개요 (2/3) 주요기능 자원등록 (bind, rebind) Naming 서버에로컬에있는자원을등록함 자원검색 (lookup) Naming 서버에등록되어있는자원을이름을이용하여조회함 자원등록해제 (unbind) Naming 서버에등록되어있는로컬자원에대한등록을해제함 Open Source Spring Framework : Naming Service는 Spring Framework에서제공하는기능을수정없이사용함 jee:jndi-lookup tag : Spring XML Configuration 설정파일에 JNDI 객체를 bean으로등록하는방식으로, JNDI 객체를 Lookup 만할수있다. 일반적으로가장많이사용된다. JndiTemplet 클래스 : Spring Framework에서 JNDI API를쉽게사용할수있도록제공하는 JndiTemplate class를직접사용하는방식으로, JNDI API 기능을모두사용해야할경우사용하는방식이다. - 35 -
2. Naming Service 개요 (3/3) Java Naming and Directory Interface(JNDI) 란 Java Naming and Directory Interface(JNDI) 는 Java 소프트웨어클라이언트가이름 (name) 을이용하여데이터 및객체를찾을수있도록도와주는네이밍 / 디렉토리서비스에연결하기위한 Java API 이다. - 36 -
2. Naming Service Spring XML Configuration 설정 (1/4) 개요 Spring Framework는 XML Configuration 파일에 JNDI 객체를설정할수있다. 단, 설정파일을통해서는 JNDI 객체를 lookup하는것만가능하므로, bind, rebind, unbind 기능을사용하려면 Using JndiTemplate 방식을사용해야한다. 설정 jee tag 를사용하기위해서는 Spring XML Configuration 파일의머릿말에 namespace 와 schemalocation 를추 가해야한다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> <!-- <bean/> definitions here --> </beans> - 37 -
2. Naming Service Spring XML Configuration 설정 (2/4) jndi-lookup tag jndi-lookup tag 는 JNDI 객체를찾아서 bean 으로등록해주는 tag 이다. <jee:jndi-lookup id="bean id" jndi-name="jndi name cache="true or false resource-ref="true or false lookup-on-startup="true or false expected-type="java class proxy-interface="java class"> <jee:environment> name=value ping=pong... </jee:environment> </jee:jndi-lookup> JNDI Environment 변수값을등록할때사용한다. environment element 는 'foo=bar' 와같이 < 변수명 >=< 변수값 > 형태의 List 를값으로가진다. Attribute 설명 Optional Data Type Default값 id Spring XML Configuration의 bean id이다. N String jndi-name 찾고자하는 JNDI 객체의이름이다. N String cache 한번찾은 JNDI 객체에대한 cache여부를나타낸다. Y boolean true resource-ref J2EE Container 내에서찾을지여부를나타낸다. Y boolean false lookup-on-startup 시작시에 lookup을수행할지여부를타나낸다. Y boolean true expected-type 찾는 JNDI 객체를 assign할타입을나타낸다. Y Class proxy-interface JNDI 객체를사용하기위한 Proxy Interface이다. Y Class - 38 -
2. Naming Service Spring XML Configuration 설정 (3/4) jndi-lookup tag Sample(2/2) With multiple JNDI environment settings 아래는복수 JNDI 환경설정을사용하여 JNDI 객체를찾아오는예제이다. <jee:jndi-lookup id="datasource" jndi-name="jdbc/mydatasource"> <!-- newline-separated, key-value pairs for the environment (standard Properties format) --> <jee:environment> foo=bar ping=pong </jee:environment> </jee:jndi-lookup> Complex 아래는이름외다양한설정을통해 JNDI 객체를찾아오는예제이다. <jee:jndi-lookup id="datasource jndi-name="jdbc/mydatasource" cache="true resource-ref="true lookup-on-startup="false" expected-type="com.myapp.defaultfoo proxy-interface="com.myapp.foo" /> - 39 -
2. Naming Service Spring XML Configuration 설정 (4/4) jndi-lookup tag Sample(1/2) Simple 가장단순한설정으로이름만을사용하여 JNDI 객체를찾아준다. 아래이름 jdbc/mydatasource 로등록되어 있는 JNDI 객체를찾아 userdao Bean 의 datasource property 로 Dependency Injection 하는예제이다. <jee:jndi-lookup id="datasource" jndi-name="jdbc/mydatasource" /> <bean id="userdao" class="com.foo.jdbcuserdao"> <!-- Spring will do the cast automatically (as usual) --> <property name="datasource" ref="datasource" /> </bean> With single JNDI environment settings 아래는단일 JNDI 환경설정을사용하여 JNDI 객체를찾아오는예제이다. <jee:jndi-lookup id="datasource" jndi-name="jdbc/mydatasource"> <jee:environment>foo=bar</jee:environment> </jee:jndi-lookup> - 40 -
2. Naming Service JndiTemplate 클래스사용 (1/3) 개요 JndiTemplate class 는 JNDI API 를쉽게사용할수있도록제공하는 wrapper class 이다. Bind 아래 Jndi.TemplateSample class 의 bind 메소드는 JndiTemplate 을이용하여 argument 'resource' 를 argument 'name' 으로 JNDI 객체로 bind 한다. import javax.naming.namingexception; import org.springframework.jndi.jnditemplate; public class JndiTemplateSample { private JndiTemplate jnditemplate = new JndiTemplate(); public boolean bind(final String name, Object resource) { try { jnditemplate.bind(name, resource); return true; catch (NamingException e) { e.printstacktrace(); return false;... - 41 -
2. Naming Service JndiTemplate 클래스사용 (2/3) Lookup JndiTemplate 을이용하여 argument 'name' 으로등록되어있는자원 (resource) 를찾을수있다. public Object lookupresource(final String name) { try { return jnditemplate.lookup(name); catch (NamingException e) { e.printstacktrace(); return null; Lookup with requiredtype JndiTemplate 의 lookup 메소드는찾고자하는자원의이름뿐아니라원하는타입 (Type) 을지정할수있다. public Foo lookupfoo(final String fooname) { try { return jnditemplate.lookup(fooname, Foo.class); catch (NamingException e) { e.printstacktrace(); return null; - 42 -
2. Naming Service JndiTemplate 클래스사용 (3/3) Rebind JndiTemplate 의 rebind 메소드를사용하여자원을재등록할수있다. Unbind public boolean rebind(final String name, Object resource) { try { jnditemplate.rebind(name, resource); return true; catch (NamingException e) { e.printstacktrace(); return false; JndiTemplate 의 unbind 메소드를사용하여등록된자원을등록해제할수있다. public boolean unbind(final String name) { try { jnditemplate.unbind(name); return true; catch (NamingException e) { e.printstacktrace(); return false; - 43 -
2. Naming Service 참고자료 Spring Framework JndiTemplate class API http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jndi/jnditemplate.html http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/jndi/package-summary.html The Spring Framework - Reference Documentation A.2.3. The jee schema http://static.springsource.org/spring/docs/2.5.x/reference/xsd-config.html#xsd-config-body-schemas-jee http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html#xsd-configbody-schemas-jee-jndi-lookup Java SE Guide to JNDI http://java.sun.com/j2se/1.5.0/docs/guide/jndi/index.html - 44 -
3. Integration Service 개요 (1/2) 서비스개요 Integration 서비스는전자정부표준프레임워크기반의시스템이타시스템과의연계를위해사용하는 Interface 의표준을정의한것이다. - 45 -
3. Integration Service 개요 (2/2) 목적 기존의전자정부시스템은타시스템과의연계를위해연계솔루션을사용하거나자체개발한연계모듈을사용해왔다. 기존에사용된연계솔루션및자체연계모듈은각각고유한설정및사용방식을가지고있어, 동일한연계서비스라할지라도사용하는연계모듈에따라각기다른방식으로코딩되어왔다. 본 Integration 서비스는이러한중복개발을없애고, 표준화된설정및사용방식을정의하여개발효율성을제고한다. 구성 Metadata 연계 Interface를사용하기위해필요한최소한의정보 ( 연계기관정보, 연계시스템정보, 연계서비스정보, 메시지형식등 ) 을정의하고있다. 연계서비스 API 연계서비스요청 Interface, 연계서비스제공 Interface, 연계메시지및메시지헤더등을정의하고있다. - 46 -
3. Integration Service Metadata(1/4) 논리모델 (1/2) 논리 ERD - 47 -
3. Integration Service Metadata(2/4) 논리모델 (2/2) Entity 설명 Entity 기관시스템서비스연계등록정보레코드타입레코드필드 연계서비스를제공또는사용하는기관을나타낸다. 하나의기관은다수의시스템을가지고있다. 설명 연계서비스를제공또는사용하는시스템을나타낸다. 하나의시스템은반드시하나의기관에속하며, 다수의서비스를가지고있다. 연계서비스를제공하는단위를나타낸다. 하나의서비스는반드시하나의시스템에속한다. 연계서비스를사용하기위한단위를나타낸다. 연계요청시스템이연계제공서비스를사용하기위해서등록해야하는정보를담고있다. 연계에사용되는메시지의형태를나타낸다. <Key, Value> 쌍의정보를담고있는레코드형태의타입을정의하고있다. 하나의레코드타입은다수의레코드필드를가지고있다. 레코드타입에속하는내부필드의정의를나타낸다. 필드의이름과타입을정의한다. 하나의레코드필드는반드시하나의레코드타입에속한다. - 48 -
3. Integration Service Metadata(3/4) 물리모델 (1/2) 물리 ERD - 49 -
3. Integration Service Metadata(4/4) 물리모델 (2/2) 물리ERD 설명 Integration 서비스 Metadata의물리모델은논리모델을실제물리적인 DB로구현하기위한모델로서, 물리ERD는 Oracle DB 를가정하여작성된것이다. 물리모델은 Hibernate 등과같은 Object Relational Mapping(ORM) 을사용하여 Access하는것을고려하여, 복수의 Attribute 를 Identifier로갖는 Entity를 Table로변환할때 Surrogate Key를도입하고, 기존 Identifier는 Unique Constraints로적용하여정의되었다. Entity Table 매핑 Entity 기관시스템서비스연계등록정보레코드타입레코드필드 Table ORGANIZATION SYSTEM SERVICE INTEGRATION RECORD_TYPE RECORD_TYPE_FIELD - 50 -
3. Integration Service 연계서비스 API(1/15) 구성 (1/2) Class Diagram - 51 -
3. Integration Service 연계서비스 API(2/15) 구성 (2/2) 구성요소설명 구성요소 설명 EgovIntegrationContext 연계서비스에대한설정및 EgovIntegrationService 객체를관리한다. EgovIntegrationMessage 연계서비스를통해주고받는표준메시지를정의한다. EgovIntegrationMessageHeader 연계서비스를통해주고받는표준메시지헤더를정의한다. EgovIntegrationMessageHeader:ResultCode 연계서비스결과코드를담고있는 enumeration이다. EgovIntegrationService 연계서비스를호출하기위해사용한다. EgovIntegrationServiceResponse 연계서비스를비동기방식으로호출한경우, 응답메시지를받기위해사용한다. EgovIntegrationServiceCallback 연계서비스를비동기방식으로호출한경우, 응답메시지를받기위한 Callback interface이다. EgovIntegrationServiceCallback:CallbackId 연계서비스를 Callback 을이용한비동기방식으로호출한경우, 요청메시지와응답메시지를연결하기위한 ID 를나타내는 interface 이다. EgovIntegrationServiceProvider 연계서비스를제공하기위해사용한다. - 52 -
3. Integration Service 연계서비스 API(3/15) EgovIntegrationContext EgovIntegrationContext는연계서비스에대한설정및 EgovIntegrationService 객체를관리한다. 연계서비스를사용하기위해서는 EgovIntegrationContext의 getservice 메소드를사용하여 EgovIntegrationService 객체를얻어와야한다. 아래는이름과주민번호를이용하여실명확인연계서비스를요청하는예제이다. public boolean verifyname(final String name, final String residentregistrationnumber) { // 연계 ID 가 "INT_VERIFY_NAME" 인연계서비스객체를얻어온다. EgovIntegrationService service = egovintegrationcontext.getservice("int_verify_name"); // 요청메시지생성 EgovIntegrationMessage requestmessage = service.createrequestmessage(); // 요청메시지작성 requestmessage.getbody().put("name", name); requestmessage.getbody().put("residentregistrationnumber", residentregistrationnumber); // 서비스요청 EgovIntegrationMessage responsemessage = service.sendsync(requestmessage); // 결과 return return responsemessage.getbody().get("result"); - 53 -
3. Integration Service 연계서비스 API(4/15) EgovIntegrationMessage(1/2) EgovIntegrationMessage는헤더부, 바디부, 첨부파일로구성된다. 헤더부 헤더부를 access 하기위한메소드는아래와같다. Method Summary EgovIntegrationMessageHeader void getheader() setheader(egovintegrationmessageheader header) 바디부 바디부를 access 하기위한메소드는아래와같다. Method Summary Map<String, Object> void getbody() setbody(map<string, Object> body) 바디부는다음값들로만구성될수있다. Java Primitive Type의 Wrapper 객체 (Boolean, Byte, Short, Integer, Long, Float, Double) BigInteger, BigDecimal String Calendar List<Object>, Map<String, Object> (* List와 Map의 element 역시위값들로구성되어야한다.) - 54 -
3. Integration Service 연계서비스 API(5/15) EgovIntegrationMessage(2/2) 첨부파일 첨부파일을 access 하기위한메소드는아래와같다. Method Summary Map<String, Object> void Object void Object getattachments() setattachments(map<string, Object> attachments) getattachment(string name) putattachment(string name, Object attachment) removeattachment(string name) - 55 -
3. Integration Service 연계서비스 API(6/15) EgovIntegrationMessageHeader EgovIntegrationMessageHeader는다음과같은정보를담고있다. Attribute Name Data Type 설명 IntegrationId String 연계ID ProviderOrganizationId String 연계제공기관ID ProviderSystemId String 연계제공시스템ID ProviderServiceId String 연계제공서비스ID ConsumerOrganizationId String 연계요청기관ID ConsumerSystemId String 연계요청시스템ID RequestSendTime Calendar 요청송신시각 RequestReceiveTime Calendar 요청수신시각 ResponseSendTime Calendar 응답송신시각 ResponseReceiveTime Calendar 응답수신시각 ResultCode ResultCode 결과코드 ResultMessage String 결과메시지 EgovIntegrationMessageHeader 는위 attribute 들에대한 get/set 메소드를정의하고있다. - 56 -
3. Integration Service 연계서비스 API(7/15) EgovIntegrationService(1/8) EgovIntegrationService는동기화방식의호출과비동기화방식의호출을지원한다. 동기화방식 (1/2) Sequence Diagram - 57 -
3. Integration Service 연계서비스 API(8/15) EgovIntegrationService(2/8) 동기화방식 (2/2) Timeout 을지정한예제 public boolean verifyname(final String name, final String residentregistrationnumber) { // EgovIntegrationContext 에서 EgovIntegrationService 객채를얻어온후, 요청메시지를 // 생성및작성한다.... // 동기방식으로연계서비스호출 (timeout = 5000 millisecond) EgovIntegrationMessage responsemessage = service.sendsync(requestmessage, 5000); // 응답결과처리... Timeout 을설정하지않은예제 ( 이경우 default timeout 값을사용한다 ) EgovIntegrationMessage responsemessage = servicd.sendsync(requestmessage); - 58 -
3. Integration Service 연계서비스 API(9/15) EgovIntegrationService(3/8) 비동기화방식개요 EgovIntegrationService의 sendasync 메소드는비동기화방식으로연계서비스를호출한다. sendasync 메소드는 Response 방식과 Callback 방식으로두가지방식이존재한다. Response를사용한비동기방식 : EgovIntegrationServiceResponse를이용한비동기호출방식이다. Response 방식의비동기호출은연계서비스를요청하는업무모듈의응답에대한 ownership를가지고있으며, 응답결과를스스로처리해야하는경우사용한다. Callback을사용한비동기방식 : EgovIntegrationServiceCallback을이용한비동기호출방식이다. Callback 방식의비동기호출에서연계서비스를요청하는업무모듈은단지요청만을수행하고, 응답에대한처리는 Callback 객체에게위임해도상관없는경우사용한다. - 59 -
3. Integration Service 연계서비스 API(10/15) EgovIntegrationService(4/8) Response를사용한비동기방식 (1/2) EgovIntegrationServiceResponse를이용한비동기호출방식이다. Response 방식의비동기호출은연계서비스를요청하는업무모듈의응답에대한 ownership를가지고있으며, 응답결과를스스로처리해야하는경우사용한다. Sequence Diagram - 60 -
3. Integration Service 연계서비스 API(11/15) EgovIntegrationService(5/8) Response 를사용한비동기방식 (2/2) Timeout 을지정한예제 public boolean verifyname(final String name, final String residentregistrationnumber) { // EgovIntegrationContext 에서 EgovIntegrationService 객채를얻어온후, 요청메시지를 // 생성및작성한다.... // 비동기방식으로연계서비스호출 EgovIntegrationServiceResponse response = service.sendasync(requestmessage); // response 객체를이용하여응답메시지를받기전에필요한업무를수행... // response 객체를이용하여응답메시지수신 (timeout = 5000 millisecond) EgovIntegrationMessage responsemessage = response.receive(5000); // 응답메시지처리... Timeout 을지정하지않은예제 ( 이경우 default timeout 값을사용한다 ) EgovIntegrationMessage responsemessage = response.receive(); - 61 -
3. Integration Service 연계서비스 API(12/15) EgovIntegrationService(6/8) Callback을사용한비동기방식 (1/3) EgovIntegrationServiceCallback을이용한비동기호출방식이다. Callback 방식의비동기호출은연계서비스를요청하는업무모듈은단지요청만을수행하고, 응답에대한처리는 Callback 객체에게위임해도상관없는경우사용한다. Sequence Diagram - 62 -
3. Integration Service 연계서비스 API(13/15) EgovIntegrationService(7/8) Callback 을사용한비동기방식 (2/3) 예제 (1/2) 아래는 Callback 방식으로연계서비스를호출하는예제이다. @Resource(name = "verifynameservicecallback") private EgovIntegrationServiceCallback callback; public boolean verifyname(final String name, final String residentregistrationnumber) { // EgovIntegrationContext 에서 EgovIntegrationService 객채를얻어온후, 요청메시지를 // 생성및작성한다.... // 비동기방식으로연계서비스호출 service.sendsync(requestmessage, callback); - 63 -
3. Integration Service 연계서비스 API(14/15) EgovIntegrationService(8/8) Callback 을사용한비동기방식 (3/3) 예제 (2/2) 아래는 Callback 모듈예제이다. public class VefiryNameServiceCallback { public CallbackId createid(egovintegrationservice service, EgovIntegrationMessage requestmessage) { // 본메소드는 EgovIntegrationService 를구현한연계 Adaptor 또는솔루션에서불리워진다. // 서비스와요청메시지를이용하여 CallbackId 를생성하여 return 한다. // 생성한 CallbackId 는응답메시지수신시, 해당하는서비스및요청메시지를식별하기위해 // 사용한다. // CallbackId 생성 CallbackId callbadkid =... return callbackid; public vod onreceive(callbackid callbackid, EgovIntegrationMessage responsemessage) { // 본메소드는처리해야하는응답메시지가도착했을때, 연계 Adaptor 또는솔루션에의해 // 불리워진다. // 응답메시지처리... - 64 -
3. Integration Service 연계서비스 API(15/15) EgovIntegrationServiceProvider EgovIntegrationServiceProvider interface 는연계서비스를제공하기위한 interface 로연계서비스를제공하는 모듈은본 interface 를 implements 해야한다. 예제 package itl.sample; import egovframework.rte.itl.integration.egovintegrationmessage; import egovframework.rte.itl.integration.egovintegrationserviceprovider; public class ServiceVerifyName implements EgovIntegrationServiceProvider { public void service(egovintegrationmessage requestmessage, EgovIntegrationMessage responsemessage) { String name = requestmessage.getbody().get("name"); String residentregistrationnumber = requestmessage.getbody().get("residentregistrationnumber"); // 실명확인 boolean result = varifyname(name, residentregistrationnumber); responsemessage.getbody().put("result", result); <bean id="serviceverifyname" class="itl.sample.serviceverifyname"/> - 65 -
4. WebService 개요 (1/4) 서비스개요 Integration Service 표준에따라작성된 Service 로, Web Service 를호출하고제공할수있도록지원한다. - 66 -
4. WebService 개요 (2/4) 주요기능 Web Service 호출 공개되어있는 Web Service 를호출하고, 처리결과를돌려준다. Web Service 공개 개발한업무모듈을 Web Service 로공개할수있도록 Proxy 등을제공하고, 완성된 Web Service 로공개한다. Open Source WebService는 Web Service를호출및제공하기위해서 Apache CXF를사용한다. - 67 -
4. WebService 개요 (3/4) Web Service란? W3C는 Web Service를 네트워크상에서발생하는컴퓨터간의상호작용을지원하기위한소프트웨어시스템 으로정의하고있다. 일반적으로 Web Service는인터넷과같은네트워크상에서접근되고, 요청된서비스를제공하는원격시스템에서수행되는 Web APIs이다. - 68 -
4. WebService 개요 (4/4) 문서구성 WebService는 Integration Service 표준에따라구현된서비스로서, Integration Service에서정의하고있는연계서비스 API를제공하고있다. 따라서본문서는 WebService를프로그램적으로호출하는방식이아닌, WebService를사용하기위한설정방법을중점적으로설명한다 ( 호출방식은 Integration Service의연계서비스 API를참조한다 ). 본문서의구성은아래와같다. Metadata 1. WebService 를사용하기위해필요한설정정보구조를설명한다. 설정방법 1. WebService 를사용하기위해필요한설정방법을설명한다. Client 모듈개발 1. WebService Client 모듈을개발하는방법을설명한다. Server 모듈개발 WebService Server 모듈을개발하는방법을설명한다. - 69 -
4. WebService Metadata(1/2) Metadata(1/2) 물리ERD WebService는 Integration Service 표준을따르므로 Integration Service의 Metadata와연동하여동작한다. ( 회색부분이 Integration Service의 Metadata이다 ) - 70 -
4. WebService Metadata(2/2) Metadata(2/2) Table 설명 Table 설명 WEB_SERVICE_SERVER 연계서비스를 Web Service 형태로공개 (publish) 하기위해필요한정보를담고있다. WEB_SERVICE_CLIENT Web Service 형태로공개 (publish) 되어있는연계서비스를호출하기위해필요한정보를담고있다. WEB_SERVICE_MAPPING 전자정부 Integration 서비스표준에따라개발된서비스가아닌기존의 Legacy 시스템의 Web Service 를호출하기위해, 표준메시지와 Web Service 메시지간의 mapping 정보를담고있다. - 71 -
4. WebService 설정방법 (1/3) 개요 WebService 를사용하기위해서는다음의설정이필요하다. pom.xml 파일에 dependency 설정추가 Spring XML Configuration 설정 pom.xml 파일에 dependency 설정추가 WebService 를사용하기위해서 pom.xml 의 dependencies tag 에다음 dependency 를추가한다. <version/> element 의값인 ${egovframework.versioin 에는사용할 egovframework 의 version 을기재한다. <dependency> <groupid>egovframework.rte</groupid> <artifactid>egovframework.rte.itl.webservice</artifactid> <version>${egovframework.version</version> </dependency> - 72 -
4. WebService 설정방법 (2/3) Spring XML Configuration 설정 (1/2) WebService를위한기본적인설정이포함된 context-webservice.xml 파일을 Spring XML Configuration 파일에 import한다. <import resource="classpath:/egovframework/rte/itl/webservice/context/context-webservice.xml"/> 그리고 Context 와 DataSource 를등록해야한다.(DataSource 의경우, 프로젝트에서사용하는것이있을경우 설정하지않아도된다. 단, 반드시 id 가 datasource 이여야한다.) <!-- EgovWebServiceContext 이다. organizationid 와 systemid 는현재시스템의기관 ID 및시스템 ID 를넣어야한다. --> <bean id="egovwebservicecontext" class="egovframework.rte.itl.webservice.egovwebservicecontext" init-method="init"> <property name="organizationid" value="org_egov"/> <property name="systemid" value="sys00001"/> <property name="defaulttimeout" value="5000"/> <property name="integrationdefinitiondao" ref="integrationdefinitiondao"/> <property name="webserviceserverdefinitiondao" ref="webserviceserverdefinitiondao"/> <property name="webserviceclientdefinitiondao" ref="webserviceclientdefinitiondao"/> <property name="typeloader" ref="typeloader"/> <property name="classloader" ref="classloader"/> </bean> 이부분 ( 기관 ID, 시스템 ID, defaulttimeout) 만수정하면된다. 나머지 DAO 및 typeloader, classloader 는 context-webservice.xml 파일에정의되어있다. - 73 -
4. WebService 설정방법 (3/3) Spring XML Configuration 설정 (2/2) <!-- DataSource 설정이다. 시스템에맞게재작성해야한다. 아래는 HSQL Sample 이다. --> <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="net.sf.log4jdbc.driverspy"/> <property name="url" value="jdbc:log4jdbc:hsqldb:hsql://localhost/test"/> <property name="username" value="sa"/> <property name="password" value=""/> <property name="defaultautocommit" value="false"/> <property name="poolpreparedstatements" value="true"/> </bean> - 74 -
4. WebService Client 모듈개발 (1/2) 개요 Client 모듈을설정하기위해서는다음과정이필요하다. Metadata WEB_SERVICE_CLIENT에설정추가 (Optional) Metadata WEB_SERVICE_MAPPING에설정추가 Metadata WEB_SERVICE_CLIENT에설정추가 Client 모듈을설정하기위해서는 Metadata의 WEB_SERVICE_CLIENT Table에설정을추가해야한다. 다음과같이 Integration 서비스의 Metadata인 INTEGRATION Table에연계등록정보가설정되어있다고가정한다. ( 기관, 시스템, 서비스, 메시지타입등의정보는설정되어있으며, 개발하는시스템은 'SYSTEM_CONSUMER' 라고가정함 ) INTEGRATION ID PROVIDER_SERVICE_KEY CONSUMER_SYSTEM_KEY DEFAULT_TIMEOUT USING_YN VALIDATE_FROM VALIDATE_TO INT_VERIFY_NAME SERVICE_VERIFY_NAME SYSTEM_CONSUMER 5000 Y NULL NULL Web Service 'SERVICE_VERIFY_NAME' 를호출하기위해서 WEB_SERVICE_CLIENT에 'SERVICE_VERIFY_NAME' 을 SERVICE_KEY로갖는설정을추가해야한다. WEB_SERVICE_CLIENT SERVICE_KEY WSDL_ADDRESS NAMESPACE SERVICE_NAME PORT_NAME OPERATION_NAME SERVICE_VERIFY_NAME http://localhost:8080/sample/services/verifyname?wsdl http://itl/sample/ VerifyNameService VerifyNamePort service - 75 -
4. WebService Client 모듈개발 (2/2) (Optional) Metadata WEB_SERVICE_MAPPING에설정추가 만약호출하는 Web Service가전자정부 Integration 서비스표준에따라개발된서비스가아닌경우, 메시지헤더부가다를수있어별도의 Mapping 정보가필요하다. 전자정부 Integration 서비스표준은 Web Service Header부에들어갈 Attribute들이 EgovIntegrationMessageHeader에정의되어있고, 바디부는 EgovIntegrationMessage의 body에정의되어있으므로별도의 mapping 정보없이 header와 body 부의구분이가능하지만, 표준을따르지않은 Web Service 의경우 EgovIntegrationMessage의 body부에정의되어있는일부값들을헤더에포함시켜야한다. - 76 -
4. WebService Server 모듈개발 (1/2) 개요 Web Service Server 모듈을개발하는과정은다음과같다. web.xml 파일에 EgovWebServiceServlet 추가 Metadata WEB_SERVICE_SERVER 설정추가 web.xml 파일에 EgovWebServiceServlet 추가 web.xml 에 EgovWebServiceServlet 설정을추가한다. <servlet> <description></description> <display-name>egovwebserviceservlet</display-name> <servlet-name>egovwebserviceservlet</servlet-name> <servlet-class>egovframework.rte.itl.webservice.egovwebserviceservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>egovwebserviceservlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> 개발한 Server 모듈을공개할 URL path 를설정한다. WEB_SERVICE_SERVER 의 ADDRESS 는이값에대한상대적인위치를나타낸다. - 77 -
4. WebService Server 모듈개발 (2/2) Metadata WEB_SERVICE_SERVER 설정추가 다음과깉이 Integration 서비스의 Metadata인 INTEGRATION Table에연계등록정보가설정되어있다고가정한다. ( 기관, 시스템, 서비스, 메시지타입등의정보는설정되어있으며, 공개할서비스는 'SERVICE_VERIFY_NAME' 이라고가정함 ) INTEGRATION ID PROVIDER_SERVICE_KEY CONSUMER_SYSTEM_KEY DEFAULT_TIMEOUT USING_YN VALIDATE_FROM VALIDATE_TO INT_VERIFY_NAME SERVICE_VERIFY_NAME SYSTEM_CONSUMER 5000 Y NULL NULL Web Service 'SERVICE_VERIFY_NAME' 를공개하기위해서 WEB_SERVICE_SERVER에 'SERVICE_VERIFY_NAME' 을 SERVICE_KEY로갖는설정을추가해야한다. WEB_SERVICE_SERVER SERVICE_KEY ADDRESS NAMESPACE SERVICE_NAME PORT_NAME OPERATION_NAME SERVICE_VERIFY_NAME /VerifyName http://itl/sample/ VerifyNameService VerifyNamePort service <servlet-mapping> tag의 <url-pattern> tag의값은서비스를제공하기위한주소로, WEB_SERVICE_SERVER Table의 ADDRESS Column 값은 <url-pattern> tag값에대한상대위치를나타낸다. 예를들어, Web Application의 IP가 192.168.0.1, Port가 8080, Context Root가 Sample, url-patterns이 /services/* 인경우, 위 'SERVICE_VERIFY_NAME' 의 WSDL Address는 http://192.168.0.1:8080/sample/services/verifyname?wsdl이다. - 78 -