[ETC] Xdoclet 사용하기 1부

황제낙엽 2006.10.04 23:30 조회 수 : 45 추천:78

site_link1  
site_link2  
site_link3  
http://xdoclet.sourceforge.nethttp://wiki.javajigi.net/display/IDE/Getting+Started+Xdoclet

Xdoclet 사용하기

Summary : 웹 애플리케이션의 구조가 점점 복잡해지면서 하나의 웹 애플리케이션을 개발하기 위하여 관리해야하는 Descriptor파일들(web.xml, taglib files, ejb-jar.xml등)이 점차 많아지고 있다. 또한 개발되는 애플리케이션에서 다른 프레임워크을 추가하는 경우라면 이 수는 더욱 증가하게 된다. 스트럿츠를 이용하기 위해서도 struts-config.xml을 따로 관리해주어야 한다. Xdoclet을 이용하여 수 많은 Descriptor파일과 소스파일 사이의 동시성을 유지하도록하는 방법에 대하여 살펴본다.

예제 실행 방법

스트럿츠의 세부 항목을 살펴보기에 앞서 이 장의 Xdoclet예제를 먼저 실행해보는 것이 이 장을 이해하는데 많은 도움이 될 것이다. 따라서 이 장의 예제를 실행하는 방법에 대하여 살펴보도록 하겠다. 3장 예제의 디렉토리 구조를 살펴보면 다음과 같다.

3장 예제를 실행하기 위한 과정을 살펴보면 다음과 같다. Tomcat, ANT의 설치에 관한 자세한 내용은 부록 1을 참조하기 바란다. 다음 설명은Tomcat, ANT가 설치되어 있다는 가정하에 설명을 진행하도록 하겠다.

3장의 Xdoclet예제를 빌드하는 방법은 간단하다. 이 장에서 개발한 Xdoclet예제는 servlet, taglib, struts 3가지 설정파일을 자동생성하는 방법에 대하여 살펴보았다. 따라서 3가지 예제를 각각 실행해 보기 위하여 빌드 또한 3가지 방법으로 할 수 있도록 구현하였다. 따라서 빌드하는 과정을 3가지 방법으로 살펴보도록 하겠다.

Servlet - web.xml

  • 1) web.xml파일을 자동 생성하기 위한 예제를 보기 위해서는 프롬프트에서 chapter3로 이동한 다음 'ant servlet' 명령어를 실행하여 servlet 예제를 빌드한다. 빌드하기 전에는 web.xml파일이 없었지만 빌드 후 web.xml이 자동 생성된 것을 확인할 수 있다.
  • 2) 빌드가 정상적으로 진행되면 chapter3 디렉토리 하위에 dist라는 디렉토리가 생성되면서 chapter3.war파일이 생성된다.
  • 3) 만약 시스템 환경 변수에 CATALINA_HOME 이 설정되어 있다면 CATALINA_HOME/webapps 디렉토리에 chapter3.war파일이 자동으로 디플로이 된다. 시스템 환경 변수에 CATALINA_HOME이 설정되어 있지 않다면 chapter3/dist디렉토리 아래의 chapter1.war파일을 CATALINA_HOME/webapps 에 복사한다.
  • 4) Tomcat서버를 시작한 후 다음 URL로 접근하여 예제를 테스트할 수 있다.

http://localhost:8080/chapter3/HelloWorldServlet

http://localhost:8080/chapter3/HelloWorld

http://localhost:8080/chapter3/hi.HelloWorld

  • 5) 자세한 테스트 방법 및 설명은 2.3절의 본문을 참조하기 바란다.

