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

한빛출판네트워크

IT/모바일

Resin: 인스턴트 애플리케이션 서버

한빛미디어

|

2002-09-27

|

by HANBIT

7,989

저자: 다니엘 솔린(Daniel Solin), 역 김대곤

유닉스 상에서 실행되면서 엄청난 성능을 제공하는 설치하기 쉽고, 빠르게 구동되는 애플리케이션 서버를 상상해 보자. 그리고 놀랍게도 이 작은 애플리케이션 서버가 JSP/서블릿, XML/XSL, EJB/CMP를 포함하는 최신 자바 서버의 기능들을 모두 제공한다고 생각해 보자.

이제 상상은 그만해도 된다. 이러한 애플리케이션 서버가 Resin이라는 이름으로 우리 곁에 와 있다. 본 기사에서는 Resin의 설치 및 실행 방법을 포함하여 어떻게 자바 서버의 기능들을 손쉽게 사용할 수 있도록 하는지를 보여주는 EJB/CMP 예제를 살펴보는 것으로 마무리할 것이다. 만약 다른 자바 서버들을 설치하고 사용해 보았다면 Resin이 얼마나 쉽고 간단하게 설치되고 실행되는지를 보고 놀랄 것이다.

Resin 다운 및 설치

Resin를 설치하는 것부터 시작해 보자. Resin은 그 자체가 자바 애플리케이션이기 때문에 자바를 컴파일하고 실행할 수 있는 환경이 필요하다. 이러한 자바 환경이 없다면, 자바 개발자 툴킷(JDK)의 Standard Edition과 Enterprise Edition를 다운받아 설치하기를 바란다. JDK SE, JDK EE에 관련된 사항은 java.sun.com에 나와 있다. JDK Enterprise Edition를 설치하지 않는다면, 이 글의 후반부에 나오는 작업들을 수행할 수 없을 것이다. 그리고 JDK EE가 필요한 이유는 Enterprise Edition를 필요로 하는 Resin Enterprise Edition를 설치하기 때문이다.

JDK SE와 JDK EE가 설치되었다면, Resin를 다운받아 압축을 풀어보자(다운로드는 여기를 클릭). 이 기사를 쓸 때의 Resin Enterprise Edition의 최신 버전은 2.1이었다.

Resin EE 파일을 다운로드 받았다면, /usr/local 디렉토리에 압축을 풀자.
root@localhost:~# resin-ee-2.1.4.tar.gz /usr/local
root@localhost:~# cd /usr/local
root@localhost:/usr/local# tar xvfz resin-2.1.4.tar.gz
root@localhost:/usr/local# ln -s resin-2.1.4 resin
Resin을 독립실행형(standalone) 웹 서버로 사용할 것이므로, 실행하기 전에 서버의 포트를 변경할 필요가 있다. /usr/local/resin/conf/resin.conf 파일을 편집기로 열어서 다음과 같이 포트를 정의한 부분을 찾는다.

Resin은 대개 아파치 웹 서버와 연동해서 사용한다. 즉, JSP/서블릿 요청만 처리하고, 나머지 요청은 아파치 웹 서버가 처리하는 방식으로 사용한다. Resin은 아파치 웹 서버와의 연동을 위해 웹 서버의 표준 포트인 80 대신 8080 포트를 기본 포트로 설정하고 있다. 우리는 Resin이 모든 요청이 처리되도록 하는 독립실행형으로 사용할 것이므로 포트를 8080에서 80으로 변경하고 변경 내용을 저장 후 resin.conf 파일을 닫는다.

이제 Resin를 실행시켜 보자.
root@localhost:~# /usr/local/resin/bin/httpd.sh
아래와 같은 메시지가 출력된다면 실행에 성공한 것이다.
Resin 2.1.4 (built Fri Aug 2 14:16:52 PDT 2002)
Copyright(c) 1998-2002 Caucho Technology. All rights reserved.

Starting Resin on Tue, 10 Sep 2002 09:31:46 +0200 (CET)
[2002-09-10 09:32:04.791] initializing application
http://localhost/quercus

[snip: loads of compilations]

[2002-09-10 09:36:34.618] initializing application 
            http://localhost/
[2002-09-10 09:36:34.619] initializing application 
            http://localhost/java_tut
[2002-09-10 09:36:34.620] initializing application 
            http://localhost/examples/basic
[2002-09-10 09:36:34.621] initializing application 
            http://localhost/examples/tags
[2002-09-10 09:36:34.622] initializing application 
            http://localhost/examples/tictactoe
