[출처] STRUTS - SPRING 연계|작성자 돌맹이
1. 코드로 서비스를 직접 받아 오기
아주 단순한 방법이다. ApplicationContext를 가져 와서 bean을 직접 찾아 온다.
스트럿츠의 action에서 직접 코딩해 준다.
1) Action 클래스는 org.springframework.web.struts.ActionSupport 를 상속해야 한다.
2) 직접 코딩
ApplicationContext ctx = getWebApplicationContext();
TreeService treeService = (TreeService)ctx.getBean("treeService");
특징: 스프링과 스트럿츠가 완전 따로 논다.
장점: 설정이 전혀 필요 없고 단순해서 적용이 쉽다.
단점: 스프링 프레임웍에 종속적이다. (스프링 사상에 어긋난다)
2. DelegatingRequestProcessor 사용하기
몇가지 설정이 필요하고 스트럿츠 action을 spring화 하는 작업이 필요하다.
1) struts-config.xml에 controller를 등록한다.
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
2) action 클래스에 필요한 서비스에 대한 set 함수를 만든다. (get 함수도 만드는 것이 좋다)
private MyService myService = null;
public void setMyService(MyService myService) {
this.myService = myService;
}
3) 스트럿츠 action을 스프링 빈 선언한다. (파일을 따로 구분하는게 좋을 듯)
<bean name="/myTest" class="kr.co.commercei.sample.MyAction">
<property name="myService" ref="myService"/>
</bean>
action 클래스의 setMyService 메소드를 통해 스프링에서 관리되는 bean중 'myService'를 세팅하는 것이다.
name속성의 값은 스트럿츠 action 설정의 path 값과 같다.
물론, ref에 정의된 'myService'에 대한 bean 설정이 딴 스프링 설정 파일에 선언돼 있어야 한다.
4) struts-config.xml에 plug-in을 등록한다.
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/config/struts/spring-services-to-actions.xml"/>
</plug-in>
여기서 value 속성의 값(spring-services-to-actions.xml)은 스트럿츠의 action을 스프링의 빈 관리처럼
선언하 는 스프링 설정파일이다. 즉, 3)번에서 설정한 파일명이다.
특징: action 객체가 스프링의 bean으로 관리된다.
장점: 스프링의 설정에는 변화가 없다.
단점: 서비스 set함수를 꼭 마련해야 한다. RequestProcessor를 사용한다.
(다른 Request Processor를 사용할 때 문제 발생)
3. Action 관리를 Spring에 위임하기
- 2 번과 거의 비슷하나 주체가 바뀐다.
1) struts-config.xml에 action 설정을 다음과 같이 한다.
<action
path="/myTest"
type="org.springframework.web.struts.DelegatingActionProxy"
......
action 클래스를 직접 선언하지 않고 스프링에서 제공되는 DelegatingActionProxy 클래스로 한다.
2) ~ 4) 번 절차는 2 번 방식과 똑같다.
특징: 스트럿츠가 완전히 스프링의 빈화 되어 관리된다.
장점: 스프링의 AOP 등 완벽하게 스프링의 기능을 사용할 수 있게 된다.
단점: 스트럿츠의 설정이 스프링 종속적이 된다.
일반적으로 3 번 째 방식이 젤 좋다고들 한다. 많은 곳에서 그 방식을 사용하는 것 같다. 그러나 의문점이 생긴다. 세번 째 방식이 과연 스프링에 비종속적인 방식일까? 스프링을 떼어 낸다면 그 수많은 action 설정을 일일이 클래스를 찾아가며 바꿔줘야 할 것이다.