Taglib - *.tld

  • 1) 커스텀 태그 설정파일인 tld파일을 자동 생성하기 위한 예제를 보기 위해서는 프롬프트에서 chapter3로 이동한 다음 “ant taglib” 명령어를 실행하여 taglib 예제를 빌드한다. 빌드하기 전에는 mytaglib.tld파일이 없었지만 빌드 후 mytaglib.tld이 자동 생성된 것을 확인할 수 있다.
  • 2) 빌드가 정상적으로 진행되면 chapter3 디렉토리 하위에 dist라는 디렉토리가 생성되면서 chapter3.war파일이 생성된다.
  • 3) 만약 시스템 환경 변수에 CATALINA_HOME 이 설정되어 있다면 CATALINA_HOME/webapps 디렉토리에 chapter3.war파일이 자동으로 디플로이 된다. 시스템 환경 변수에 CATALINA_HOME이 설정되어 있지 않다면 chapter3/dist디렉토리 아래의 chapter3.war파일을 CATALINA_HOME/webapps 에 복사한다.
  • 4) Tomcat서버를 시작한 다음 http://localhost:8080/chapter3/helloworld.jsp URL로 접근하여 taglib 예제를 테스트할 수 있다. 자세한 테스트 방법 및 설명은 2.3절의 본문을 참조하기 바란다.

Struts - struts-config.xml

  • 1) 스트럿츠 설정파일인 struts-config.xml을 자동 생성하기 위한 예제를 보기 위해서는 프롬프트에서 chapter3로 이동한 다음 “ant struts” 명령어를 실행하여 struts 예제를 빌드한다. 빌드하기 전에는 struts-config.xml파일이 없었지만 빌드 후 struts-config.xml이 자동 생성된 것을 확인할 수 있다.
  • 2) 빌드가 정상적으로 진행되면 chapter3 디렉토리 하위에 dist라는 디렉토리가 생성되면서 chapter3.war파일이 생성된다.
  • 3) 만약 시스템 환경 변수에 CATALINA_HOME 이 설정되어 있다면 CATALINA_HOME/webapps 디렉토리에 chapter3.war파일이 자동으로 디플로이 된다. 시스템 환경 변수에 CATALINA_HOME이 설정되어 있지 않다면 chapter3/dist디렉토리 아래의 chapter3.war파일을 CATALINA_HOME/webapps 에 복사한다.
  • 4) Tomcat서버를 시작한 다음 http://localhost:8080/chapter3/user_write.jsp URL로 접근하여 struts 예제를 테스트할 수 있다. 자세한 테스트 방법 및 설명은 2.3절의 본문을 참조하기 바란다.

기타

  • 1) 웹 애플리케이션 기본 디렉토리 구조로 생성된 예제는 chapter3/build 디렉토리에 생성된다. 따라서 [그림 3-1]의 디렉토리 구조가 생소한 독자들은 빌드를 실행한 다음 chapter3/build 디렉토리를 참조하면 쉽게 이해할 수 있다.
  • 2) 각각의 개발 방법으로 새로 빌드하면 이전에 빌드한 디렉토리 내용은 삭제된다. 따라서 servlet 예제 소스만을 보고 싶다면 “ant servlet”으로 빌드한 다음 chapter3/build 디렉토리를 보면 된다. taglib, struts 예제 또한 동일한 방법으로 빌드 및 테스트할 수 있다.

빌드시 주의할 점과 궁금한 점.

  • 1) 처음 빌드할 때는 상관없지만 한번 빌드한 예제의 소스를 수정한 다음 다시 빌드하고자 할 때는 Tomcat서버를 멈춘 상태에서 해야한다. 이유는 Tomcat서버가 시작된 상태일 경우 이전에 디플로이했던 디렉토리가 삭제되지 않는 문제가 발생해 빌드가 실패하는 경우가 발생하기 때문이다. 따라서 빌드는 항상 Tomcat서버가 멈춘 상태에서 실시해야 한다.
  • 2) [그림 3-1]을 보면 WEB-INF디렉토리와 컴파일된 class파일이 없는 것을 볼 수 있다. 또한 독자들이 첨부된 CD의 예제소스를 보면 web.xml, struts-config.xml, mytaglib.tld 파일들이 보이지 않는다. 이 파일들은 ANT로 빌드하면 자동생성되기 때문에 빌드를 실행한 다음 chapter3/build/WEB-INF 디렉토리에서 찾을 수 있다. 따라서 예제 소스에 보면 web.xml, struts-config.xml, mytaglib 파일들이 없다고 의아해할 필요는 없다.
  • 3) 모델 2나 스트럿츠를 기반으로한 애플리케이션을 개발하기 위해서는 기존의 모델1에 추가적으로 설정해야하는 정보가 있다. 그러나 이 장의 예제는 ANT로 빌드시 자동적으로 설정되기 때문에 추가적인 설정이 필요없다.
  • 4) 예제 소스를 독자들이 수정해보고 싶다면 src디렉토리의 예제 소스나 JSP파일을 수정한 다음 새로 빌드하면 자동 컴파일 및 war로 압축되기 때문에 독자들이 수정한 예제를 테스트해볼 수 있다.

