메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

톰캣 사용하기 II - Tomcat에 웹 애플리케이션 배치하기

한빛미디어

|

2002-05-23

|

by HANBIT

19,512

저자: 제임스 굿윌(James Goodwill), 역 이상훈

본 기사에서는 Tomcat을 이용하여 웹 애플리케이션을 배치하는 것을 다루고자 한다.

배치과정을 가장 잘 설명할 수 있는 방법은 대부분의 자바 애플리케이션에서 찾아 볼 수 있는 중요한 컴포넌트를 포함하는 자신의 웹 애플리케이션을 만들고 배치를 위해 패키지하는 것이다. 다음 섹션부터 onjava로 명명된 하나의 웹 애플리케이션을 배치하는데 필요한 단계를 따라갈 것이다.

이 기사에서 다루게 될 내용은 아래와 같다. 웹 애플리케이션 디렉토리 구조 생성

처음으로 해야 할 일은 애플리케이션을 저장할 디렉토리 구조를 생성하는 것이다. 이 구조에 대해서는 이미 톰캣 사용하기 I - 자바 웹 애플리케이션」에서 언급했으며 [표 1]에 해당되는 상세사항을 기술했다.

[표 1] 웹 애플리케이션 디렉토리 구조
디렉토리
내용
/onjava 웹 애플리케이션의 루트 디렉토리. 모든 JSP와 HXTML파일이 이곳에 저장된다.
/onjava/WEB-INF 애플리케이션 문서 루트에 포함되지 않은 애플리케이션과 관련된 모든 자원을 포함한다. 이곳은 웹 애플리케이션의 배치 지시자가 있는 곳이다. WEB-INF 디렉토리는 공개 문서 부분이 아님에 주의하자. 이곳에 있는 어떤 파일도 클라이언트에 직접 서비스 되지 않는다.
/onjava/WEB-INF/classes Servlet과 유틸리티 클래스가 있는 디렉토리
/onjava/WEB-INF/lib 웹 애플리케이션이 의존하는 자바 압축파일을 포함하는 디렉토리이다. 예를 들면 이곳에 JDBC드라이버를 포함하는 JAR파일을 둘 수 있다.

웹 애플리케이션 이름인 onjava는 디렉토리 구조의 루트가 된다.

배치 할 때에는 Tomcat의 /webapps 디렉토리에서 직접 생성하기를 권장한다. 배치할 시점에서는 웹 애플리케이션을 WAR파일로 패키지 할 것이고 산출물 배치 과정을 수행할 것이다.

웹 애플리케이션 디렉토리 구조를 생성하는 마지막 단계는 배치 지시자를 추가하는 것이다. 이 시점에서 web.xml 파일을 기술하는 DTD를 포함하고 빈 요소를 갖는 기본 web.xml 파일을 생성할 것이다.

리스트 1 web.xml






이제 이 파일을 TOMCAT_HOME/onjava/WEB-INF/ 디렉토리에 복사하고 나면 다음 섹션부터는 웹 애플리케이션 컴포넌트를 추가하기 시작할 것이다.

웹 애플리케이션 ServletContext만들기

웹 애플리케이션 디렉토리 구조를 생성한 후에 반드시 Tomcat에 새로운 ServletContext를 추가해야 한다. ServletContext는 일련의 메소드 집합을 정의하며 이 메소드 집합은 서블릿 컨테이너와 동신하기 위한 웹 애플리케이션의 컴포넌트에 의해 사용된다. ServletContext는 또한 웹 애플리케이션을 위한 컨테이너처럼 동작한다. 웹 애플리케이션당 단 하나의 ServletContext가 존재해야 하며, ServletContext와 그 웹 애플리케이션의 관계는 이 이후에 다룰 기사에서 더 상세하게 다룰 것이다.

새로운 ServletContext를 Tomcat에 추가하기 위해서는 TOMCAT_HOME/conf/server.xml 파일에 웹 애플리케이션 이름에 대한 pathdocBase 값을 지정해야 한다. 지금 사용하는 이름이 onjava임을 다시 한 번 주목하자.



주의를 기울여야 할 두 가지 사항은 다음과 같다. 첫째, path="/onjava"는 서블릿 컨테이너에게 서버 URL에 연결된 /onjava를 포함하는 모든 요청은 onjava 웹 애플리케이션에 속한 것임을 알려준다. 둘째, docBase="onjava"는 서블릿 컨테이너가 /onjava 디렉토리에 존재하는 웹 애플리케이션임을 알려준다.

