Whiteship's Note

Spring + Ajax with DWR (Revolution)



이전 글의 예제 코드는 DWR을 그대로 사용했을 뿐, Spring은 사용하지 않았습니다. 다시말하면, Spring Container로 부터 bean을 가져온 것이 아니라, new라는 생성기를 사용하여 자바스크립트를 생성했습니다.

스프링 컨테이너가 관리하는 bean으로 자바스크립트를 생성하는 방법은 두 가지가 있습니다.
1. spring 생성기 사용하기.
2. 스프링 설정 파일에서 dwr 네임스페이스 사용하기.(스프링 2.0 이상에서 사용가능)

1. spring 생성기 사용하기.

dwr.xml을 다음과 같이 수정합니다.
new 생성기 대신 spring 생성기 사용하도록 수정.
class 송성 대신 beanName이라는 속성에 bean의 이름을 설정합니다.

<dwr>
    <allow>
        <convert converter="bean" match="whiteship.domain.Member" />
        <create creator="spring" javascript="MemberService">
            <param name="beanName" value="memberService" />
        </create>
    </allow>
</dwr>

그리고 Spring 설정 파일에 memberService라는 bean을 등록해야겠죠. 이 전 예제에서는 등록하지 않았었습니다.

    <bean id="memberService" class="whiteship.service.MemberServiceImpl" />