*2. Ant와 Xdoclet을 이용한 개발 방법*

웹 애플리케이션의 구조가 점점 복잡해지면서 하나의 웹 애플리케이션을 개발하기 위하여 관리해야하는
Descriptor파일들(web.xml, taglib files, ejb-jar.xml등)이 점차 많아지고 있다.
또한 개발되는 애플리케이션에서 다른 프레임워크을 추가하는 경우라면 이 수는 더욱 증가하게 된다. 스트럿츠를
이용하기 위해서도 struts-config.xml을 따로 관리해주어야 한다.

웹 애플리케이션의 규모가
커지면 커질수록 이 같이 관리해야하는 Descriptor파일은 무수히 많아진다. 따라서 개발되고 있는 소스가
수정되면 Descriptor파일과 소스파일간의 동시성(synchronization)을 일치시키기 위하여 많은
시간을 할애해야한다.

특히 EJB를 기반으로 개발하는 웹 애플리케이션의 경우 관리해야하는
Descriptor파일의 수는 2배이상 증가하게 된다. EJB같은 경우 EJB를 지원하는 벤더에 따라
Descriptor파일이 달라지기 때문에 이에 따른 동시성을 유지하는 것 또한 상당히 많은 시간을 요구한다. 또한
EJB를 기반으로 개발할 경우 하나의 컴포넌트를 개발하기 위하여 7개 이상의 많은 파일을 추가로 개발해주어야한다.
EJB에 새로운 인터페이스가 추가될 경우 더불어 변경해주어야 하는 파일의 수 또한 많다. EJB를 기반으로 개발을
해본 개발자들이라면 Descriptor파일과 소스파일사이의 동시성을 유지하는데 얼마나 많은 시간이 소요되는지 느낄
것이다.

Xdoclet은 점점 더 복잡해지고, 수 많은 Descriptor파일과 소스파일
사이의 동시성을 유지하도록 하는 코드 생성 엔진이다. Xdoclet은 자바로 웹 애플리케이션을 개발할 경우
Attribute Oriented Programming(이하 AOP, Aspect Oriented
Programming이 아니다.)이 가능하도록 한다. 자바 소스코드에서 JavaDoc 태그를 이용하여
JavaDoc을 생성해본 개발해본 개발자라면 Xdoclet의 AOP개발 방식에 대하여 쉽게 이해할 수 있다.
JavaDoc을 생성하는 방식을 보면 자바소스의 주석 내에 JavaDoc 태그를 이용하여 JavaDoc문서를
자동으로 생성할 수 있다. Xdoclet 또한 각 컴포넌트별로 정의된 태그를 자바 소스에 사용함으로 인해 자바소스
및 Descriptor파일을 자동으로 생성할 수 있는 방식이다. 따라서 자바 소스코드가 수정될 경우
Descriptor파일을 수정할 필요가 없어진다. 소스코드 하나만 관리하면 되기 때문에 상당한 개발시간의
단축효과를 볼 수 있으며, 자바소스와 Descriptor파일의 동시성 또한 유지할 수 있다.

