올해초 Srping BlazeDS Integration 1.0.0 M1 으로 스프링과 BlazeDS를 적용해 보았는데

( 머드초보님의 M1 사용기 : http://mudchobo.tomeii.com/tt/371 )

한학기 마치고 다시 접하려고 했더니 정식버전이 나왔더군요!

그래서 반가운 마음에 적용해보려고 Spring 홈페이지( http://www.springsource.org )에서 다운로드후

문서를 보았는데. M1에 비해서 문서의 양이 늘어나있고 영어 잼병인 저에겐 소스코드만이 유일한

해독가능한 언어인데 상황에 따라 다르게 적용해야되는 코드들이라 영 도움이 안되 몇일간 삽질을 시켜주었습니다ㅜㅜ

우선 설명하기에 앞서 플렉스 컴퍼넌트 카페( http://cafe.naver.com/flexcomponent.cafe ) 에 서기님이 올려주신

Flex3+eclipse europa + BlazeDS 셋팅 게시물의 첨부된 문서의 세팅방법을 모두 완료했다는 가정하에 설명하도록

하겠습니다. ( http://cafe.naver.com/flexcomponent.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=10906

서기님이 작성하신 셋팅문서 첨부해 두겠습니다.)



자 이제 위 과정으로 BlazeDS_Hello.mxml을 실행하였을 경우 "Welcome BlazeDS 성공!" 이란 문구를 보았다고 치고

이제 Srping BlazeDS Integration을 적용해 보도록 하겠습니다.

우선 Srping BlazeDS Integration에 필요한 환경(Java 5 or higher, Spring 2.5.6 or higher ,Adobe BlazeDS 3.2 or higher)

을 구성해주어야 되는데 http://www.springsource.org/download 에서 우선 Srping BlazeDS Integration과 Spring 2.5.6

을 받아서 lib안에 넣어줍니다.

그리고 web.xml을 수정해보겠습니다.

우선 spring을 사용하면서 필요없어진 리스너를 삭제합니다.

<!-- 아래의 리스너 삭제 -->
<listener>
        <listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>

그리고 스프링을 사용하기 위한 ContextLoaderListener를 삽입합니다.

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet-mapping>태그는 그대로 두고 <servlet> 태그만 스프링을 사용하기 위해 아래와 같이 수정합니다.

<servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/web-application-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

여기 까지가 web.xml 수정사항입니다.

그 후 spring을 사용하려면 기본적으로 WEB-INF밑에 applicationContext.xml 파일이 있어야 하기에 만들어 줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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-2.5.xsd">
      
</beans>




이제 web.xml에서 <servlet>태그밑에 <param-value>에 선언해 두었던 web-application-config.xml을 만들어줍니다.

안의 내용은 뒤에 설명하도록 하겠습니다.


이제 WEB-INF밑에 flex폴더에 들어있는 BlazeDS관련 xml들을 수정하겠습니다.

우선 remoting-config.xml에 선언해둔 blaze id에 destination 태그를 삭제합니다. 이태그는 이제 spring 관리하에

web-application-config.xml에서 새로운 인생(?)을 살게 될 것입니다.

그리고 services-config.xml <services> 태그밑에  아래와 같이 default-channels 태그를 추가해 줍니다.

<services>
        <service-include file-path="remoting-config.xml" />
        <service-include file-path="proxy-config.xml" />
        <service-include file-path="messaging-config.xml" />   
        <default-channels>
           <channel ref="my-amf"/>
        </default-channels>     
    </services>

자 이제 주역인 web-application-config.xml에 내용을 넣도록 하겠습니다.

우선 설명하기에 앞서 전체코드 나갑니다.

<!-- web-application-config.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:flex="http://www.springframework.org/schema/flex"
       xmlns:p="http://www.springframework.org/schema/p"
       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-2.5.xsd
               http://www.springframework.org/schema/flex
            http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
       
       <bean id="mySpringManagedMessageBroker" class="org.springframework.flex.core.MessageBrokerFactoryBean" />

       <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
             p:mappings="/*=mySpringManagedMessageBroker" />
      
       <bean class="org.springframework.flex.servlet.MessageBrokerHandlerAdapter" />
                
       <bean id="test" class="test.Test">
               <flex:remoting-destination destination-id="blaze" message-broker="mySpringManagedMessageBroker"/>
       </bean>

</beans>


얼핏 복잡해보이기도 하지만 사실 그렇게 어렵지 않습니다.

우선 네임스페이스 부분을 보면 xmlns:flex="http://www.springframework.org/schema/flex 추가됬고

스키마부분을 보면

http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd

기존 스프링에서 이두개가 추가되었고

web.xml에서 들어오는 MessageBroker를 아래 태그가 담당합니다.

<bean id="mySpringManagedMessageBroker" class="org.springframework.flex.core.MessageBrokerFactoryBean" />

id는 편하신데로 주시면 되고 사실 이부분을 doc에 보면 여러가지 방법으로 표현할 수 있는데 <flex:message-broker/>등

짧게 표현이 가능하지만 doc이 부실한지 제가 못찾는지 이대로 실행하면 오류가나서 실행이안됩니다.

2009/07/13 추가사항

<flex:message-broker/> 방식의 사용법을 보시려면 다음의 페이지를 참고해주세요!

http://actionscripter.tistory.com/27


그래서 전 그냥 기존 spring 방식으로 bean으로 처리했습니다.

다음으로 스프링에 SimpleUrlHandlerMapping 으로 MassageBroker와 연결합니다.

저는 편의상 p 네임스페이스로 축약해서 사용했습니다.

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
             p:mappings="/*=mySpringManagedMessageBroker" />

또는

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/messagebroker/*=mySpringManagedMessageBroker
</value>
</property>
</bean>


그리고 이부분은 저도 잘 모르겠는데 messageBroker와 관련된 adapter인듯 합니다.

<bean class="org.springframework.flex.servlet.MessageBrokerHandlerAdapter" />


그리고 저를 가장 고생시킨.. remoting 부분인데 1.0.0 정식이 나오면서 <flex:remoting-service>태그가

<flex:remoting-destination>으로 바겼는지 국내와 국외문서 모두에 <flex:remoting-service>으로 되어있어서

상당히 고생했습니다. 이부분도 다양한 사용방법이 있는데 자세한것은 레퍼런스를 참조하시고 우선 성공한 방법만

소개하겠습니다.

<bean id="test" class="test.Test">
               <flex:remoting-destination destination-id="blaze" message-broker="mySpringManagedMessageBroker"/>
</bean>

또는

<bean id="test" class="test.Test"/>
      
<flex:remoting-destination ref="test" destination-id="blaze" message-broker="mySpringManagedMessageBroker"/>

또는

<bean id="test" class="test.Test"/>

<bean id="product" class="org.springframework.flex.remoting.RemotingDestinationExporter"
             p:messageBroker-ref="mySpringManagedMessageBroker" p:service-ref="test"
             p:destinationId="blaze" />

레퍼런스문서에 ref 외에는 나와있질 않아서 계속 메시지브로커를 찾지못한다는 에러를 보았는데

결국 flex스키마 문서를 죄 뒤져서 속성을 찾아냈습니다 ㅡㅠ

message-broker="mySpringManagedMessageBroker" 부분은 꼭 넣어주시고

remoting-config.xml에서 destination id로 사용되는 부분과 같은 속성이 destination-id 입니다.

사실 이외에도 채널등 여러 속성이 있는데 불필요하다고 판단해서 다 제외했습니다.

자이제 여기까지 설정을 하시고 BlazeDS_Hello.mxml을 실행해보시면 다음과 같은 아름다운 화면을 보실 수 있습니다!


반갑다 친구야!!


그 외 정식버전에서 추가된 부분중에 눈에띄는 부분인 스프링 시큐리티와의 연동은 다음 기회에...

삽질해보고 올리도록 하겠습니다.

몇일간에 삽질은 여기서 마치도록 하고 제가 참고한 페이지들과 소스파일 등은 파일첨부로 해두겠습니다.


다운로드
BlazeDS 3.2 : http://opensource.adobe.com/wiki/display/blazeds/BlazeDS
Srping BlazeDS Integration 1.0.0  및 Spring2.5.6 : http://www.springsource.org/download



::Java Platform::/::Spring:: | Posted by 그냥그냥그 2009. 1. 6. 15:32

:: Spring MultiActionController 사용법 ::



Spring MVC에서 컨트롤러들은 하나의 역활뿐이 할 수 없지만

MultiActionController를 사용하면 Struts의 DispatchAction과 같은 효과를 낼 수 있습니다.

우선 코드를 먼저 보면

기본적인 필요한 클래스를 Import 합니다.

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

그리고 원하는 클래스에 MultiActionController를 상속합니다.

public class NoticeController extends MultiActionController

그 후

public ModelAndView selectPreview( HttpServletRequest request , HttpServletResponse response )
{
....생략
}

public ModelAndView selectView( HttpServletRequest request , HttpServletResponse response , NoticeVo command )
{
....생략
}


원하는만큼 메소드를 생성합니다. 이름은 어떠한 것이라도 상관없습니다.

반환값도 ModelAndView 뿐만 아니라 void String 타입도 가능합니다.

그리고 AbstractController 에서처럼 command를 설정해서 파라미터값 들을 가져오고 싶을때에는

위 코드 두번째처럼 원하는 getter setter로 이루어진 자바빈을 등록하면 자동으로 command라는 객체에

파라미터가 들어가게 됩니다.

이제 applicationContext에 설정을 해보겠습니다.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
       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-2.5.xsd">

<bean id = "noticeController" class = "kr.pe.raisondetre.controller.plain.NoticeController"
       p:methodNameResolver-ref = "multiActionResolver" />

<bean id = "multiActionResolver" class = "org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"
          p:paramName = "type" />

컨트롤러에 파라미터로 methodNameResolver , ref = ParameterMethodNameResolver의 id 값을 넣어 줍니다.

ParameterMethodNameResolver에서는 파라미터로 paramName , value를 원하는 파라미터명으로 설정합니다.

위와 같이 설정 했을 경우 http://localhost:8080/Raisondetre/notice.htm?type=sleectPreview

으로 접속시에 MultiActionController에서 selectPreview 메소드를 실행하게 됩니다.

파라미터값을 command로 받을 때에도

http://localhost:8080/Raisondetre/notice.htm?type=sleectView&id=1

이렇게 받게되면 selectView메소드에서 NoticeVO라는 command객체의 id setter 메소드에 1이 들어가게 됩니다.