Spring을 이용한 Struts 액션 핸들링Struts 애플리케이션과 Spring을 통합하는 세 가지 방법 ![]() |
![]() |
난이도 : 초급 George Franciscus, Principal, Nexcel 2005 년 10 월 11 일 Struts Recipes의 공동 저자 George Franciscus는 또 다른 Struts 통합 레시피를 가지고 돌아왔다. 이번에는 Struts 애플리케이션을 Spring 프레임웍으로 반입한다. Struts 액션을 Spring의 빈 처럼 관리할 수 있다. Spring AOP의 효과를 쉽게 누릴 수 있다. Inversion of Control (IOC) 디자인 패턴에 대해서는 누구나 한번쯤은 들어봤을 것이다. Spring 프레임웍을 사용했다면 그 실행 원리도 알 것이다. Struts 애플리케이션을 Spring 프레임웍으로 반입할 때 IOC 패턴이 큰 힘을 발휘한다. Struts 애플리케이션을 Spring 프레임웍으로 통합할 때의 이점은 많이 있다. 우선, Spring은 JEE의 문제들, 이를 테면 복잡성, 낮은 퍼포먼스, 테스트 같은 문제들을 해결하기 위해 설계되었다. 두 번째로 Spring 프레임웍에는 aspect 지향 기술을 일반 객체 지향 코드에 적용할 수 있는 AOP 구현이 포함되어 있다. 세 번째로 Spring 프레임웍은 Struts가 핸들하는 것 보다 Struts를 더 잘 다룬다. 하지만 이것은 견해의 문제이고, Struts 애플리케이션을 Spring 프레임웍으로 통합하는 세 가지 접근방식을 설명할 때 여러분 스스로 판단해 보기 바란다. 내가 설명하는 접근 방식들은 비교적 실행하기에 간단하지만 각기 다른 효과를 갖고 있다. 따라서 각각의 방식을 완전히 이해할 수 있도록 작동 예제도 따로 만들었다. 다운로드 섹션에서 전체 예제의 소스 코드를 참조하기 바란다. Struts MVC와 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 역시 MVC 구현으로서의 기능을 한다. 두 프레임웍 모두 장점과 단점을 갖고 있다. MVC에 관해서라면 Struts가 여전히 우세하다는 것에는 동의할 것이다. 많은 개발팀들은 엄격한 데드라인 하에 양질의 소프트웨어를 구현할 수 있는 토대로서 Struts에 의존해야 한다고 배워왔다. Struts 뒤에 너무나 많은 탄력으로 Spring 프레임웍의 기능을 통합하고 싶은 개발 팀 조차도 Spring MVC로 전환하기를 꺼려한다. 좋은 소식은 여러분은 그럴 필요가 없다는 것이다. Spring 아키텍쳐에서 여러분은 웹 프레임웍으로서 Struts를 Spring 기반의 비즈니스 및 영속 레이어에 연결할 수 있다. 이제부터 Struts MVC를 Spring 프레임웍과 통합하는 세 가지 방법을 설명한다. 각 레시피의 장단점을 설명하겠다. 세 가지 모두 작동하는 것을 일단 설명한 다음 내가 개인적으로 선호하는 방식을 설명하겠다.
다음의 통합 기술들(또는 레시피)은 장점도 갖고 있고 단점도 있다. 나는 이들 중 한 가지를 선호하기는 하지만, 이들 모두를 이해하는 것이 바람직하다. 또한 다양한 시나리오를 다루는 광범위한 시나리오도 소개 할 예정이다. 레시피는 다음과 같다.
어떤 기술을 사용하든지 Spring의
앞에서도 언급했지만 아래 다운로드섹션에서 예제 애플리케이션의 소스를 다운로드 할 수 있다. 각각의 예제는 Struts와 Spring을 통합하는 방식을 다르게 보여주고 있다. 이 글의 예제는 기본적인 부분만 다르기 때문에 애플리케이션을 다운로드하여 전체를 다 보는 것도 좋다.
레시피 1. Spring의 ActionSupport 사용하기 Spring 컨텍스트를 직접 만드는 것은 Struts와 Spring 통합에 있어서 가장 매력적인 방법이다. 더 쉽게 하기 위해 Spring은 도움말도 제공한다. Listing 1. ActionSupport를 사용하여 Struts 통합하기
어떤 일이 일어나는지 보자. (1)에서 Struts Action 클래스가 아닌 Spring 이 기술은 간단하고 이해하기 쉽다. 불행히도 이것은 Struts 액션을 Spring 프레임웍에 연결한다. Spring 말고 다른 것을 사용해야 한다면 코드를 다시 작성해야 한다. 더욱이 Struts 액션은 Spring의 제어를 받지 않기 때문에 Spring AOP의 혜택을 누릴 수도 없다. 이 기술은 다중의 독립적인 Spring 컨텍스트를 사용할 때 유용하지만 대부분의 경우는 바람직하지 못하다.
Struts 액션에서 Spring을 분리하는 것도 좋은 방법이다. 한 가지 방법은 Struts Listing 2. Spring의 DelegatingRequestProcessor
여기에서 Listing 3. Spring config 파일에 액션 등록하기
(1)에서, struts-config 액션 매핑 이름과 매치하는 이름 애트리뷰트를 사용하여 빈을 등록했다. Listing 4. JavaBean 속성을 가진 Struts 액션
Listing 4에서 Struts 액션의 구현 방법이 나온다. (1)에서 JavaBean 속성을 만든다. 이 속성은
Struts 액션 관리를 Spring 프레임웍으로 위임하는 훨씬 더 나은 솔루션이 있다. struts-config 액션 매핑에 프록시를 등록한다. 이 프록시는 Spring 컨텍스트에서 Struts 액션을 관찰한다. 이 액션이 Spring의 제어를 받기 때문에 이것은 이 액션의 JavaBean 속성들을 파퓰레이트하고, Spring의 AOP 인터셉터 같은 기능들도 적용할 수 있는 여지도 마련해 준다 Listing 5에서,
Listing 5는 한 가지 작은 차이를 제외하고는 전형적인 struts-config.xml 파일이다. Struts 액션을 Spring 빈으로서 등록하는 것은 매우 단순하다.(Listing 6) Listing 6. Spring 컨텍스트에 Struts 액션 등록하기
액션-위임 솔루션은 세 방식 중에서 최고이다. Struts 액션은 Spring을 인식할 수 없고, 코드를 변경하지 않고도 비 Spring 애플리케이션에서 사용될 수 있다. 이것은 액션 위임의 효과는 여기서 멈추지 않는다. 일단 Struts 액션을 Spring이 제어하도록 하면 Spring은 더욱 많은 일을 해낸다. 예를 들어, Spring 없이 모든 Struts 액션들은 “쓰레드 안전” 액션이 된다.
앞서 언급했던 것 처럼, Struts와 Spring을 결합할 때의 가장 큰 장점 중 한 가지는 Spring의 AOP 인터셉터를 Struts 액션에 적용할 수 있다는 점이다. Spring 인터셉터를 Struts 액션에 적용함으로서 크로스-커팅 문제를 해결할 수 있다. Spring엔 빌트인 인터셉터를 제공한다. 하지만 여기에서는 여러분 스스로 인터셉터를 구현하여 Struts 액션에 적용하는 방법을 설명하겠다. 인터셉터를 사용하기 위해서는 다음과 같이 한다.
매우 간단하지만 강력하다. Listing 7에서 Struts 액션에 대한 로깅 인터셉터를 만들었다. 이 인터셉터는 메소드가 호출되기 전에 문장을 프린트한다.
이 인터셉터는 매우 간단하다.
이미 눈치챘겠지만 Listing 8은 Listing 6을 확장하여 인터셉터를 추가했다.
다 되었다. Struts 액션을 Spring 프레임웍의 제어를 받도록 하면 Struts 애플리케이션을 핸들 할 때 새로운 옵션들을 사용할 수 있다. 이 예제에서 액션 위임을 통해 Spring 인터셉터를 Struts 애플리케이션에서 쉽게 활용할 수 있었다.
이 글에서 Struts 액션을 Spring 프레임웍에 통합할 수 있는 세 가지 레시피를 배웠다. Spring의 이 세 가지 Struts-Spring 통합 레시피들 모두 완전한 애플리케이션으로 구현되었다. 아래 다운로드 섹션을 참조하기 바란다.
토론
|