JSP 추가

이제 웹 애플리케이션 디렉토리를 생성하여 ServletContext를 추가했으므로 서버측 자바 컴포넌트를 추가할 수 있게 되었다. 처음으로 추가하게 될 컴포넌트들은 JSP들이다.

첫 JSP에는 간단한 로그인 화면이 포함될 것이다. 리스트 2에 login.jsp 페이지의 소스가 담겨있다.

리스트 2 login.jsp


 OnJava Demo
 




 
User Name:
Password:

이 JSP에서 알 수 있듯이 별로 새로운 점은 발견하지 못했을 것이다. 다만 주의 깊게 봐야 하는 것은 폼의 action이다. 그 것은 login이라고 명명된 com.java 패키지 내의 서블릿을 참조하고 있다. 이 서블릿이 유저네임과 패스워드 매개변수를 요청에서 추출하고 스스로의 프로세스를 수행하게 된다.

JSP를 배치하는 것에는 별 다르게 많은 일이 없다. 단지 웹 애플리케이션의 퍼블릭 디렉토리에 복사하기만 하면 된다. 이 경우엔 TOMCAT_HOME/webapps/onjava/일 것이다. 이 JSP가 참조하게 될 이미지들은 /onjava 디렉토리 내에 생성한 이미지 폴더에 있어야만 한다.

이 JSP의 동작을 보려면 다음 URL을 브라우저에서 열면 된다.

http://localhost:8080/onjava/login.jsp

만약 기본 HTTP 포트를 변경했다면 알맞은 포트 값으로 URL을 요청할 필요가 있다. 만약 모든 것이 올바르게 구성되었다면 [그림 1]과 같은 이미지를 보게 될 것이다.


[그림 1] 올바르게 구성되었을 때의 화면

만약 이와 같은 페이지를 보지 못 했다면 "웹 애플리케이션 ServletContext만들기"에서 설명한 대로 server.xml에 기재사항이 정확한지 확인해야 한다.

두 번째 JSP는 다음 섹션에서 정의될 서블릿에 의해 참조되는 타겟 JSP이다. 이 JSP는 다음에 나올 서블릿에 추가될 요청인USER 속성 요청을 추출하게 되고, 속성의 문자열 값을 출력하게 된다. 리스트 3에 타겟 JSP의 소스가 담겨 있다.

리스트 3 Welcome.jsp


 OnJava Demo
 


 
Welcome : <%= request.getAttribute("USER") %>
이 JSP를 패포하기 위해서는 앞서 언급한 대로, TOMCAT_HOME/webapps/onjava/인 웹 애플리케이션의 퍼블릭 디렉토리에 파일을 복사하기만 하면 된다.

Servlet 추가

다음으로 추가될 컴포넌트는 서블릿이다. 이 서블릿은 login.jsp 폼의 작동이 될 것이다. 이 서블릿은 HttpServletRequest에서 유저네임과 패스워드를 추출하고 관련된 사용자를 검색한 후 타겟 JSP에 요청을 포워드한다. 이 서블릿의 소스코드는 리스트 4에 나와 있다.

이 예제에서 USER 값은 고정되어 있다. 일반적으로 어떤 종류의 실제 조회된 값을 반환할 수도 있을 것이지만 간단히 하기위해 String Bob만 반환하고 있다.

리스트 4 com.onjava.login.java
package com.onjava;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class login extends HttpServlet {

 private String target = "/welcome.jsp";

 private String getUser(String username, String password) {

// 단지 고정된 값을 반환한다. 실제에서는 SQL 조회를 수행할 수도 있다.
  return "Bob";
 }

 public void init(ServletConfig config)
  throws ServletException {

  super.init(config);
 }

 public void doGet(HttpServletRequest request,
  HttpServletResponse response)
  throws ServletException, IOException {

  // If it is a get request forward to doPost()
// doPost()에 포워딩되는 get요청이면
  doPost(request, response);
 }

 public void doPost(HttpServletRequest request,
  HttpServletResponse response)
  throws ServletException, IOException {

// 요청에서 유저네임 갖기
  String username = request.getParameter("username");
// 요청에서 패스워드 갖기
  String password = request.getParameter("password");

  String user = getUser(username, password);

// 요청에 대해 임의의 사용자 추가
  request.setAttribute("USER", user);

// 요청을 타겟에 포워딩
  ServletContext context = getServletContext();

  RequestDispatcher dispatcher =
   context.getRequestDispatcher(target);
  dispatcher.forward(request, response);
 }

 public void destroy() {
 }
}
웹 애플리케이션의 일부로서 서블릿을 배치하기 위해서는 서블릿을 컴파일 해야 하며 웹 애플리케이션의 /WEB-INF/classes 디렉토리로 이동시켜야 한다. 예를 들면 이 서블릿을 컴파일을 하면 /onjava/WEB-INF/classes/com/onjava/ 디렉토리로 이동해야 한다.

