Spring을 이용한 Struts 액션 핸들링#

Struts 애플리케이션과 Spring을 통합하는 세 가지 방법

<div class="note"> 저자 정보 : George Franciscus, Principal, Nexcel

원문 : http://www-128.ibm.com/developerworks/kr/library/j-sr2.html </div>

2005 년 10 월 11 일

<div class="note" style="margin:20px; background-color:white"> Struts Recipes의 공동 저자 George Franciscus는 또 다른 Struts 통합 레시피를 가지고 돌아왔다. 이번에는 Struts 애플리케이션을 Spring 프레임웍으로 반입한다. Struts 액션을 Spring의 빈 처럼 관리할 수 있다. Spring AOP의 효과를 쉽게 누릴 수 있다. </div>

Inversion of Control (IOC) 디자인 패턴에 대해서는 누구나 한번쯤은 들어봤을 것이다. Spring 프레임웍을 사용했다면 그 실행 원리도 알 것이다. Struts 애플리케이션을 Spring 프레임웍으로 반입할 때 IOC 패턴이 큰 힘을 발휘한다.

Struts 애플리케이션을 Spring 프레임웍으로 통합할 때의 이점은 많이 있다. 우선, Spring은 JEE의 문제들, 이를 테면 복잡성, 형편없는 퍼포먼스, 테스트 같은 문제들을 해결하기 위해 설계되었다. 두 번째로 Spring 프레임웍에는 aspect 지향 기술을 일반 객체 지향 코드에 적용할 수 있는 AOP 구현이 포함되어 있다. 세 번째로 Spring 프레임웍은 Struts가 핸들하는 것 보다 Struts를 더 잘 다룬다. 하지만 이것은 견해의 문제이고, Struts 애플리케이션을 Spring 프레임웍으로 통합하는 세 가지 접근방식을 설명할 때 여러분 스스로 판단해 보기 바란다.

내가 설명하는 접근 방식들은 비교적 실행하기에 간단하지만 각기 다른 효과를 갖고 있다. 따라서 각각의 방식을 완전히 이해할 수 있도록 작동 예제도 따로 만들었다. 다운로드 섹션에서 전체 예제의 소스 코드를 참조하기 바란다. Struts MVC와 Spring 프레임웍 다운로드는 참고자료를 참조하라.

Spring의 장점은 무엇인가?#

Spring 창시자 Rod Johnson은 Java™ Enterprise 소프트웨어 개발에 비평적인 시각을 갖고 있었고, 많은 기업들 문제가 IOC 패턴을 전략적으로 사용하여 해결될 수 있다는 것을 제안했다. Rod와 오픈 소스 개발자 팀이 그의 이론을 실행에 옮겼고, 그 결과가 Spring 프레임웍이였다. 간단히 말해서 Spring은 경량의 컨테이너로서 외부 XML 설정 파일을 사용하여 객체들을 함께 와이어링 하기 쉽도록 한다. 각 객체는 JavaBean 속성을 노출함으로서 종속 객체에 대한 레퍼런스를 받으면서 XML 설정 파일에서 "이것을 와이어링"하는 간단한 태스크를 여러분의 몫으로 남겨놓는다. 의존성 삽입(Dependency injection)은 강력한 기능이지만, Spring 프레임웍은 그 이상을 제공한다. Spring은 플러거블 트랜잭션 매니저를 지원하여 광범위한 트랜잭션 핸들링 선택권을 준다. 영속 프레임웍을 통합하면서 일관성 있는 예외 계층을 제공한다. Spring은 또한 aspect 지향 코드를 일반 객체 지향 코드에 적용하는 간단한 메커니즘도 제공한다.

Spring AOP는 여러분이 인터셉터를 사용하여 한 개 이상의 실행 포인트에서 애플리케이션 로직을 인터셉트 할 수 있도록 한다. 인터셉터는 로깅에 광범위하게 사용된다. 인터셉터의 애플리케이션의 로깅 로직은 보다 가독성 있는 함수적 코드 기반이라는 결과를 만든다. 곧 알게 되겠지만 Spring AOP에는 크로스커팅 문제를 다루는 인터셉트가 함께 제공되고 직접 작성할 수도 있다.

Struts와 Spring 통합#

