출처 : http://blog.naver.com/PostView.nhn?blogId=thunder1119&logNo=100091204490
올해초 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-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet-mapping>태그는 그대로 두고 <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 파일이 있어야 하기에 만들어 줍니다.
<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 태그를 추가해 줍니다.
<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에 내용을 넣도록 하겠습니다.
우선 설명하기에 앞서 전체코드 나갑니다.
<?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를 아래 태그가 담당합니다.
id는 편하신데로 주시면 되고 사실 이부분을 doc에 보면 여러가지 방법으로 표현할 수 있는데 <flex:message-broker/>등
짧게 표현이 가능하지만 doc이 부실한지 제가 못찾는지 이대로 실행하면 오류가나서 실행이안됩니다.
<flex:message-broker/> 방식의 사용법을 보시려면 다음의 페이지를 참고해주세요!
http://actionscripter.tistory.com/27
그래서 전 그냥 기존 spring 방식으로 bean으로 처리했습니다.
다음으로 스프링에 SimpleUrlHandlerMapping 으로 MassageBroker와 연결합니다.
저는 편의상 p 네임스페이스로 축약해서 사용했습니다.
p:mappings="/*=mySpringManagedMessageBroker" />
또는
그리고 이부분은 저도 잘 모르겠는데 messageBroker와 관련된 adapter인듯 합니다.
그리고 저를 가장 고생시킨.. remoting 부분인데 1.0.0 정식이 나오면서 <flex:remoting-service>태그가
<flex:remoting-destination>으로 바겼는지 국내와 국외문서 모두에 <flex:remoting-service>으로 되어있어서
상당히 고생했습니다. 이부분도 다양한 사용방법이 있는데 자세한것은 레퍼런스를 참조하시고 우선 성공한 방법만
소개하겠습니다.
<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을 실행해보시면 다음과 같은 아름다운 화면을 보실 수 있습니다!