[2002-09-10 09:36:34.624] initializing application 
            http://localhost/examples/navigation
[2002-09-10 09:36:34.625] initializing application 
            http://localhost/examples/xsl
[2002-09-10 09:36:34.626] initializing application 
            http://localhost/examples/templates
[2002-09-10 09:36:34.627] initializing application 
            http://localhost/examples/login
[2002-09-10 09:36:34.628] initializing application 
            http://localhost/cmp
http listening to *:80
srun listening to 127.0.0.1:6802
이제, 브라우저에서 테스트 해보자. 브라우저의 주소창에 http://localhost라고 입력하고 이동하면, 다음과 같은 Resin의 기본 페이지가 보일 것이다.


[그림1] Resin 홈페이지

Deploying A Test Application(테스트 프로그램 작성)

이번에는 Resin의 주요 특징들이 어떻게 웹 개발을 쉽게 하는지를 개괄적으로 보여주는 간단한 예제 프로그램을 작성해 보고자 한다. MySQL 데이터베이스와 자바 서블릿간의 통신을 표준화하고, 단순화하는 Resin의 CMP기능을 사용하는 예제를 만들 것이다. 이런 예제를 위해서는 실행중인 MySQL 데이터베이스(JDBC 드라이버를 가지고 있는 다른 데이터베이스도 무방하다)가 필요하다. 다음 SQL문장을 사용하여 테이블을 생성하고, 몇 개의 자료를 입력해보자.
use test;
CREATE TABLE turtle
(
   turtle_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   turtle_name VARCHAR(50),
   PRIMARY KEY(turtle_id)
);

INSERT INTO turtle VALUES(NULL,"Donatello");
INSERT INTO turtle VALUES(NULL,"Michaelangelo");
INSERT INTO turtle VALUES(NULL,"Raphael");
INSERT INTO turtle VALUES(NULL,"Leonardo");

MySQL Reference Manual

참고 도서

MySQL Reference Manual
Michael ‘Monty’ Widenius, MySQL AB, David Axmark




테이블의 자료를 조회하기 위하여 세 개의 클래스를 작성할 것이다.
  • Turtle: 테이블의 한 행을 나타낸다.
  • TurtleHome: 전체 테이블을 나타낸다. Turtle객체를 반환하는 검색기능을 제공한다.
  • TurtleBean: 비즈니스 로직을 수행하고, 인터페이스(Turtle, TurtleHome)와 서블릿 간의 연결을 담당한다.
위의 세 개 클래스의 소스는 아래와 같다. (팁: 클래스 작업시에는 Resin를 종료시켜라. 그렇지 않으면 작업 도중에 Resin은 변경사항을 컴파일하고 등록하려고 하기 때문에 화면상에 불필요한 에러 메시지로 가득 찰 것이다.)

Example 1. Turtle.java.
package org.solin.web.Turtle;
import javax.ejb.*;

public interface Turtle extends EJBLocalObject
{
    String getTurtleId();
    String getTurtleName();
}
Example 2. TurtleHome.java.
package org.solin.web.Turtle;

import javax.ejb.*;
import java.util.Collection;

public interface TurtleHome extends EJBLocalHome
{
    Turtle findByPrimaryKey(Integer name)
        throws FinderException;

    Collection findAll()
        throws FinderException;
}
Example 3. TurtleBean.java.
package org.solin.web.Turtle;
import java.util.Collection;

public abstract class TurtleBean extends com.caucho.ejb.AbstractEntityBean
{
    public abstract String getTurtleId();
    public abstract String getTurtleName();
}
여기서 TurtleHome은 테이블의 자료(한 행)를 Turtle객체로 제공하고, TurtleBean은 실제 데이터를 가져오기 위해 서블릿에서 사용되어 진다.

위의 세 개의 클래스들은 Resin의 Document Root(/docs)의 서브 디렉토리인 WEB-INF/classes에 두어야 한다. 엔티티 빈(Entity Bean)인 TurtleBean이 작동하기 위해서는 Deployment Descripter가 필요하다. 아래의 Deployment Descripter(turtle.ejb) 파일을 WEB-INF 디렉토리에 두어라.

Example 4. turtle.ejb.

  
    
      TurtleBean
      org.solin.web.Turtle.TurtleHome
      org.solin.web.Turtle.Turtle
      org.solin.web.Turtle.TurtleBean

      Integer
      turtleId

      Container
      True

      turtle
      turtle

      
                
turtleId
      

      
                
turtleName
      

      
                

                    
findAll
                

                
SELECT o FROM turtle o
      
    
  