Struts와 마찬가지로 Spring 역시 MVC 구현으로서의 기능을 한다. 두 프레임웍 모두 장점과 단점을 갖고 있다. MVC에 관해서라면 Struts가 여전히 우세하다는 것에는 동의할 것이다. 많은 개발팀들은 엄격한 데드라인 하에 양질의 소프트웨어를 구현할 수 있는 토대로서 Struts에 의존해야 한다고 배워왔다. Struts 뒤에 너무나 많은 탄력으로 Spring 프레임웍의 기능을 통합하고 싶은 개발 팀 조차도 Spring MVC로 전환하기를 꺼려한다. 좋은 소식은 여러분은 그럴 필요가 없다는 것이다. Spring 아키텍쳐에서 여러분은 웹 프레임웍으로서 Struts를 Spring 기반의 비즈니스 및 영속 레이어에 연결할 수 있다.

이제부터 Struts MVC를 Spring 프레임웍과 통합하는 세 가지 방법을 설명한다. 각 레시피의 장단점을 설명하겠다. 세 가지 모두 작동하는 것을 일단 설명한 다음 내가 개인적으로 선호하는 방식을 설명하겠다.

세 가지 레시피#

다음의 통합 기술들(또는 레시피)은 장점도 갖고 있고 단점도 있다. 나는 이들 중 한 가지를 선호하기는 하지만, 이들 모두를 이해하는 것이 바람직하다. 또한 다양한 시나리오를 다루는 광범위한 시나리오도 소개 할 예정이다. 레시피는 다음과 같다.

  • Spring의 ActionSupport 클래스를 사용하여 Struts와 통합하기
  • Struts의 RequestProcessor를 Spring의 DelegatingRequestProcessor로 오버라이드 하기
  • Struts Action 관리를 Spring 프레임웍에 위임하기

애플리케이션 컨텍스트 로딩하기#

어떤 기술을 사용하든지 Spring의 ContextLoaderPlugin을 사용하여 Spring 애플리케이션 컨텍스트를 Struts ActionServlet에 로딩해야 한다. struts-config.xml 파일에 플러그인을 추가한다.

<plug-in className=
  "org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property=
      "contextConfigLocation" value="/WEB-INF/beans.xml"/>
 </plug-in>

앞에서도 언급했지만 아래 다운로드섹션에서 예제 애플리케이션의 소스를 다운로드 할 수 있다. 각각의 예제는 Struts와 Spring을 통합하는 방식을 다르게 보여주고 있다. 이 글의 예제는 기본적인 부분만 다르기 때문에 애플리케이션을 다운로드하여 전체를 다 보는 것도 좋다.

레시피 1. Spring의 ActionSupport 사용하기#

Spring 컨텍스트를 직접 만드는 것은 Struts와 Spring 통합에 있어서 가장 매력적인 방법이다. 더 쉽게 하기 위해 Spring은 도움말도 제공한다. org.springframework.web.struts.ActionSupport 클래스는 getWebApplicationContext()메소드를 제공하여 Spring 컨텍스트를 쉽게 얻을 수 있도록 한다. 여러분은 그저 Struts의 Action 클래스 대신 Spring의 ActionSupport에서 액션을 확장하면 된다. (Listing 1)

Listing 1. ActionSupport를 사용하여 Struts 통합하기

package ca.nexcel.books.actions;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;

import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;

