본문 바로가기

OpenSource/DWR

SpringMVC + DWR 간단한 설정및 예제


DWR(Direct Web Remoting)은 자바로 만든 객체를 스크립트로 converting해서 클라이이언트에서 비동기식으로 사용할수 있도록 해주는  Java library 입니다. (쉽게말해 Ajax를 가능하게 합니다.)
아주 간단한 설정 만으로도 이런 걸 가능하게 해주니 정말 편리하죠^^
하지만 너무 남발하면 유지보수에 문제가 있으니 꼭 필요한 때에만 사용하는게 좋겠습니다. ㅋㅋ
(예전에 해외 음원싸이트 제작하던때에 어떤 동료개발자가 혼자 이 기술을 사용하면서 xml 설정파일에 떡칠을 해놨던 뷁스런... 기억이 나네요ㅡ_ㅡ 여러분들은 그러지마세요 ㅋㅋ 개발은 혼자하는게 아닙니다.)

자 그럼 이제부터 아주 간단하게 SpringMVC에서 DWR을 설정해보겠습니다.
이클립스에서 dynamic web project를 하나 생성합니다.
그리고 여기서 jar파일을 받습니다. http://directwebremoting.org/dwr/download.html
그 다음 /WEB-INF/lib에 넣습니다.

1. /WebContent/WEB-INF

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

  <display-name>SpringMVC_DWR</display-name>

 

       <filter>

             <filter-name>encodingFilter</filter-name>

             <filter-class>

                    org.springframework.web.filter.CharacterEncodingFilter

             </filter-class>

             <init-param>

                    <param-name>encoding</param-name>

                    <param-value>utf8</param-value>

             </init-param>

       </filter>

 

       <filter-mapping>

             <filter-name>encodingFilter</filter-name>

             <url-pattern>/*</url-pattern>

       </filter-mapping>

      

       <servlet>

             <servlet-name>dispatcher</servlet-name>

             <servlet-class>

                    org.springframework.web.servlet.DispatcherServlet

             </servlet-class>

             <load-on-startup>1</load-on-startup>

       </servlet>


       <servlet-mapping>

             <servlet-name>dispatcher</servlet-name>

             <url-pattern>/dwr/*</url-pattern>

       </servlet-mapping>

</web-app>


/dwr/* 경로오 오는 요청은 dispatcher-servlet.xml에서 처리합니다.
dispatcher-servlet.xml에다가 dwr설정을 하고 뷰단에서 "/[프로젝트명]/dwr/interface/hello.js"
, "/[프로젝트명]/dwr/engine.js", "/[프로젝트명]/dwr/util.js" 이런 식으로 스크립트 파일을 호출하겠다는 의미입니다. (참고로 여기서 저는 프로젝트명을 SpringMVC_DWR로 했습니다.)

<servlet-mapping>

 <servlet-name>dispatcher</servlet-name>

 <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

2. /src/com/lcy/logic/hello.java (com.lcy.logic.Hello.java)

 package com.lcy.logic;

public class Hello {
 public String say(String msg){
  System.out.println("mtehod [say(String msg)] operated.");
  return "hello " + msg;
 }
}


아... 무쟈게 간단합니다... ㅡ_ㅡ;;;
sysuot은 클라이언트에서 저 say 메소드가 잘 실행되나 보려고 해봤습니다.(실무에선 Log4J같은 걸 써야겠죠.)

3. /WebContent/WEB-INF/dispatcher-servlet.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:context="http://www.springframework.org/schema/context"

       xmlns:p="http://www.springframework.org/schema/p"

       xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

             http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd">

 

            

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">

<props>

<prop key="/enjine.js">dwrController</prop>

<prop key="/util.js">dwrController</prop>

<prop key="/interface/**">dwrController</prop>

<!-- <prop key="/call/**">dwrController</prop>-->

<prop key="/*">dwrController</prop>

</props>

</property>

</bean>

            

<dwr:controller id="dwrController" debug="true"/>

<dwr:configuration/>

 

<bean id="hello" class="com.lcy.logic.Hello" >

<dwr:remote javascript="hello">

<dwr:include method="say"/>

</dwr:remote>

</bean>

</beans>


위에 백그라운드 된 부분들이 있어야합니다. 스키마및 설정 관련 정의입니다.

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">

<props>

<prop key="/enjine.js">dwrController</prop>

<prop key="/util.js">dwrController</prop>

<prop key="/interface/**">dwrController</prop>

<!-- <prop key="/call/**">dwrController</prop>-->

<prop key="/*">dwrController</prop>

</props>

</property>

</bean>

prop 속성들의 key로 정의된 값들에 대해 dwr컨트룰러에 매핑시켜줍니다.
dwr컨트룰러는 아래와 같이 설정이 되어있습니다.

<dwr:controller id="dwrController" debug="true"/>

<dwr:configuration/> 스크립트에서 JSON방식으로 사용할 데이터 모델객체를 설정하는 부분인데 여기선 사용하지 않으므로 설명은 생략합니다.

<bean id="hello" class="com.lcy.logic.Hello" >

<dwr:remote javascript="hello">

<dwr:include method="say"/>

</dwr:remote>

</bean>

클라이언트에서 사용할 빈을 정의하고 자바스크립트에서 hello란 이름으로 호출해서 사용합니다.
include속성은 스크립트에서 사용할 메서드명을 기록합니다. 즉, say라는 메서드만 사용하겠다는 의미입니다. exclude속성을 사용하면 반대로 method값에 정의된 메서드명은 사용하지 못하게 하겠다는 의미가 됩니다.

4. /WebContent/index.jsp

<%@ page contentType="text/html; charset=UTF-8" %>

<html>

<head>

<script type='text/javascript' src='/SpringMVC_DWR/dwr/interface/hello.js'></script>

<script type='text/javascript' src='/SpringMVC_DWR/dwr/engine.js'></script>

<script type='text/javascript' src='/SpringMVC_DWR/dwr/util.js'></script>

<script type="text/javascript">

  hello.say("there!",

function(data){dwr.util.setValue("result", data)}

);

</script>

</head>

<body>

this is DWR Test Page.

<hr/>

<div id="result">result here</div>

</body>

</html>


<script type='text/javascript' src='/SpringMVC_DWR/dwr/interface/hello.js'></script>

<script type='text/javascript' src='/SpringMVC_DWR/dwr/engine.js'></script>

<script type='text/javascript' src='/SpringMVC_DWR/dwr/util.js'></script>

이 프로젝트의 실행경로의 최상위가 /SpringMVC_DWR/이고, web.xml에서 /dwr/*에서 온 요청을
처리하겠다고 세팅, 그리고 dispatcher-servlet에서 설정한 경로들을 참고하시면 위 경로를 이해하실수
있을겁니다.

<script type="text/javascript">

  hello.say("there!",

function(data){dwr.util.setValue("result", data)}

);

</script>


hello.java의 say("there")의 메서드를 실행한 결과를 뒤에 정의된 콜백함수에
적용합니다. say("there")의 실행결과를 data란 변수에 담아옵니다. 그리고
id가 result인 곳(여기선 result here라고 되있는 부분)에 data를 뿌려줍니다.
dwr.util.setValue("result", data)는 dwr.util에서 제공되는 함수로 자세한 내용은
DWR홈페이지를 참조하세요^^

실행결과입니다.
(http://localhost:8090/SpringMVC_DWR/)


참고로 자신이 설정한 dwr 스크립트들이 잘 설정되었는지 확인하려면 아래와 같이 http://localhost:(포트)/(DWR설정경로) 하시면 됩니다.


지금까지 작업한 프로젝트 구조입니다.