Deployment Descriptor 파일은 인터페이스로 사용되어질 클래스를 정의하고, Bean으로 사용되어질 클래스를 정의한다. 또한 사용하려는 테이블과 필드를 정의하고, 테이블의 모든 자료를 가져오는 조회문장도 정의한다.( TurtleHome.findAll()에 정의하였음) 대부분의 EBJ를 사용할 때처럼 Resin에서도 Bean를 추가하기 위해서 WEB-INF 디렉토리에 있는 web.xml를 수정해야 한다. 아래 코드는 추가해야 할 부분이다.

Example 5. web.xml.

  
    jdbc/test
    javax.sql.XADataSource
    com.caucho.jdbc.mysql.Driver
    jdbc:mysql_caucho://localhost:3306/test
    
    
  
  
    java:comp/env/cmp
    com.caucho.ejb.EJBServer
    
  

이 예제에서는 Resin이 사용할 데이터베이스 디라이버로 MySQL를 사용하였지만, 사용자의 환경에 적합한 다른 설정도 가능하다. 마지막으로 브라우저와 통신할 서블릿 프로그램을 작성하자.

Example 6. TurtleServlet.java.
package org.solin.web.Turtle;

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

public class TurtleServlet extends HttpServlet
{
   private TurtleHome turtlehome = null;

   public void init() throws ServletException
   {
      try
      {
         Context cmp = (Context) new InitialContext().lookup("java:comp/env/cmp");
         turtlehome = (TurtleHome) cmp.lookup("TurtleBean");
      }
      catch(NamingException e)
      {
         throw new ServletException(e);
      }
   }

   public void doGet(HttpServletRequest req, HttpServletResponse res)
      throws IOException, ServletException
   {
      PrintWriter out = res.getWriter();
      res.setContentType("text/html");
      out.println("

My Turtles

"); out.println("Below is a listing of my turtles, in no specific order.

"); try { Collection c = turtlehome.findAll(); Iterator iter = c.iterator(); while( iter.hasNext() ) { Turtle turtle = (Turtle) iter.next(); out.println(turtle.getTurtleId() + ". " + turtle.getTurtleName() + "
"); } } catch( Exception e) { throw new ServletException(e); } } }
Resin에 추가된 서블릿을 인식시키기 위해 resin.conf 파일을 수정하자.

  
  
    
  

위 코드는 태그 안에 위치해야 한다. 모든 작업이 완료되었다면, Resin를 구동(start or reload)시키자. 새로 추가된 모든 설정과 소스 파일들은 Resin에 의해 컴파일되고 등록된다. Resin은 항상 소스 및 설정 파일들의 변경을 체크하고, 변경이 발생할 때마다 자동적으로 재컴파일하고, 변경사항을 반영한다. 서버 재가동 및 작업자에 의한 재컴파일 작업과 같은 번거로운 작업은 더 이상 필요없다.

이제 모든 준비가 끝났다. 브라우저를 통해 서블릿을 호출하자.(http://localhost/turtle). 다음과 같은 화면이 나타날 것이다.


[그림2] Turtles 애플리케이션 결과

결론

웹 애플리케이션 서버의 설치, 데이터베이스 작업을 수행하는 EJB/CMP 등과 같은 기술을 구현할 때, 자연스럽게 많은 작업, 대규모 사이트, 여러 개의 사이트를 생각한다. 그러나 Resin은 이러한 기술들을 사용하기 쉽게 만든다. 빠른 설치와 단순화된 데이터베이스 관리는 누구에게나 매력적인 것이다.

만약 Resin CMP에 대하여 더 자세한 정보가 필요하다면, 이 튜토리얼을 참고하기 바란다. 이미 언급했듯이, Resin과 아파치를 연동하는 설정은 매우 일반적이다. 이 튜토리얼에는 Resin-아파치 연동 설정 방법과 이 기사에 언급된 내용에 자세한 사항이 들어 있다.
아파치 포켓 레퍼런스

참고 도서

아파치 포켓 레퍼런스
앤드류 포드




Resin의 기능과 장점들을 발견한다면 개발작업은 더욱 즐겁게 되고, 개발에 필요한 시간은 단축될 것이다. 행운이 있기를 빈다.
다니엘 솔린(Daniel Solin)은 GUI 프로그래밍 전문 리눅스 컨설턴트이자 자유기고가로 활동하고 있다. 그의 처녀작, “Teach Yourself Qt Programming”은 2000년 5월 SAM에서 출간되었다.
TAG :
댓글 입력
자료실