패키지명 때문에 이 클래스 파일은 com.onjava 하위 디렉토리에 있어야 한다.

로그인 서블릿을 패포하는 다음 단계는 웹 애플리케이션의 web.xml 파일에 서블릿 엔트리를 추가하는 것이다. 다음 코드에 요소의 예제가 들어 있다.

모든 서블릿을 web.xml에 추가할 필요는 없고, 다만 서블릿이 초기화 매개변수 등과 같은 추가적인 정보를 요구할 때만 필요하다.

요소 예제

  ExampleServlet
  packagename.ExampleServlet
  
   parameter
   value
  
  1

이 서블릿 엔트리는 간단한 서블릿 정의를 포함하고 있으며 각 부분의 대한 정의는 [표 2]에 나와 있다.

[표 2] 의 하위 요소들
하위 요소
정의
배치된 서블릿의 정식 명칭
서블릿의 완전하게 정의된 클래스를 참조한다.
"이름-값"으로 구성된 옵션 매개변수로서 초기화 단계에서 서블릿이 사용할 값이다. 이름과 값을 갖는 로 구성되어있으며 각각 서블릿에 전달된다.
각 서블릿이 로딩되는 순서를 지칭한다. 작은 양수 값이 먼저 로딩되고 음수나 지정되지 않은 경우에는 시작할 때면 아무 때나 로딩될 수 있다.

로그인 서블릿을 추가하기 위해 TOMCAT_ROOT/onjava/WEB-INF/web.xml 파일에 다음과 같은 엔트리를 작성해야 한다.

login
com.onjava.login

이것이 여기에서 할 모든 작업이다. 웹 애플리케이션이 동작하는 것을 보려면 Tomcat 서버를 재시작하고 다음 URL을 브라우저에서 열어보면 된다.

http://localhost:8080/onjava/login.jsp

위에서 언급했던 것처럼 [그림 1]과 같은 화면을 볼 수 있을 것이다. 이제 사용자명과 패스워드를 입력한 후 "쿼리 전송" 버튼을 눌러보아라. 모든 것이 계획대로 되었다면 [그림 2]와 같은 이미지를 볼 수 있을 것이다.


[그림 2] "쿼리 전송"을 누른 결과

[그림 2]와 같은 그림을 보지 못했다면 서블릿 클래스가 적절한 디렉토리에 있는지 또는 위에서 나온 대로 web.xml 파일의 기재사항이 일치하는지 확인해 보라

태그 라이브러리 추가

추가할 마지막 컴포넌트는 태그 라이브러리이다. 이 라이브러리는 HelloTag라는 단일 태그를 갖고있으며 가 나타나는 모든 경우에 문자열을 "Hello"로 변경한다. 이것은 태그 라이브러리의 예제로서는 별로 쓸모가 없다. 그렇지만 태그 라이브러리 배치를 보여주는 것으로는 충분히 실용적인 예제라고 할 수 있다. 태그 핸들러의 소스코드는 리스트 5에 나와 있으며 tld 소스는 리스트 6에 나와 있다.

리스트 5 HelloTag.java
package com.onjava;

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

public class HelloTag extends TagSupport
{
 public void HelloTag() {

 }

// 닫힌 hello 태그를 만났을 때 호출되는 메소드
 public int doEndTag() throws JspException {

  try {

   // pageContext를 이용하여 Writer를 가져오고 텍스트 문자열 Hello를 출력한다
   pageContext.getOut().print("Hello");
  }
  catch (Exception e) {

   throw new JspTagException(e.getMessage());
  }
  // SKIP_BODY를 반환하고자 하는데 이 Tag는 Tag Body를 지원하지 않기 때문이다.
  return SKIP_BODY;
 }

