- notice 스킨변경~
[Spring/Flex] Spring BlazeDS Integration 1.0.0.M1 삽질 후기-_-;
Posted in 스프링(Spring) // Posted at 2008/12/27 02:39사실 Spring Bean을 BlazeDS에서 사용하는 것은 이미 다른 사람들이 많이 만들었죠^^ 근데 스프링소스에서 공식적으로 지원을 해주다니 대단합니다^^ 제가 한번 해봤습니다-_-; 스프링과 BlazeDS의 기본만 알고 있어서 하는데에는 무리가 없었습니다-_-;
환경 : JDK 6 U 10 + Tomcat 6.0.18 + BlazeDS 3.2.0.3978 + Spring BlazeDS Integration 1.0.0.M1 + Flex SDK 3.2 + Flex Builder 3.0.2 + SpringFramework 2.5.6
SpringFramework 2.5.6 Download
BlazeDS 3.2.3978 Download
Spring BlazeDS Integration Download
쉬운 개발환경을 위해 플렉스빌더에서.....
New Flex Project -> Project name은 SpringBlazeDS, Web application을 선택하고, Application server type은 J2EE로 합니다 ^^ Next를 하시면 Target runtime은 Tomcat 6.0, Flex WAR파일은 BlazeDS를 다운로드해서 blazeds.war파일을 선택합니다. Finish를 때려줍니다-_-;
프로젝트의 Properties에서 Flex Server에 보면 Context root부분이 /WebContent로 되어있는데, /SpringBlazeDS로 바꿔줍니다.
라이브러리는 Spring에서 spring.jar, spring-webmvc.jar, Spring BlazeDS Integration에서 org.springframework.flex-1.0.0.M1.jar를 WEB-INF/lib폴더에 복사하면 됩니다.
자바쪽 셋팅을 해봅시다.
Webcontent/WEB-INF/web.xml파일을 열어서 수정합니다.
기존에는 MessageBrokerServlet을 사용해서 하는데, Spring BlazeDS Integration에서는 Spring Servlet을 사용합니다. MessageBroker Servlet을 servlet-mapping과 함께 지워주고, Spring Servlet을 선언합니다.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>SpringBlazeDS</display-name>
<context-param>
<param-name>flex.class.path</param-name>
<param-value>/WEB-INF/flex/hotfixes,/WEB-INF/flex/jars</param-value>
</context-param>
<!-- Http Flex Session attribute and binding listener support -->
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<!-- Spring Dispatcher Servlet -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
설정파일을 작성하기 전에 초간단 스프링 빈을 하나 만들어봅시다.
service패키지를 하나 만들고, HelloService라는 클래스를 만듭시다.
package service;
public class HelloService {
public String sayHello(String name) {
return name + "! 메리추석!";
}
}
이제 /WebContent/WEB-INF/applicationContext.xml파일을 생성합니다.
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="mySpringManagedMessageBroker"
class="org.springframework.flex.messaging.MessageBrokerFactoryBean" />
<!-- Maps request paths at /messagebroker to the BlazeDS MessageBroker -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
p:mappings="/*=mySpringManagedMessageBroker" />
<!-- Dispatches requests mapped to a MessageBroker -->
<bean class="org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter"/>
<bean id="helloService" class="service.HelloService" />
<bean id="hello"
class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter"
p:messageBroker-ref="mySpringManagedMessageBroker"
p:service-ref="helloService"/>
</beans>
기존 MessageBroker가 Spring에 의해 관리된 MesssageBroker로 들어있는 것 같습니다. 그래서 Remote요청이 들어오면 Spring MessageBroker가 해당 destination을 찾아서 해주는 것 같습니다. 그리고, Spring Bean인 helloService를 불러오는 방법은 FlexRemotingServiceExporter를 이용해서 하는 것 같습니다. 요청하고 싶은 Bean을 FlexRemotingServiceExporter에 DI를 해서 사용하는 것이군요.
이곳에서 FlexRemotingServiceExporter의 id가 destination입니다^^ 저기서 hello로 정의했으니 Flex에서는 destination을 hello로 맞춰주면 되겠죠? ^^
나중에 destination을 추가하는 것은 service-config.xml에서 하는 것이 아니라 이곳에서 해야겠죠.
제가 잘못 이해하고 있는 것이 좀 많은 것 같아서...원문을 참조하세요~ ^^
이제 service-config.xml에 추가해야할 부분이 있습니다.
<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>
아....중요합니다. default-channels를 추가해야합니다!
이제 클라이언트로 가봅시다.
SpringBlazeDS.xml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:RemoteObject id="srv" destination="hello" />
<mx:TextInput id="inputName" />
<mx:Button label="전송" id="btnConfirm" click="srv.sayHello(inputName.text)" />
<mx:Label id="labelResult" text="{srv.sayHello.lastResult}" />
</mx:Application>
RemoteObject로 sayHello함수를 input에 입력해서 결과를 Label에 쓰는 간단한 프로그램입니다.
서버를 실행시키고 실행해봅시다.