Xdoclet 사이트에서는 Xdoclet을 사용할 경우 다음과 같은 이득을 얻을 수 있다고 주장한다.

  • 1. 소스코드가 변경될 때마다 Descriptor파일을 걱정할 필요없다. Descriptor파일은 소스가
    변경될 때마다 계속해서 새로 생성된다.
  • 2. 특히 EJB를 기반으로 개발할 경우 하나의 컴포넌트를 개발하기 위하여 7개 또는 그 이상의 파일을
    개발해야 한다. 그러나 Xdoclet을 사용할 경우 하나의 소스코드만 생성하면 된다. 나머지 소스파일 및
    Descriptor파일은 Xdoclet이 자동생성해준다.
  • 3. Xdoclet을 이용할 경우 개발시간을 상당히 단축시킬 수 있다. 개발자들은 단지 비지니스 로직에만
    전념할 수 있다.
    글로만 Xdoclet의 놀라운 점을 설명하는데는 한계가 있다. Xdoclet을 이용하여 web.xml,
    struts-config.xml을 자동생성하는 예제를 보면 Xdoclet의 매력에 흠뻑 빠질 것이다. 아직
    Xdoclet이 뭔지 모르겠다고 조급해하지마라. 계속되는 예제를 통해 Xdoclet에 대하여 이해할 수 있을
    것이다.

Xdoclet의 진정한 장점은 EJB를 개발할 때 발휘된다. 그러나 스트럿츠 프레임워크도 많은
소스파일과 struts-config.xml의 동시성을 유지해야하는 만큼 Xdoclet의 장점을 피부로 느낄 수
있을 것이다. 이 책의 모든 예제는 Xdoclet 기반위에서 개발할 것이다. 스트럿츠 프레임워크를 이용하여
개발해본 개발자들이라면 자바 소스파일과 struts-config.xml의 동시성을 유지하는 것이 얼마나 어려운지
알 것이다. 특히 여러명의 개발자들이 프로젝트를 진행할 때 동시성을 유지하기란 더 어렵다. Xdoclet을
이용하여 비지니스 로직을 개발하는 것 이외에 발생했던 많은 시간을 단축할 수 있기 바란다.

*2.1 Xdoclet 설치*

Xdoclet으로 web.xml, ejb-jar.xml, struts-config.xml등의
Descriptor파일을 자동으로 생성하기 위해서는 먼저 ANT가 설치되어 있어야 한다. ANT의 설치 및
사용법은 부록을 참조하기 바란다.

Xdoclet은
http://xdoclet.sourceforge.net에서 오픈소스로 개발되고 있기 때문에 무료로 사용이
가능하다. 2003년 8월 현재 최신 버전은 1.2.0 베타3상태이다. 이 책에서는 1.2.0 베타3
버전을 이용하여 개발하도록 하겠다. Xdoclet을 설치하는 과정은 다음과 같다.

에서 Xdoclet 1.2.0 베타3 버전을 다운받는다.

  • 2. 다운받은 파일을 개발자들이 원하는 위치에 압축을 푼다.
  • 3. Xdoclet을 사용하기 위하여 필요한 모든 Jar파일들은 Xdoclet압축을 푼 디렉토리
    아래의 lib에 위치해 있다. 모든 Jar파일들을 웹 애플리케이션의 라이브러리를 관리하는 디렉토리에
    복사한다.
    이상으로 Xdoclet을 사용할 모든 준비가 완료되었다. 다음은 ANT를 이용하여 자바 소스에 생성한 각
    컴포넌트별 태그를 이용하여 Descriptor파일을 자동적으로 생성하면 된다.

이 책의
모든 예제는 이미 Xdoclet이 설치되어 있는 상태이기 때문에 추가적으로 설치할 jar파일은 없다.
Xdoclet관련 패키지는 각 장 예제의 lib디렉토리 하위의 xdoclet 디렉토리(1,2장은
lib/main/xdoclet)에 위치해 있다. 만약 Xdoclet을 이용하는 새로운 애플리케이션을 개발할
경우 위 설치과정에 따라 Xdoclet을 설치하면 된다.

*2.2 Xdoclet 예제*

Xdoclet예제는 보여주기 위하여 먼저 서블릿예제를 먼저 보도록 하자. 서블릿을 생성한 다음 웹
애플리케이션에서 사용하기 위하여 web.xml에 매핑해주어야 한다. 스트럿츠 또한 서블릿을 사용하고
있으며, web.xml에서 설정이 필요하기 때문에 서블릿예제를 먼저 살펴보는 좋다고 생각한다. 다음은
Xdoclet의 다양한 예제를 살펴보기 위하여 커스텀 태그 예제를 살펴보도록 하겠다. 하나의 커스텀 태그를
만들기 위해서는 tld파일을 생성할 필요가 있다. 개발을 진행하는 중 커스텀 태그에 애트리뷰트가 하나
추가될 때마다 tld파일을 수정해 주어야 하는 불편함이 있다. Xdoclet을 이용하여 이 같은 단계를
줄일 수 있는 방법에 대하여 살펴보도록 하겠다.

