56. Eclipse Etc.../Eclipse2009. 1. 19. 11:03
반응형
지난 글을 통해 Eclipse 3.4 + WTP + Tomcat 5.5 를 이용한 간단한 개발 환경을 꾸려보았다. 이제 그 환경에 DWR이 가능하도록 수정해보자.

  일단 Eclipse 3.4 와 Tomcat에 대한 연동은 지난 글을 참조하기 바라며 바로 설치에 들어가보도록 하자.

1. 먼저 dwr.jar 를 다운 받아야 한다. 이 글을 쓰는 시점의 Stable Release 2.0.5 이다.(http://directwebremoting.org/dwr/download)

2. 2.0.5 버전에서는 추가적으로 Apache Common-Loggings 가 필요하다. 다운로드 받도록 하자.(http://commons.apache.org/downloads/download_logging.cgi)

3. 다운로드 받은 dwr.jar 와 다운로드 받은 common-loggings-version.jar(다운로드 받은 Zip 파일의 압축을 풀면 있다.)를 복사하여 해당 프로젝트(프로젝트명을 TestProject라 하자)의 /TestProject/WebContent/WEB-INF/lib 에 복사하도록 한다. 그리고 프로젝트 Root에서 F5 키를 누르면 프로젝트가 Refresh 되면서 해당 jar 파일들을 build path에 포함시키게 되며, 원래 없던 Web App Libraries 라는 디렉토리가 생성된다.


  4. 이제 /TestProject/WebContent/WEB-INF/web.xml 을 아래 내용을 추가한다.

	<servlet>
	  <servlet-name>dwr-invoker</servlet-name>
	  <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
	  <init-param>
	     <param-name>debug</param-name>
	     <param-value>true</param-value>
	  </init-param>
	</servlet>
	<servlet-mapping>
	  <servlet-name>dwr-invoker</servlet-name>
	  <url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>

  5. /TestProject/WebContent/WEB-INF/ 에 dwr.xml 이란 파일을 추가시키고 아래 내용을 입력한다.

<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
    "http://getahead.org/dwr/dwr20.dtd">
<dwr>
  <allow>
    <create creator="new" javascript="Hello">
      <param name="class" value="dwrtest.HelloName"/>
    </create>
  </allow>
</dwr>

  6. /TestProject/src 에서 오른쪽 클릭하고, New > Class 를 선택하여 새로운 클래스를 추가한다.
       - Package 에 dwrtest 라고 적어준다.
       - Name 에 HelloName 이라고 적어준다.
     그리고 Finish 버튼을 누른다.


  7. 그럼 perspective 가 아래 그림과 같이 될 것이다.


  8. HelloName.java 를 아래와 같이 작성한다.

package dwrtest;

public class HelloName {
	public String getHelloName(String name){
		if(name == null || name.trim().length() < 1){
			return "Hello~! John Doe.";
		}

		return "Hello~! " + name + ".";
	}

}

  9. /TestProject/WebContent/index.jsp 를 아래와 같이 수정한다.

<html>
<head>
<title>DWR Test</title>
<script type="text/javascript" src='http://localhost:8081/dwr/interface/Hello.js'></script>
<script type="text/javascript" src='http://localhost:8081/dwr/engine.js'></script>
<script type="text/javascript">
	function update() {
	  var name = document.getElementById("myname").value;
	  Hello.getHelloName(name, loadinfo);
	}

	function loadinfo(data) {
		document.getElementById("replytext").innerText = data;
	}
</script>
</head>
<body>
<p>
  Name:
  <input type="text" id="myname"/>
  <input value="Send" type="button" onclick="update()"/>
  <br/>
  Reply: <span id="replytext"></span>
</p>
</body>
</html>

  10. 이제 모든 준비가 끝났다. 서버를 Start(혹은 Restart) 시킨다. 웹브라우져를 띄우고, 주소창에 자신의 환경에 맞게 적절히 입력한다. 그럼 아래와 같은 모습이 나타날 것이다.


  11. Name 에 적당한 값을 입력하고 Send 버튼을 눌러보자. 그럼 아까 작성해둔 HelloName 클래스의 getHelloName() 메소드가 호출되어 넘어온 값이 Reply 부분에 표시될 것이다.


  어떻게 이러한 작동이 이루어지는지 살펴보도록 하자.

  먼저 web.xml 에 추가된 내용을 살펴보도록 하자.

	<servlet>
	  <servlet-name>dwr-invoker</servlet-name>
	  <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
	  <init-param>
	     <param-name>debug</param-name>
	     <param-value>true</param-value>
	  </init-param>
	</servlet>
	<servlet-mapping>
	  <servlet-name>dwr-invoker</servlet-name>
	  <url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>

  이는 uri 가 "/dwr/" 로 들어오는 것에 대한 모든 처리는 org.directwebremoting.servlet.DwrServlet 에서 하겠다는 의미이다. 이는 일반적인 Servlet이나 JSP 개발환경에서 이용 가능한 설정이다. DWR 은 일반적인 환경 이외에도 Struts 나 Spring 등 여러가지 Framwork 와도 연동이 가능하며 이때 사용되는 <servlet-class>의 값은 조금 다르다. 가령 Spring의 경우 <servlet-class> 값으로 org.directwebremoting.spring.DwrSpringServlet 가 들어간다. 이런 외부 Framework 와의 연동은 다음시간에 알아보도록 하겠다.

  다음으로 dwr.xml 에 대해 알아보도록 하자.

<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
    "http://getahead.org/dwr/dwr20.dtd">
<dwr>
  <allow>
    <create creator="new" javascript="Hello">
      <param name="class" value="dwrtest.HelloName"/>
    </create>
  </allow>
</dwr>

  dwr tag 는 가장 상위 tag 로 ROOT 역할을 한다. allow tag 는 DWR 클래스 를 생성(create)하고, 매핑(convert)하며 전역 필터(grobal filter)를 사용 가능하게 한다. - 여기서는 create 에 대해서만 설명하며, 다른부분에 대해서는 다음기회에 설명하도록 한다.

  create tag 는 실행을 하고자하는 클래스를 정의할때 사용한다. create tag 는 아래와 같은 형식으로 사용된다.

<create creator="..." javascript="..." scope="...">
     <param name="..." value="..."/>
     <auth method="..." role="..."/>
     <exclude method="..."/>
     <include method="..."/>
</create>

  위 형식중 대부분은 선택사항으로 꼭 필요한 부분은 creator 와 javascript 속성이다.
 
  예제에서 creator 속성에 설정된 "new" 라는 값은 클래스의 생성자를 사용하기 위한 값이다. 이 creator 속성은 default 생성자를 사용하여 클래스의 인스턴스를 생성한다. 이를 사용하면 매번 해당 클래스가 호출 될 때마다 인스턴스를 생성한다. - creator 에는 여러가지 설정 값이 존재하지만 이는 다음번에 dwr.xml 대한 상세 설명을 할때 하기로 하고, 여기서는 테스트로 사용한 new 에 대해서만 알아보자.

  javascript 속성은 생성된 인스턴스를 브라우져상에서 사용하기 위해 설정하는 id 값이라 보면 된다. 단, JavaScript 에 예약어로 등록되어 있는 단어들은 피하도록 해야 한다. 이 예제에서는 javascript 속성값으로 Hello 를 지정하였고, 앞서 소스에서 보았듯 index.jsp 에서 Hello 를 사용한다.

  param tag 는 위에서 creator 속성에 new 를 사용하므로서 생성하게될 클래스를 지정하게 된다. 즉, 원격 호출을 통해 사용하게될 클래스를 지정한다. 예제에서는 dwrtest.HelloName 이라는 클래스를 사용한다고 표기했다.

  include 와 exclude 는 해당 클래스의 메소드에 대한 접근성에 대한 설정으로, 이 예제에서 보듯 include와 exclude 를 지정하지 않으면 해당 클래스에 public으로 선언된 모든 메소드에 대한 접근이 가능하다. 하지만 include 를  사용하면 include 로 사용하겠다고 표시한 메소드만 접근가능하고, 나머지는 접근 할 수 없으며, 반다로 exclude 를 사용하면 exclude 로 표시한 메소드만 제외한 나머지 public 메소드에 대한 접근이 가능하다. auth 속성은 J2EE에서 role 을 통한 접근 제한시 사용된다.

  결론적으로 dwr.xml 에서의 정의를 통해 dwrtest.HelloName 란 클래스를 Hello 란 인스턴스명으로 접근하여 사용하겠다는 정의이다.

  dwrtest.HelloName 클래스에 대한 별도 설명은 안하도록 하겠다 소스에서 보듯 getHelloName 이란 메소드에서 간단히 넘겨받은 이름 앞에 Hello 란 String 을 붙여 넘기는 간단한 메소드를 포함한 클래스이다.

  그럼 이제 index.jsp 에 대해 알아보자.

<script type="text/javascript" src='http://localhost:8081/dwr/interface/Hello.js'></script>
<script type="text/javascript" src='http://localhost:8081/dwr/engine.js'></script>

  이 부분은 앞서 설정된 DWR의 연장으로 http://localhost:8081 은 현재 웹에 대한 URL 부분이며 /dwr 은 앞서 web.xml 통해 설정한 uri-pattern 이다. 
  
  engine.js 는 DWR을 사용하기 위한 기본 js 파일로 꼭 포함시켜야 하는 부분이며, 눈여겨 봐야할 부분은 /interface/Hello.js 이다. /interface/Hello 를 통해 앞서 dwr.xml 에 지정한 Hello 가 인스턴스명인 클래스를 사용한다는 의미이다. 즉, 이 부분이 포함되어야 JavaScript 상에서 Hello 를 통해 클래스의 메소드 호출이 가능해지게 된다.

<script type="text/javascript">
	function update() {
	  var name = document.getElementById("myname").value;
	  Hello.getHelloName(name, loadinfo);
	}

	function loadinfo(data) {
		document.getElementById("replytext").innerText = data;
	}
</script>
...
<p>
  Name:
  <input type="text" id="myname"/>
  <input value="Send" type="button" onclick="update()"/>
  <br/>
  Reply: <span id="replytext"></span>
</p>
 
  위에서 보듯 HTML 의 내용은 간단하다. myname 이란 text 에 이름을 적고 Send 버튼을 클릭하면 update()란 JavaScript 함수가 호출된다.

  update() 함수를 보면 해당 함수가 호출되면 myname의 값을 가져와 Hello 클래스의 getHelloName 이라는 메소드로 값을 넘기며 getHelloName 의 두번째 인자인 loadinfo 는 getHelloName 메소드 호출을 끝내고 리턴되는 값을 넘겨받을 함수인 콜백함수(Callback Function)의 이름이다.

  loadinfo() 함수는 getHelloName 메소드의 리턴값을 data라는 인자로 넘겨받아 replaytext 라는 곳에 표시한다.

  이로서 DWR의 Eclipse 를 이용한 설정 방법과 간단한 데모를 살펴 보았으며, 그에 대한 간단한 설명을 해보았다. DWR은 생각보다 간단한 설정으로 사용가능 함을 알 수 있었다.

  다음 시간에는 web.xml 과 dwr.xml 의 설정에 대한 세부사항을 알아보도록 하겠다.
Posted by 1010