public class SearchSubmit extends ActionSupport {   |(1)


  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {

    DynaActionForm searchForm = (DynaActionFormform;
    String isbn = (StringsearchForm.get("isbn");
    
    //the old fashion way
    //BookService bookService = new BookServiceImpl();
    
    ApplicationContext ctx = 
      getWebApplicationContext();    |(2)
    BookService bookService = 
      (BookServicectx.getBean("bookService");   |(3)
        
  Book book = bookService.read(isbn.trim());

    if (null == book) {
      ActionErrors errors = new ActionErrors();
      errors.add(ActionErrors.GLOBAL_ERROR,new ActionError
        ("message.notfound"));
      saveErrors(request, errors);
      return mapping.findForward("failure";
  }

    request.setAttribute("book", book);
    return mapping.findForward("success");
  }
}

어떤 일이 일어나는지 보자. (1)에서 Struts Action 클래스가 아닌 Spring ActionSupport 클래스에서 확장하여 Action 을 만든다. (2)에서 getWebApplicationContext() 메소드를 통해 ApplicationContext 를 얻었다. 비즈니스 서비스를 얻으려면 (2)에서 획득한 컨텍스트를 사용하여 (3)에서 Spring 빈을 검색하면 된다.

이 기술은 간단하고 이해하기 쉽다. 불행히도 이것은 Struts 액션을 Spring 프레임웍에 연결한다. Spring 말고 다른 것을 사용해야 한다면 코드를 다시 작성해야 한다. 더욱이 Struts 액션은 Spring의 제어를 받지 않기 때문에 Spring AOP의 혜택을 누릴 수도 없다. 이 기술은 다중의 독립적인 Spring 컨텍스트를 사용할 때 유용하지만 대부분의 경우는 바람직하지 못하다.

레시피 2. RequestProcessor 오버라이드#

Struts 액션에서 Spring을 분리하는 것도 좋은 방법이다. 한 가지 방법은 Struts RequestProcessor 프로세서를 org.springframework.web.struts.DelegatingRequestProcessor로 오버라이드 하는 것이다.

Listing 2. Spring의 DelegatingRequestProcessor

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
 <form-beans>
    <form-bean name="searchForm" 
      type="org.apache.struts.validator.DynaValidatorForm">
               <form-property name="isbn"    type="java.lang.String"/>
    </form-bean>
  
  </form-beans>

 <global-forwards type="org.apache.struts.action.ActionForward">
     <forward   name="welcome"                path="/welcome.do"/>
     <forward   name="searchEntry"            path="/searchEntry.do"/>
     <forward   name="searchSubmit"           path="/searchSubmit.do"/>
 </global-forwards>

 <action-mappings>
    <action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
    <action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>
    <action    path="/searchSubmit" 
               type="ca.nexcel.books.actions.SearchSubmit"
               input="/searchEntry.do"
               validate="true"
               name="searchForm">
              <forward name="success" path="/WEB-INF/pages/detail.jsp"/>
              <forward name="failure" path="/WEB-INF/pages/search.jsp"/>
    </action>  

 </action-mappings>

 <message-resources parameter="ApplicationResources"/>

 <controller processorClass="org.springframework.web.struts.
   DelegatingRequestProcessor"/> |(1)

 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" 
      value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 </plug-in>


 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml"/>
 </plug-in>
 
</struts-config>

여기에서 <controller> 태그를 사용하여 디폴트 Struts RequestProcessor를 DelegatingRequestProcessor로 오버라이드 했다. 그런 다음, Spring config 파일에 액션을 등록한다. (Listing 3)

Listing 3. Spring config 파일에 액션 등록하기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>

  <bean name="/searchSubmit" 
    class="ca.nexcel.books.actions.SearchSubmit"> |(1)
     <property name="bookService">
        <ref bean="bookService"/>
     </property>
  </bean>
</beans>

(1)에서, struts-config 액션 매핑 이름과 매치하는 이름 애트리뷰트를 사용하여 빈을 등록했다. SearchSubmit 액션은 JavaBean 속성을 노출하기 때문에 Spring이 이 속성을 런타임 시 파퓰레이트 할 수 있다. (Listing 4)

Listing 4. JavaBean 속성을 가진 Struts 액션

package ca.nexcel.books.actions;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;

public class SearchSubmit extends Action {
  
  private BookService bookService;
  public BookService getBookService() {
    return bookService;
  }

  public void setBookService(BookService bookService) { (1)
    this.bookService = bookService; 
  

  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {

    DynaActionForm searchForm = (DynaActionFormform;
    String isbn = (StringsearchForm.get("isbn");
    
  Book book = getBookService().read(isbn.trim());  |(2)

    if (null == book) {
      ActionErrors errors = new ActionErrors();
      errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("message.notfound"));
      saveErrors(request, errors);
      return mapping.findForward("failure";
  }

      request.setAttribute("book", book);
      return mapping.findForward("success");
  }

}

Listing 4에서 Struts 액션의 구현 방법이 나온다. (1)에서 JavaBean 속성을 만든다. 이 속성은 DelegatingRequestProcessor에 의해 자동으로 파퓰레이트 된다. 이 디자인은 Struts 액션이 Spring에 의해 관리된다는 사실을 모르도록 한다. 이와 동시에 여러분은 Spring의 액션 관리 프레임웍을 충분히 활용하게 되는 것이다. Struts 액션이 Spring의 존재를 모르기 때문에 Struts 코드를 리팩토링 하지 않고도 제어 역행 컨테이너를 위해 Spring을 교환할 수 있다.

DelegatingRequestProcessor 방식이 첫 번째 방식 보다 나은 것은 분명하지만, 문제점도 있다. 다른 RequestProcessor를 사용한다면 Spring DelegatingRequestProcessor를 직접 통합해야 한다. 추가된 코드는 관리상의 장애가 될 수 있고 애플리케이션의 유연성도 떨어트린다. 더욱이 Struts RequestProcessor를 명령어 체인으로 대체한다는 이야기도 있다. 그와 같은 변화는 이 솔루션에 부정적인 영향을 끼친다.

레시피 3. 액션 관리를 Spring에 위임하기#

Struts 액션 관리를 Spring 프레임웍으로 위임하는 훨씬 더 나은 솔루션이 있다. struts-config 액션 매핑에 프록시를 등록한다. 이 프록시는 Spring 컨텍스트에서 Struts 액션을 관찰한다. 이 액션이 Spring의 제어를 받기 때문에 이것은 이 액션의 JavaBean 속성들을 파퓰레이트하고, Spring의 AOP 인터셉터 같은 기능들도 적용할 수 있는 여지도 마련해 준다

Listing 5에서, Action 클래스는 Listing 4와 같다. 하지만 struts-config가 약간 다르다.

Listing 5. 위임 방식의 Spring 통합

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
 <form-beans>
    <form-bean name="searchForm" 
      type="org.apache.struts.validator.DynaValidatorForm">
               <form-property name="isbn"    type="java.lang.String"/>
    </form-bean>
  
  </form-beans>

 <global-forwards type="org.apache.struts.action.ActionForward">
     <forward   name="welcome"                path="/welcome.do"/>
     <forward   name="searchEntry"            path="/searchEntry.do"/>
     <forward   name="searchSubmit"           path="/searchSubmit.do"/>
 </global-forwards>

 <action-mappings>
    <action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
    <action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>
    <action    path="/searchSubmit" 
             type="org.springframework.web.struts.DelegatingActionProxy" |(1)
             input="/searchEntry.do"
             validate="true"
             name="searchForm">
             <forward name="success" path="/WEB-INF/pages/detail.jsp"/>
             <forward name="failure" path="/WEB-INF/pages/search.jsp"/>
    </action>  

 </action-mappings>

 <message-resources parameter="ApplicationResources"/>


 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property 
    property="pathnames" 
    value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 </plug-in>


 <plug-in 
    className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>
 </plug-in>

 
</struts-config>

Listing 5는 한 가지 작은 차이를 제외하고는 전형적인 struts-config.xml 파일이다. DelegatingActionProxy 액션의 클래스 이름을 밝히는 대신 Spring의 프록시 클래스 이름을 등록한다.(1) 클래스는 액션 매핑 이름을 사용하여 Spring 컨텍스트에서 액션을 관찰한다. 이것은 ContextLoaderPlugIn로 선언된 컨텍스트이다.

Struts 액션을 Spring 빈으로서 등록하는 것은 매우 단순하다.(Listing 6) <bean> 태그의 이름 애트리뷰트 (이 경우 "/searchSubmit")를 사용하여 이 액션 매핑의 이름을 사용하는 빈을 만든다. 이 액션의 JavaBean 속성들은 여느 Spring 빈 처럼 파퓰레이트 된다.

Listing 6. Spring 컨텍스트에 Struts 액션 등록하기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
 "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>

  <bean name="/searchSubmit"   
        class="ca.nexcel.books.actions.SearchSubmit">
     <property name="bookService">
        <ref bean="bookService"/>
     </property>
  </bean>

</beans>

액션 위임의 효과#

액션-위임 솔루션은 세 방식 중에서 최고이다. Struts 액션은 Spring을 인식할 수 없고, 코드를 변경하지 않고도 비 Spring 애플리케이션에서 사용될 수 있다. 이것은 RequestProcessor의 변경에 영향을 받지 않고, Spring의 AOP 기능을 활용할 수 있다.

액션 위임의 효과는 여기서 멈추지 않는다. 일단 Struts 액션을 Spring이 제어하도록 하면 Spring은 더욱 많은 일을 해낸다. 예를 들어, Spring 없이 모든 Struts 액션들은 "쓰레드 안전" 액션이 된다. <bean> 태그의 한 애트리뷰트를 "false"로 설정하면 애플리케이션은 각 요청에 대해 새롭게 만들어진 액션 객체를 갖게 된다. 또한 Spring의 라이프 사이클 메소드를 활용할 수 있다. 예를 들어, <bean>태그의 init-method 애트리뷰트는 Struts 액션이 인스턴스화 될 때 메소드를 실행한다. 이와 비슷하게 destroy-method 애트리뷰트는 빈이 컨테이너에서 삭제되기 전에 메소드를 실행한다. 이 메소드들은 값비싼 객체들을 관리할 수 있는 좋은 방법이다.

Struts 인터셉트#

앞서 언급했던 것 처럼, Struts와 Spring을 결합할 때의 가장 큰 장점 중 한 가지는 Spring의 AOP 인터셉터를 Struts 액션에 적용할 수 있다는 점이다. Spring 인터셉터를 Struts 액션에 적용함으로서 크로스-커팅 문제를 해결할 수 있다.

Spring엔 빌트인 인터셉터를 제공한다. 하지만 여기에서는 여러분 스스로 인터셉터를 구현하여 Struts 액션에 적용하는 방법을 설명하겠다. 인터셉터를 사용하기 위해서는 다음과 같이 한다.

  1. 인터셉터를 만든다.
  2. 이를 등록한다.
  3. 이것이 코드를 교차하는 곳을 선언한다.

매우 간단하지만 강력하다. Listing 7에서 Struts 액션에 대한 로깅 인터셉터를 만들었다. 이 인터셉터는 메소드가 호출되기 전에 문장을 프린트한다.

Listing 7. 로깅 인터셉터

package ca.nexcel.books.interceptors;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class LoggingInterceptor implements MethodBeforeAdvice {

   public void before(Method method, Object[] objects, Object othrows Throwable {
        System.out.println("logging before!");
    }
}

이 인터셉터는 매우 간단하다. before() 메소드는 인터섹션의 모든 메소드에 앞서 실행된다. 이 경우 이것은 문장을 프린트하지만 다른 것도 수행할 수 있다. 그런 다음 Spring 설정 파일에 인터셉터를 등록한다. (Listing 8)

Listing 8. 설정 파일에 인터셉터 등록하기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>

  <bean name="/searchSubmit" 
        class="ca.nexcel.books.actions.SearchSubmit">
     <property name="bookService">
        <ref bean="bookService"/>
     </property>
  </bean>

  <!--  Interceptors --> 
  <bean name="logger"    
    class="ca.nexcel.books.interceptors.LoggingInterceptor"/> |(1)

  <!-- AutoProxies -->
  <bean name="loggingAutoProxy" 
        class="org.springframework.aop.framework.autoproxy.
          BeanNameAutoProxyCreator"> |(2)
    <property name="beanNames">
          <value>/searchSubmit</valuesgt; |(3)
    </property>
    <property name="interceptorNames">
        <list>
          <value>logger</value> |(4)
        </list>
    </property>
   </bean>

</beans>

이미 눈치챘겠지만 Listing 8은 Listing 6을 확장하여 인터셉터를 추가했다.

  • (1) 에서 인터셉터를 등록한다.
  • (2) 에서 인터셉터가 사용되는 방법을 설명하는 빈 이름 autoproxy를 만든다. 인터섹션을 정의하는 다른 방법들도 있지만 이 방법이 일반적으로 사용된다.
  • (3) 에서 Struts 액션을 인터셉트 될 빈으로 등록한다. 다른 Struts 액션을 인터섹트 하려면 추가 <value> 태그를 "beanNames" 아래에 만든다.
  • (4) 에서 인터셉트가 발생할 때 (1)에서 만들었던 인터셉터 빈의 이름을 실행한다. 여기에 나열된 모든 인터셉터들이 "beanNames" 에 사용된다.

다 되었다. Struts 액션을 Spring 프레임웍의 제어를 받도록 하면 Struts 애플리케이션을 핸들 할 때 새로운 옵션들을 사용할 수 있다. 이 예제에서 액션 위임을 통해 Spring 인터셉터를 Struts 애플리케이션에서 쉽게 활용할 수 있었다.

결론#

이 글에서 Struts 액션을 Spring 프레임웍에 통합할 수 있는 세 가지 레시피를 배웠다. Spring의 ActionSupport를 사용하여 Struts를 통합하는 것은 빠르고 쉬운 방식이지만 Struts 액션들이 Spring 프레임웍에 연결한다. 이 애플리케이션을 다른 프레임웍에 포팅해야 하다면 코드를 재작성 해야 한다. 두 번째 솔루션인 RequestProcessor를 위임하는 것은 코드를 확실히 분리하지만 Struts RequestProcessor가 명령어 체인으로 개정된다면 오래가지 못한다. 세 번째 방식이 가장 낫다. Struts 액션을 Spring 프레임웍에 위임하면 Struts 애플리케이션에서 Spring의 기능들을 활용할 수 있다.

이 세 가지 Struts-Spring 통합 레시피들 모두 완전한 애플리케이션으로 구현되었다. 아래 다운로드 섹션을 참조하기 바란다.

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-5) was last changed on 06-Apr-2006 09:45 by 이동국