 public void release() {

  // 패어런트 태그에서 사용된 모든 자원을 해제하기 위하여 패어런트의 해제를 호출한다.
  // 이 것은 태그 계층을 생성하는데 매우 좋은 습관이다.
  super.release();
 }
}
리스트 6 taglib.tld






 1.0
 1.1
 onjava
 /onjava

 
 hello
 com.onjava.HelloTag
 empty
 Just Says Hello
 

이 태그 라이브러리를 배치하기 위해서는 web.xml 파일에 엔트리를 만들어야 한다. 이와 같이 변형된 web.xml 파일이 리스트 7에 나와 있다.

리스트 7 web.xml






 
  login
  com.onjava.login
 

 
  /onjava
  /WEB-INF/lib/taglib.tld
 


추가된 엔트리는 두 개의 요소를 가지고 있다. 첫 번째 요소인 는 컨테이너에게 태그 라이브러리를 참조하는 방법을 알려준다. 예제에서는 JSP에서 참조하게 될 태그 라이브러리로 /onjava를 사용한다.

두 번재 요소인 는 태그 라이브러리 지시자(TLD)의 위치를 정의한다. TLD는 라이브러리에 저장된 태그들과 정의된 태그들을 처리할 핸들러를 정의한다.

배치를 완료하기 위해 컴파일된 태그 라이브러리와 taglib.tldTOMCAT_ROOT/onjava/WEB-INF/lib 디렉토리에 복사한다.

새로운 태그 라이브러리를 테스트 하기 위해 welcome.jsp 페이지를 수정해야 한다. 이때 Welcome 메시지를 태그로 참조하도록 변경한다. 이 외에도 taglib 지배 참조자 taglib.tldwelcome.jsp 파일에 추가해야 한다. 변경된 JSP는 리스트 7에 나와 있다.

리스트 7 변경된 welcome.jsp
<%@ taglib uri="/onjava" prefix="onjava" %>


 Onjava Demo
 


 
: <%= request.getAttribute("USER") %>
이제 login.jsp 페이지를 열고 앞서 지시된 대로 데모를 다시 실행하자. 이 번에는 Welcome: Bob 대신 Hello: Bob 메시지가 나와야 한다.

WAR 파일 생성과 배치

웹 애플리케이션을 배치할 준비가 되었다면 배포를 위해 패키지를 해주어야 한다. 이미 "톰캣 사용하기 I - 자바 웹 애플리케이션"에서 언급했던 것처럼 웹 애플리케이션은 WAR 파일로 패키지 할 수 있다. /onjava 웹 애플리케이션을 "WAR-up"하고 배치하기 위한 단계는 다음과 같다.
  1. 웹 애플리케이션의 루트 디렉토리로 이동한다. 이 경우에 루드 디렉토리는 TOMCAT_HOME/webapps/onjava/가 될 것이다.

  2. 웹 애플리케이션을 압축한다.
    jar cvf onjava.war .

  3. 결과 WAR파일 onjava.warTOMCAT_HOME/webapps 디렉토리에 복사한다.

    만약 WAR 파일을 개발하던 Tomcat 서버에 배치하려면 개발하던 디렉토리를 백업하고 TOMCAT_HOME/webapps 디렉토리에서 삭제해야 한다.

  4. 새로운 Context 엔트리를 /TOMCAT_HOME/conf/server.xml 파일에 추가하고 onjava 웹 애플리케이션을 참조하도록 한다.

  5. Tomcat 재시작
여기까지이다. 애플리케이션은 이제 배치되었으며 실행되고 있다. 만약 그렇지 않다면 TOMCAT_HOME/conf/server.xml 파일의 엔트리가 적절한 값을 가지고 있는지 점검해보기 바란다.

이제 여러분은 웹 애플리케이션을 생성하고 배치하는 방법을 배웠다. 앞으로는 웹 애플리케이션과 ServletContext의 관계에 대해 살펴 볼 것이다.

제임스 굿윌(James Goodwill)은 콜로라도 주 덴버에 있는 Virtuas Solutions, LLC사의 수석 설계자이자 공동 창립자이다.
TAG :

이전 글 : PEAR 입문

다음 글 : DirectShow 기술 소개

댓글 입력
자료실

최근 본 상품0