마지막으로 DWR이 스프링의 설정 파일을 알 수 있도록 설정해야 하는데, 기본으로 ContextLoaderListener를 통해 읽어오려고 합니다. 따라서 web.xml에 다음과 같이 설정되어 있다면, dwr.xml에 별도로 설정해 주지 않아도 됩니다.

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/**Context.xml</param-value>
    </context-param>

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



2. 스프링 설정 파일에서 dwr 네임스페이스 사용하기.

이번에는 dwr.xml 파일 처럼 별도의 DWR 파일을 사용하지 않고, 스프링 설정 파일로만, DWR로 사용할 bean을 지정해 주는 방벙입니다.

먼저, web.xml에서 등록했던 DwrServlet을 DwrSpringServlet으로 변경합니다.(이제 dwr.xml은 삭제해도 됩니다.)
그럼 다음, 스프링 설정 파일에 dwr 네임스페이스를 추가합니다.
마지막으로, 자바스크립트로 노출시킬 bean 내부에 <dwr:remote> 엘리먼트를 사용하여 설정합니다. 그리고 기본 타입이 아닌 데이터를 변환하기 위해 사용했던 convertor를 등록합니다.

    <servlet>
        <servlet-name>dwr</servlet-name>
        <servlet-class>
            org.directwebremoting.spring.DwrSpringServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>

<?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:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:lang="http://www.springframework.org/schema/lang"
    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.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd
http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd"
    default-autowire="byName">

    <bean id="memberService" class="whiteship.service.MemberServiceImpl">
        <dwr:remote javascript="MemberService" />
    </bean>

    <dwr:configuration>
        <dwr:convert type="bean" class="whiteship.domain.Member" />
    </dwr:configuration>

</beans>


클라이언트 코드는 수정할 것이 없습니다.

이렇게 하면, 스프링의 DI와 AOP를 적용한 자바 객체를 자바스크립트 형태로 변환해주고(DWR이), 이것을 클라이언트 자바스크립트에서 호출할 수 있게 됩니다.

2007/11/08 - [Spring In Action/16. Integrating with other web frameworks] - Spring + Ajax with DWR (Coding)
2007/11/08 - [Spring In Action/16. Integrating with other web frameworks] - Spring + Ajax with DWR


top

  1. 굴돌 2008.03.02 23:49 PERM. MOD/DEL REPLY

    생각보다 간단하군요!
    좋은자료 고맙습니다. :)
    링크 퍼갈께요~

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.03.03 12:20 PERM MOD/DEL

    넹. :)

  2. 초보 2008.03.11 18:02 PERM. MOD/DEL REPLY

    여기 예제를 보고 따라보았는데요..

    1번째 Spring+DWR 은 에러는 안나는데 URL 에서 /dwr 확인시 .js 가 생성이 안되어 정상적으로
    실행을 해볼수 없었구요.
    2, 3 번 소스 다운받아 해보았는데 제대로 안되네요.. tomcat 뜰때 에러 뜨네요..경로 문제인지.
    경로 문제면 1번할때도 문제가 생겨야 하는데..2,3번은 톰캣 구동시 오류가 나서 볼수조차 없구요.
    무엇이 문제인지 모르겠네요.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.03.11 18:10 PERM MOD/DEL

    흠.. /dwr에 js는 런타임 시에 DwrServlet이 동적으로 생성해 줍니다. 만약.. 그게 생성이 안되었다면.. 무언가 설정이 잘 못 되었을텐데요.

    예제 코드를 실행해보시려면요. Run As Server 메뉴를 클릭하구요. Manually define a new server를 선택하신 다음에 돌려보세요.

    전 방금 확인해봤더니.. 잘 돌아가는데요.. 훔;;

  3. 초보 2008.03.11 19:05 PERM. MOD/DEL REPLY

    이거 어제부터 2틀재 돌려보는중인데요..방금 리플 달아주셨네요..
    원인을 알아보니..
    springContext.xml 에서

    <bean id="memberService"
    class="whiteship.service.MemberServiceImpl">
    <dwr:remote javascript="MemberService"/>
    </bean>

    이 부분만 들어가면 tomcat 로그에
    심각: Error listenerStart
    2008. 3. 11 오후 6:57:17 org.apache.catalina.core.StandardContext start
    심각: Context [/SpringAjax3] startup failed due to previous errors

    이렇게 찍히면서 안되네요..
    경로 문제일까요??
    참고로 저는 톰캣5.5 를 따로 두고 ant로 빌드로 톰캣에 war로 넣어줍니다.. 혹시 이거 때문에..

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.03.11 23:02 신고 PERM MOD/DEL

    에러로그 전부를 제 이메일로 보내주세요.

    저는 이클리스에서만 실행시켜봤지, WAR로 묶어서 배포해보진 않아서 어떤 상황인지 예측이 안 되네요.

    아마도 배포 문제인듯 싶은데요. 로그에 보니까 previous errors 때문에 톰캣을 못 띄웠다고 되어 있는데.. 에러 로그를 전부 보고 싶습니다. :)

  4. 초보 2008.03.12 08:56 PERM. MOD/DEL REPLY

    에러 내용은 제가 올렸던 저 내용이 전부입니다. 톰캣 구동시 카탈리라 로그에서 이 로그만 뿌려주고는
    해당 웹app가 뜨지 않습니다.

    에러내용

    2008. 3. 11 오후 7:11:38 org.apache.catalina.core.StandardContext start
    심각: Error listenerStart
    2008. 3. 11 오후 7:11:38 org.apache.catalina.core.StandardContext start
    심각: Context [/SpringAjax3] startup failed due to previous errors

    위와 같은 문제로 struts + Spring 연결 설정시에도 한번 났었는데...web.xml 에서 경로패스가
    조금 틀려서 그렇더군요..
    이번에도 그런듯싶어 경로를 이것저것 수정해보았는데...

    결론은

    <bean id="memberService"
    class="whiteship.service.MemberServiceImpl">
    <dwr:remote javascript="MemberService"/>
    </bean>

    web.xml 에서 이 부분만 만나면 에러를 떨어뜨립니다.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.03.12 10:52 PERM MOD/DEL

    저는 잘 돌아가는데요;;

    의심스러워 하시는 부분에는 전~혀 문제가 없습니다. 그냥 일반적인 스프링 설정일 뿐입니다.

    그냥 이클립스에서 돌려보시죠; 이클립스 프로젝트를 그냥 압축한거니까 이클립스에선 잘 돌아갈겁니다. ^^;;

  5. 꿀냥 2011.08.25 20:37 PERM. MOD/DEL REPLY

    질문이 있습니다.

    DWR 관련하여 프로젝트를 만들고
    압축파일을 복사 했습니다..

    화면까지는 나오는데
    텍스트 입력창에 글을 쓰기만 하면

    session error라고 경고 창이 뜨네요..
    세션 설정은 안보이는거 같은데요...

    이상하네요;;

  6. 따뜻한호빵 2012.02.01 11:20 PERM. MOD/DEL REPLY

    꿀냥님. web.xml 에서 dwr servlet 설정에서

    <init-param>
    <param-name>crossDomainSessionSecurity</param-name>
    <param-value>false</param-value>
    </init-param>

    추가하시면 될 거 같네요.

Write a comment.