마지막 예제로 스트럿츠 프레임워크를 이용하여 웹
애플리케이션을 Xdoclet을 이용하여 개발하는 과정에 대하여 살펴보도록 하겠다. 스트럿츠 프레임워크의
경우에 하나의 요청을 처리하기 위하여 Action, Form, Exception 정보들을
struts-config.xml에서 관리해야 한다. Xdoclet을 이용하여 수많은 클래스들과
struts-config.xml의 동시성을 유지하는 방법에 대하여 알아보겠다.

*2.2.1 서블릿 예제*

자바로 웹 애플리케이션을 개발해본 개발자들이라면 web.xml이 웹 애플리케이션의 배치
Descriptor파일이라는 것을 알 것이다. 서블릿을 하나 추가한 다음 웹 애플리케이션에서
사용하기 위해서 web.xml에서 매핑을 추가한다. 그러나 Xdoclet을 이용하면 web.xml에
추가하지 않아도 된다. 개발자는 web.xml에 추가하고자하는 정보를 단지 서블릿에서 정해진 태그를
이용하여 추가하면 된다.

package net.javajigi.chapter3.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @web.servlet name="HelloWorldServlet" 
 * 				display-name="HelloWorld Servlet" 
 * 
 * @web.servlet-init-param 	name="name" 
 * 							value="${hello.servlet.name}"
 * 
 * @web.servlet-mapping url-pattern="/HelloWorld/*"
 * @web.servlet-mapping url-pattern="*.HelloWorld"
 * @web.servlet-mapping url-pattern="/HelloWorldServlet"
 */
public class HelloWorldServlet extends HttpServlet {

	protected void doGet(
		HttpServletRequest request,
		HttpServletResponse response)
		throws ServletException, IOException {
		process(request, response);
	}

	protected void doPost(
		HttpServletRequest request,
		HttpServletResponse response)
		throws ServletException, IOException {
		process(request, response);
	}

	protected void process(
		HttpServletRequest request,
		HttpServletResponse response)
		throws ServletException, IOException {
		ServletConfig config = this.getServletConfig();
		String name = config.getInitParameter("name");

		response.setContentType("text/html");
		java.io.PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>HelloWorld Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>Hih2. " + name + ". Hello Worldh2.</h1>");
		out.println("</body>");
		out.println("</html>");
		out.close();
	}
}

[예제 3-1]HelloWorldServlet.java

[예제 3-1]
Xdoclet의 webdoclet ANT Task를 실행시키면 [예제 3-2]와 같은
web.xml이 생성된다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 	"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app >
	...
	<distributable/>
	<servlet>
		<servlet-name>HelloWorldServlet</servlet-name>
		<display-name>HelloWorld Servlet</display-name>
		<servlet-class> 
			net.javajigi.chapter3.servlet.HelloWorldServlet</servlet-class>
		<init-param>
			<param-name>name</param-name>
			<param-value>JavaJiGi</param-value>
		</init-param>
	</servlet>
	...
	<servlet-mapping>
		<servlet-name>HelloWorldServlet</servlet-name>
		<url-pattern>/HelloWorld/*</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>HelloWorldServlet</servlet-name>
		<url-pattern>*.HelloWorld</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>HelloWorldServlet</servlet-name>
		<url-pattern>/HelloWorldServlet</url-pattern>
	</servlet-mapping>
	...
</web-app>

[예제 3-2]web.xml

다음은 [예제 3-2]와 같은 결과가 어떻게
생성되는지 단계적으로 자세하게 살펴보도록 하겠다. [예제 3-2]와 같은 결과를 얻기 위해서는 먼저
서블릿을 작성할 때 Xdoclet태그를 작성해주어야 한다. Xdoclet태그를 이용하여 작성된
서블릿을 ANT로 빌드하여 web.xml을 자동으로 생성할 수 있다.

*2.2.1.1 단계 1 : 서블릿 엘리먼트를 정의하는 방법*

Xdoclet을 이용하여 web.xml에 서블릿을 자동으로 매핑하기 위해서는 먼저
JavaDoc 태그를 작성하듯이 클래스 레벨에서 다음과 같이 작성해야 한다.

/**
 * @web.servlet name="HelloWorldServlet" 
 * 	 	display-name="HelloWorld Servlet" 
 …
 */