2008. 12. 27 오전 2:31:42 org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter handle
정보: Channel endpoint my-amf received request.
젠장......어느카테고리에 넣어야 하지-_-; Spring에 넣자-_-;
-
열이아빠
저는 이제 막 스프링 공부를 다시 시작하고 있습니다.
아무래도 무개념 상태라..ㅠㅠ
내년 정식 릴리즈 전에는 좀 준비를 해야 할텐데요.
카테고리는 'Spring/Flex' 를 따로 만드셔도 좋지 않을까요.^^-
머드초보
저도 스프링 공부를 안한지오래돼서 ㅠ
간만에 스프링프레임워크 홈페이지에 가니 많이 바뀌었더라구요^^
이것저것 제품도 많이 나왔구요. 저도 공부를 다시 해봐야겠습니다 ㅠ
-
-
-
-
아이
대박인데! 이런게 조금만 더 빨리 나왔더라면~!ㅠㅠ
트랜젝션이랑 라우팅소스 적용할려면 별의별 삽질한걸 생각하면...ㅠㅠ -
-
-
머드초보
destination은 지정합니다.
<mx:RemoteObject id="srv" destination="hello" />
이 destination명은 FlexRemotingServiceExporter의 명과 같아야합니다
-
-
-
머드초보
음.....뭔가 잘못된 것도 없어보이는데....
service-config에 이부분도 추가했나요?
<default-channels>
<channel ref="my-amf"/>
</default-channels>
전 이것때문에 몇시간 날린 적이 있습니다만-_-;
정 안되시면 mudchobo@nate.com으로 문의주세요.
-
-