public class HelloWorldServlet extends HttpServlet {

위와 같이 작성된 태그에 의하여 생성되는 web.xml은 다음과 같다.

<servlet>
      <servlet-name>HelloWorldServlet</servlet-name>
      <display-name>HelloWorld Servlet</display-name>
      <servlet-class>net.javajigi.chapter3.servlet.HelloWorldServlet</servlet-class>
…
</servlet>

생성된 web.xml을 보고 '>servlet-class/<는 어떻게 알 수 있을까?'라고
의문을 가지는 개발자들이 있을 것이다. Xdoclet도 JavaDoc API를 생성하는
과정과 같은 방법으로 생성되기 때문에 소스코드의 패키지 이름을 포함한 클래스 정보를 얻을 수
있다. JavaDoc API를 생성할 때 자바 소스코드의 패키지명 및 클래스이름과 같은
정보를 같이 제공하지 않아도 자동적으로 생성되는 과정을 보면 쉽게 이해할 수 있을
것이다.

*2.2.1.2 단계 2 : 서블릿 초기 인자를 정의하는 방법*

서블릿을 개발하다보면 서블릿에 초기 인자를 전달해야 하는 경우가 발생한다. web.xml에서
초기 인자를 전달할 수 있도록 작성하는 방법은 다음과 같다.

  • @web.servlet-init-param name="name"

  • value="$

    Unknown macro: {hello.servlet.name}

    "

    위 태그는
    web.xml에서 >init-param/<태그를 생성한다.

    <init-param>
             <param-name>name</param-name>
             <param-value>JavaJiGi</param-value>
    </init-param>

    생성된 web.xml을 보면 web.servlet-init-param에서 작성된 내용이
    >init-param/<에 반영된 것을 확인할 수 있다. 궁금한 부분은
    >param-value/<의 값이 Xdoclet 태그에서는
    $

    와 같이 작성되었는데 web.xml에서는
    JavaJiGi로 바뀌어 생성된 것이다. 이는 ANT를 이용하여 빌드하면서
    hello.servlet.name이름을 가지는 변수의 값으로 대체하라는 것이다. ANT에서
    정의한 hello.servlet.name는 다음과 같다.

#HelloWorldServlet에서 참조하고 있음. 원하는 값으로 수정할 수
있다.

hello.servlet.name=JavaJiGi

*2.2.1.3 단계 3 : 서블릿 매핑을 정의하는 방법*

마지막으로 추가된 서블릿을 사용하기 위해서는 서블릿 매핑이 필요하다. 서블릿 매핑에 대해서는
굳이 설명하지 않아도 알 것이라 생각한다. Xdoclet태그를 이용하여 서블릿 매핑을 하는
방법은 다음과 같다.

  • @web.servlet-mapping
    url-pattern="/HelloWorld/*"
  • @web.servlet-mapping
    url-pattern="*.HelloWorld"

  • @web.servlet-mapping
    url-pattern="/HelloWorldServlet"

위 태그는
web.xml에서 >servlet-mapping/<태그를 자동적으로 생성한다.

<servlet-mapping>
      <servlet-name>HelloWorldServlet</servlet-name>
      <url-pattern>/HelloWorld/*</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
      <servlet-name>HelloWorldServlet</servlet-name>
      <url-pattern>*.HelloWorld</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
      <servlet-name>HelloWorldServlet</servlet-name>
      <url-pattern>/HelloWorldServlet</url-pattern>
</servlet-mapping>

web.xml의 서블릿 매핑 정보는 web.servlet-mapping태그를 이용하여
자동생성한다. web.servlet-mapping태그를 이용하여 URL 패턴만 설정해주면
자동으로 서블릿 이름을 찾아 >servlet-mapping/<태그를 완성한다.

2.2.1.4 단계 4 : ANT 빌드를 통하여 web.xml생성하기

단계 3까지의 과정으로 서블릿을 작성했다면 마지막 과정을 ANT를 이용하여 빌드함으로서
web.xml을 생성하는 과정이 남아 있다. web.xml을 생성하기 위하여 Xdoclet의
webdoclet Task를 이용해야 한다.(Task에 대한 자세한 내용은 부록을 참조하기
바란다.) Ant 빌드 파일의 >taskdef/<태그에 다음과 같이 설정함으로서
webdoclet Task를 이용할 수 있다.

<taskdef name="webdoclet"
               classname="xdoclet.modules.web.WebDocletTask" 
               classpathref="xdoclet.class.path"
 />

Xdoclet의 Task들은 ANT에서 이미 정의 되어 있는 Task가 아니기 때문에 위와
같이 정의함으로서 webdoclet Task를 사용할 수 있다.
xdoclet.modules.web.WebDocletTask는 앞에서 설치한 Xdoclet의
lib내의 jar파일에 있기 때문에 Xdoclet의 jar파일을 참조할 수 있도록
클래스패스를 정의하고 있다.

ANT에서 webdoclet을 이용하여 web.xml을
생성하는 Target을 보면 다음과 같다.

<target name="generateDD" depends="init">
      <taskdef name="webdoclet"
               classname="xdoclet.modules.web.WebDocletTask" 
               classpathref="xdoclet.class.path"
      />

      <webdoclet destdir="${build.dir}">
         <fileset dir="${src.dir}">
            <include name="**/*Servlet.java" /> 
<include name="**/*Filter.java" />
         </fileset>

         <deploymentdescriptor servletspec="2.3" 
         			  destdir="${build.dir}/WEB-INF" >
         </deploymentdescriptor>
      </webdoclet>
</target>

web.xml은 최종적으로 >webdoclet/<태그의
>deploymentdescriptor/<태그에 의하여 자동적으로 생성된다.
생성되는 web.xml의 내용은 소스디렉토리내의 Servlet으로로 끝나는 소스코드의 내용에
따라 결정되게 되는 것이다. 이 절의 서블릿예제에서 작성된 서블릿은
HelloWorldServlet하나이기 때문에 HelloWorldServlet의 내용만이
web.xml로 자동생성된다.

web.xml이 생성되는 과정을 확인해
보자. 책에서 제공하는 chapter3디렉토리를 보면 WEB-INF디렉토리가 없는 것을 볼
수 있다. 앞에서 war파일을 생성한 것처럼 “ant servlet”을 하면
chapter3.war파일이 생성되면서 자동 디플로이된다. 디플로이된
chapter3.war파일에는 web.xml이 생성되어 있는 것을 확인할 수 있다.
chapter3/build디렉토리를 보아도 WEB-INF가 생성되어 있으며,
WEB-INF디렉토리 아래에 web.xml이 자동 생성되어 있는 것을 확인할 수 있다. 자동
생성된 web.xml의 내용은 [예제 3-2]와 같다는 것을 확인할 수 있다. Tomcat
서버를 시작하여 다음 URL로 접근해보면 web.xml이 제대로 생성되었는지를 테스트할 수
있다.

http://localhost:8080/chapter3/HelloWorldServlet

http://localhost:8080/chapter3/HelloWorld

http://localhost:8080/chapter3/hi.HelloWorld

위 세개의 URL모두 다음과 같은 결과를 얻을 수 있을 것이다.

[그림 3-10] HelloWorldServlet을 실행한 결과

web.xml을 생성하기 위한 Xdoclet태그에 대해 더 자세한 정보는
http://xdoclet.sourceforge.net/tags/web-tags.html

를 참조하기 바란다.

*2.2.2 커스텀 태그 예제*

커스텀 태그 하나를 생성하기 위해서는 커스텀 태그 클래스를 먼저 작성해야 한다. 그 다음 생성된 커스텀 태그 정보를 가지는 tld파일을 생성해야 한다. tld파일에서 가장 많이 수정되는 부분은 커스텀 태그에 애트리뷰트가 추가, 수정, 삭제될 때이다. 개발하고 있는 웹 애플리케이션에서 많은 수의 커스텀 태그를 개발한다면 이 또한 상당한 작업 시간으로 요한다. 개발자사이에 tld파일의 동시성을 유지하는 것 또한 쉽지 않다. 따라서 커스텀 태그 tld파일을 Xdoclet을 이용하여 생성하는 과정에 대하여 살펴보도록 하겠다.

package net.javajigi.chapter3.taglib;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * @jsp.tag name="helloWorld"
 */
public class HelloWorldTag extends TagSupport {
	private String name = null;