이버리
안녕하세요^^ 어제 메일보냈던 사람입니다..
답장 잘받았습니다.. 감사합니다..
프로젝트 생성시 WEB으로 선택하고 하니 잘되네요
감사합니다. -
-
-
-
-
-
도니도니
안녕하세요~ LCDS로도 해보셨는지 궁금하네요.
BlaseDS를 사용했을 시에는 잘 작동하는데 LCDS로는 안되네요.
버전은 2.5, 2.6 두개 테스트 해보았습니다.
먼가 설정을 잘못 한것인지 원래 LCDS는 안되는것인지 ..값비싼 LCDS를 지원한해줄리가..-_ --
머드초보
LCDS는 제가 안해봤네요.
음 LCDS는 안되는군요-_-
왜 안되는지 모르겠네요 ㅠ 분명 일부기능을 오픈소스한걸로 알고있는데 ㅠ
-
-
jsP
머드초보님 안녕하세요. 해당 글 따라해보다가, 플렉스프로젝트 만드는 부분에서요. runtime서버 지정해주는 부분과 war파일 지정해주는 부분이 어디에 있나 해서요;; 저 플렉스빌더3 쓰는데 그런 부분은 안보이는데요 ㅠㅠ 혹시 이클립스 프로젝트에서 war파일 import해서 만드는 건가요?? 참고로 전 플렉스빌더와 이클립스가 따로따로 설치되어 있습니다.
-
머드초보
안녕하세요~ 따로 사용하신 다면 이클립스에서 war를 import하는 게 맞습니다.
그리고, 이클립스에서 톰캣돌려놓고, 빌더에서는 이걸 요청하는 걸 코딩해야합니다. ^^
-
아.....제가 제일 좋아하는 헬로우 월드 찍는 시간입니다--;
이번에는 스프링 프레임워크를 이용해서 해봅시다. 계속 삽질중인데 이제 좀 이해가 가려고해요-_-;
JDK1.6.0 + TOMCAT 6.0 + SpringFramework 2.0.6에서 작업했습니다. 다 6이 들어가는군요-_-;
우선 스프링 프레임워크를 받아봅시다. 최신버전이 2.0.6 이군요.
spring-framework-2.0.6-with-dependencies 파일입니다.
http://www.springframework.org/download
이제 보기도 지겨운 보라색에 세줄그어진 이클립스라는 놈을 열어봅시다-_-;
File -> New -> 아래꺼Project 클릭후 Dynamic Web Project 선택.
프로젝트 이름은 SpringHelloWorld 라고 합시다.
Target Runtime은 Tomcat으로 하고 Finish를 합시다..
lib폴더에 lib파일들을 넣어야합니다.
스프링 받은거 압축을 풀면
spring-framework-2.0.6\dist\spring.jar파일(스프링 프레임워크 lib파일)
spring-framework-2.0.6\lib\jakarta-commons\commons-logging.jar파일(로그사용을 위한 lib파일)
http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
여기서 태그라이브러리 사용을 위한 jar파일을 받습니다.
standard.jar와 jstl.jar파일이 있습니다(태그라이브러리를 위한 lib파일)
4개파일을 lib폴더에 집어넣습니다.
web.xml파일을 수정합시다.
<display-name>SpringHelloWorld</display-name>
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
*.htm으로 들어오는 요청에 대해서는 springapp서블릿을 사용하겠다는 얘기네요. 서블릿은 스프링프레임워크에 있는 DispatcherServlet이랍니다
DispatcherServlet의 제어 행위를 처리하는 설정 파일이 필요한데, 이것은 서블릿 이름에 -servlet.xml을 붙여서 작성합니다.
/WEB-INF/springapp-servlet.xml을 작성해봅시다.
<beans>
<bean id="springappController" class="web.SpringappController" />
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">springappController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
대충 보아하니 beans태그 안에 bean태그가 3개가 있네요. 첫번째꺼는 Controller이고, 두번째꺼는 urlMapping시켜주는데 /hello.htm으로 요청이 들어오면 springappController에게 넘기라는 걸로 보이는군요-_-;
세번째꺼는 선행자와 후위자를 정해놓는 뭐그런거 같습니다. 미리 써놓으면 항상 쓰이는 WEB-INF/jsp/파일이름.jsp 에서 앞 뒤 없이 이름만 써도 되니까요.
SpringappController.java를 작성해봅시다.
이놈은 Controller라는 인터페이스를 상속받습니다.
web이라는 패키지를 생성후 거기에다가 class를 생성합니다.
생성할 때 New Java Class화면에서 Interface부분에 Add버튼을 클릭해서 Controller를 선택해서 추가해주면 자동으로 해줍니다.
package web;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class SpringappController implements Controller {
protected final Log logger = LogFactory.getLog(getClass());
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
String now = (new Date()).toString();
logger.info("returning hello view with " + now);
return new ModelAndView("hello", "now", now);
}
}
그냥 시간을 리턴합니다. new Date()로 시간을 생성해서 그걸 String으로 변환해서 now변수에 넣고, 로그를 기록하고, return할 때 now라는 변수는 now라는 이름으로 쓸 수 있게 hello파일에 넘겨줍니다. 이 hello는 앞 뒤 합치면 /WEB-INF/hello.jsp 가 되는 겁니다.
이제 /WEB-INF/hello.jsp파일을 봅시다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Hello :: Spring Application</title>
</head>
<body>
<h1>Hello World! - Spring Application</h1>
<p>Greetings, it is now<c:out value="${now}" /></p>
</body>
</html>
now라는 변수를 c:out태그로 출력합니다. Controller에서 시간을 담아서 넘겨줬습니다.
아 그리고 jsp파일을 WEB-INF폴더에 넣는 이유는 JSP파일 접근에 대한 권한이 아마 우리한테 없고 SPRING에게 넘겨서 일껍니다-_-; 즉 직접적으로 접근하지 못하도록 하려고....-_-; 그런거 같습니다 ^^
was/SpringHelloWorld로 접속시 index.jsp를 실행하는데 없으니 하나 만듭시다.
index.jsp
<script>
location.href="hello.htm"
</script>
바로 hello.htm으로 포워드해줍니다-_-; 자 그럼 실행해봅시다.
다음번엔 게시판이나 한번 만들어봐야겠어요-_-;
-
HJ.
spring.jar 에 말고 spring-webmvc.jar 안에 servlet파일들이 들어있네요.
spring.jar 파일만 사용하면 에러가 나더라구요. -
-
-