	public int doStartTag() throws JspException {
		try {
			JspWriter out = pageContext.getOut();

			out.println("Hih2. " + name + ". Hello Worldh2.");
		} catch (IOException e) {
			throw new JspException(e.getMessage());
		}

		return SKIP_BODY;
	}

	/**
	 * @jsp.attribute	required="true" 
	 *                  rtexprvalue="true"
	 *                  description="User Name"
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param string 
	 */
	public void setName(String name) {
		this.name = name;
	}

}

[예제 3-3]HelloWorldTag.java

[예제 3-3]의 커스텀 태그
예제를 Xdoclet을 이용하여 생성된 tld파일은 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib 	PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 	"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name> helloworld </short-name>
	<tag>
		<name>helloWorld</name>
		<tag-class>net.javajigi.chapter3.taglib.HelloWorldTag</tag-class>
		<attribute>
			<name>name</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<description>User Name</description>
		</attribute>
	</tag>
</taglib>

[예제 3-4] mytaglib.tld

[예제 3-3]을 ANT를 이용하여 빌드하면
[예제 3-4]와 같은 tld파일을 자동으로 생성할 수 있다. 위의 커스텀 태그 예제도
Xdoclet을 이용하여 tld파일을 자동적으로 생성하는 과정에 대하여 살펴보도록 하겠다.



번호 제목 글쓴이 날짜 조회 수
47 XpressEngine(XE) 에서 엮인글 스팸 방지법 file 황제낙엽 2017.08.25 461
46 [Hibernate] 페이징 처리 정리 황제낙엽 2007.02.26 457
45 [Hibernate] Hibernate 프레임워크를 이용한 효율적인 개발 전략 황제낙엽 2007.01.30 389
44 XStream 배우기 : 별칭(Alias) 배우기 황제낙엽 2011.04.20 340
43 JSTL과 Velocity를 활용한 UI 레이어 구현 방법 황제낙엽 2007.01.30 339
42 XStream 배우기 : 변환기(Converter) 배우기 황제낙엽 2011.04.20 298
41 Custom XStream Converter 황제낙엽 2011.04.26 212
40 [Hibernate] Hibernate Tutorial 황제낙엽 2012.11.15 166
39 [Hibernate] Hibernate 와 Ant 에서 composite id 사용하기 예제 file 황제낙엽 2005.11.29 134
38 검색엔진 루씬 Lucene... Analyzer의 선택 황제낙엽 2007.11.27 102
37 Map <-> XML (2) 황제낙엽 2011.04.29 99
36 [Hibernate] 하이버네이트 참조문서 버전 3.2 cr3의 최신 업데이트 한글 번역본 file 황제낙엽 2007.07.03 98
35 벨로시티에서 loop 작성 황제낙엽 2005.12.13 85
34 XE 서버 이전 계획 file 황제낙엽 2018.08.29 80
33 SiteMesh를 이용하여 웹 페이지의 레이아웃을 처리 황제낙엽 2007.08.13 67
32 XML -> (Map) XML 황제낙엽 2011.04.29 61
31 Jakarta Lucene (루씬) - 들어가기 황제낙엽 2007.07.30 57
» Xdoclet 사용하기 1부 황제낙엽 2006.10.04 45
29 XStream 배우기 : 2분만에 배우는 XStream 황제낙엽 2011.04.20 40
28 Xdoclet 사용하기 2부 황제낙엽 2006.10.04 40