Java EE, JSR 109를 위한 웹 서비스 명세에서는 웹 서비스를 구현하는 두 가지 방법을 정의한다. 그 중 한 가지 방법은 자바 클래스 프로그래밍 모델에 기초한 것으로, 웹 서비스가 웹 컨테이너에서 실행되는 자바 클래스에 의해 구현된다. 또 다른 방법은 EJB(Enterprise JavaBeans) 프로그래밍 모델에 기초한 것으로, 웹 서비스가 EJB 컨테이너에서 실행되는 stateless 세션 빈으로 구현된다. 이전의 테크 팁 JAX-WS를 이용한 웹 서비스 개발에서는 자바 클래스 프로그래밍 모델과 JAX-WS(Java API for XML Web Services) 2.0, JSR 224를 이용하여 웹 서비스를 개발하는 방법에 대해 알아보았다. 이번 팁에서는 JAX-WS와 EJB 프로그래밍 모델을 이용하여 웹 서비스를 개발하는 방법을 배우게 될 것인데, 특히 EJB 3.0 stateless 세션 빈을 이용하여 Calculator 서비스(이전 테크 팁에서 다룬 것과 동일한 Calculator 서비스)를 구현하는 방법에 대해 자세히 살펴보도록 하자.

본 팁에는 예제 패키지가 포함되어 있고, 이 예제에는 EJB 3.0 기반의 Calculator 서비스에 액세스하는 독립형 자바 클라이언트가 설명되어 있다. 또한 여기에는 GlassFish라고 불리는 Java EE 5의 오픈 소스 레퍼런스 구현이 사용되었다. GlassFish는 GlassFish 커뮤니티 다운로드 페이지에서 다운로드할 수 있다.

EJB 3.0 Stateless 세션 빈 클래스 작성하기

우선 서비스를 위한 stateless 세션 빈을 작성하는 것부터 시작해보자. Java EE 5 플랫폼에서 크게 개선된 내용 중 하나로 대폭 단순해진 EJB 프로그래밍 모델을 들 수 있는데, 이는 Enterprise JavaBeans 3.0 Specification, JSR-220에 정의되어 있다. 단순화된 기능 중 한 가지를 예로 들면, 빈 구현 클래스가 더 이상 javax.ejb.SessionBean 또는 javax.ejb.EntityBean 인터페이스를 구현하도록 요구하지 않는다는 것이다. 단순히 클래스에 주석을 달기만 하면 클래스를 세션 빈이나 엔티티 빈으로 선언할 수 있는데, 실례로 클래스에 @Stateless 주석을 달면 클래스를 stateless 세션 빈으로 선언할 수 있다.

EJB 3.0은 다음과 같이 빈 구현 클래스를 위한 추가 규칙을 명시한다.

  • 클래스는 반드시 public으로 선언되어야 하며 어떤 인자도 받지 않는 기본값 생성자(constructor)를 가져야 한다.

  • 클래스는 절대로 final 또는 abstract여서는 안 되며 반드시 톱 레벨 클래스여야 한다.

  • 클래스는 finalize() 메소드를 정의해서는 안 된다.

EJB 3.0에서 단순화된 또 한 가지 내용은 세션 빈을 위한 컴포넌트 인터페이스 또는 홈 인터페이스가 더 이상 요구되지 않는다는 점이다. 세션 빈이 필요로 하는 한 가지 인터페이스는 빈의 비즈니스 메소드를 정의하는 비즈니스 인터페이스이다. 비즈니스 인터페이스의 비즈니스 메소드는 컴포넌트 인터페이스의 비즈니스 메소드와 달리 java.remote.RemoteException을 throw할 필요가 없지만 비즈니스 메소드는 임의의 애플리케이션 예외와 관련하여 throws 절을 정의할 수 있다. 또한 EJB 3.0 비즈니스 메소드는 staticfinal이 될 수 없다.

이러한 단순화와 규칙을 전제로 하여, EJB 3.0 프로그래밍 모델을 따르는 Calculator 클래스의 stateless 세션 빈에 대해 알아보자(Calculator 클래스의 소스 코드는 설치된 예제 패키지의 엔드포인트 디렉토리에 들어 있음).

   package endpoint;
  
   import javax.ejb.Stateless;
  
   @Stateless  
   public class Calculator {

      public Calculator() {}
      public int add(int i, int j) {
         int k = i +j ;
         System.out.println(i + "+" + j +" = " + k);
         return k;
      }
   }

EJB 3.0 빈은 javax.ejb.SessionBean 인터페이스를 구현할 필요가 없기 때문에 더 이상 ejbActivateejbPassivate와 같은 비구현 라이프사이클 메소드를 포함시킬 필요가 없다. 따라서 훨씬 단순하고 완벽한 클래스가 생성된다. EJB 3.0에 정의된 다양한 주석들은 컴포넌트를 위한 배치 기술자 작성의 필요성을 줄이거나 없애줌으로써 개발자 및 배치자의 부담을 상당히 덜어준다.

EJB 3.0 빈을 웹 서비스로 표시하기

빈을 웹 서비스로 만들려면 간단히 클래스에 @WebService 주석을 달면 된다. 이것은 javax.jws.WebService 패키지에 정의된 주석 타입으로, Java Platform, JSR 181을 위한 웹 서비스 메타데이터에 지정되어 있다. 다음은 웹 서비스로 표시된 Calculator 클래스 코드이다.

   package endpoint;
  
   import javax.ejb.Stateless;
   import javax.jws.WebService;

   @Stateless
   @WebService
   public class Calculator {

      public Calculator() {}
      public int add(int i, int j) {
         int k = i +j ;
         System.out.println(i + "+" + j +" = " + k);
         return k;
      }
   }

자바 클래스를 @WebService 주석으로 표시하면 서비스 구현 클래스가 된다. 단, 서비스 엔드포인트 인터페이스를 구현할 필요가 없다는 점에 유의할 것. JSR 109에 따르면, javax.jws.WebService 주석이 첨부된 서비스 구현 빈을 제공하기만 하면 된다. 그런 다음 배치 툴을 이용해서 자바 WSDL 매핑을 위한 JAX-WS 규칙을 적용함으로써 서비스 엔드포인트 인터페이스는 물론, WSDL 문서까지 생성할 수 있다.

웹 서비스 패키지하기

EJB 프로그래밍 모델에 기초한 웹 서비스는 JAR 파일로 패키지되어야 하는데, 즉 @WebService 주석을 이용하여 서비스 구현 빈 클래스(독립 클래스가 있을 경우에는 이와 함께)와 서비스 엔드포인트 인터페이스 클래스(명시적으로 제공될 경우)를 패키지하기만 하면 된다. 이 외에도, @Stateless 주석은 ejb-jar.xml을 패키지해야 하는 수고를 덜어주기도 한다. 이와 대조적으로, EJB 2.0이나 이전 버전에 기초한 웹 서비스를 JAX-RPC 방식으로 패키지하는 경우에는 사용자가 서비스 엔드포인트 인터페이스 클래스, 서비스 구현 빈 클래스(및 독립 클래스), 생성된 portable artifacts, JAX-RPC 매핑 파일, 웹 서비스 배치 기술자(webservices.xmlejb-jar.xml) 등을 제공해야만 했다.

JSR 224, JSR 109, JSR 181 및 JSR 220의 경우, 애플리케이션 서버 배치 툴을 이용하여 웹 서비스 배치를 위한 배치 기술자(사용자가 명시적으로 제공하지 않은 경우)를 비롯하여 필요한 모든 artifacts를 생성할 수 있다. EJB JAR 파일에 번들로 포함된 이 artifacts는 EJB 컨테이너에 배치된다. 배치자는 전술한 artifacts를 명시적으로 제공하고 배치 시 이를 EJB 모듈에 패키지함으로써 @WebService@Stateless 주석에 의해 지정된 값들을 오버라이트할 수 있다. 본 팁의 경우에는 다음 파일들이 배치될 EJB 모듈에 패키지되어 있다.

  endpoint/Calculator.class
  endpoint/jaxws/Add.class
  endpoint/jaxws/AddResponse.class

나머지 배치 artifacts는 애플리케이션 서버(이 경우 GlassFish)에 의해 생성된다.

클라이언트 작성하기

웹 서비스를 배치한 후에는 클라이언트 프로그램으로 액세스가 가능한데, 클라이언트는 @WebServiceRef 주석을 이용하여 EJB 3.0 기반의 웹 서비스에 레퍼런스를 선언한다. @WebServiceRef 주석은 javax.xml.ws 패키지에 포함되어 있으며, Java Platform, JSR 181을 위한 JAX-WS 2.0 웹 서비스 메타데이터에 지정되어 있다. 본 팁에 사용된 클라이언트 프로그램 JAXWSClient의 소스 코드를 살펴보면(JAXWSClient의 소스 코드는 설치된 예제 패키지의 client 디렉토리에 들어 있음), 다음과 같은 내용을 확인할 수 있다.

   @WebServiceRef(wsdlLocation=
    "http://localhost:8080/CalculatorService/Calculator?WSDL")
   static endpoint.CalculatorService service;

@WebServiceRef 내의 wsdlLocation 파라미터의 값은 일종의 URL로, 레퍼런스된 서비스의 WSDL 파일의 위치를 나타낸다. (@WebServiceRef 주석은 옵션으로 제공되는 추가 속성을 지원하며, 이 옵션 속성은 JAX-WS 2.0 스펙의 섹션 7.9에 지정되어 있다.) service로 명명된 정적 변수는 애플리케이션 클라이언트 컨테이너에 의해 인젝트된다.

JAXWSClient의 소스 코드를 좀더 살펴보면 다음과 같은 내용을 확인할 수 있다.

   endpoint.Calculator port = service.getCalculatorPort();

service 오브젝트는 웹 서비스의 Calculator 포트에 액세스하기 위한 getCalculatorPort 메소드를 제공한다. 단, endpoint.CalculatorServiceendpoint.Calculator 모두 wsimport 유틸리티를 이용하여 생성되는 portable artifacts라는 점에 유의할 것. wsimport 유틸리티는 JAX-WS artifacts 생성에 사용되는데, 예제 프로그램 실행 시 클라이언트 구축을 위해 호출된다.

포트를 획득한 후에는 오브젝트 상에서 자바 메소드를 호출하는 것처럼 포트 상에서 비즈니스 메소드를 호출할 수 있다. 예를 들어, JAXWSClient의 다음 행은 Calculator의 add 메소드를 호출한다.

  int ret = port.add(i, 10);

예제 코드 실행하기

본 테크팁에는 예제 패키지가 포함되어 있으며, 예제 패키지에서는 테크팁에서 다룬 기법을 예시한다. 예제를 설치하고 실행하려면 다음의 작업 절차를 따르도록 한다.

  1. GlassFish를 아직 구하지 못했다면 GlassFish 커뮤니티 다운로드 페이지에서 다운로드한다.

  2. 그런 다음 아래의 환경 변수를 설정한다.

    GLASSFISH_HOME: GlassFish의 설치 장소(가령 C:\Sun\AppServer)을 표시해야 한다.

    ANT_HOME: ant의 설치 장소를 표시해야 한다. ant는 다운로드한 GlassFish 번들에 포함되어 있다. (Windows에서는 lib\ant 서브디렉토리에 위치함)

    JAVA_HOME: 사용자 시스템에서의 JDK 5.0 위치를 표시해야 한다.

    아울러, ant 위치를 각자의 PATH 환경 변수에 추가한다.

  3. 해당 테크팁의 예제 패키지를 다운로드하여 압축을 푼다. 이 때, 새로 압축이 풀린 디렉토리는 <sample_install_dir>/ttmar2006ejb-ws로 표시되어야 하는데, 여기서 <sample_install_dir>은 예제 패키지가 설치된 디렉토리이다. 예를 들어, Windows의 C:\에 압축을 해제했다면 새로 생성된 디렉토리는 C:\ttmar2006ejb-ws가 되어야 한다. ttmar2006ejb-ws 아래의 ejb-techtip 디렉토리에는 예제를 위한 소스 파일과 기타 지원 파일이 포함되어 있다.

  4. ejb-techtip 디렉토리로 이동하여 build.properties 파일을 적절히 편집해야 하는데, 예를 들어 admin 호스트가 원격인 경우에는 admin.host의 기본값(localhost)을 해당 원격 호스트로 변경하면 된다.

  5. 다음 명령어를 입력하여 GlassFish를 시작한다.

    <GF_install_dir>/bin/asadmin start-domain domain1

    이 때, <GF_install_dir>은 GlassFish가 설치된 디렉토리를 나타낸다.

  6. ejb-techtip 디렉토리에서 다음 명령어를 실행한다.

    ant build

    빌드 디렉토리가 생성되고 클래스가 컴파일된 다음, 컴파일된 클래스가 빌드 디렉토리로 들어간다. 또한 아카이브 디렉토리와 JAR 파일이 생성되고, JAR 파일이 아카이브 디렉토리로 들어간다.

    ant deploy

    이 명령어는 JAR 파일을 GlassFish 상에 배치한다.

    ant build-client

    이 명령어는 portable artifacts를 생성하고 클라이언트 소스 코드를 컴파일한다.

    ant run

    이 명령어는 애플리케이션 클라이언트를 실행하고 Calculator 서비스에서 add 연산을 10회 호출하여 0에서 9까지의 숫자에 10을 추가한다. 이 때, 다음과 같은 내용이 표시되어야 한다.

    실행:

        [echo] Executing appclient with client class as 
        client.JAXWSClient
        [exec] Retrieving port from the service 
        endpoint.CalculatorService@159780d
        [exec] Invoking add operation on the calculator port
        [exec] Adding : 0 + 10 = 10
        [exec] Adding : 1 + 10 = 11
        [exec] Adding : 2 + 10 = 12
        [exec] Adding : 3 + 10 = 13
        [exec] Adding : 4 + 10 = 14
        [exec] Adding : 5 + 10 = 15
        [exec] Adding : 6 + 10 = 16
        [exec] Adding : 7 + 10 = 17
        [exec] Adding : 8 + 10 = 18
        [exec] Adding : 9 + 10 = 19
    
  7. GlassFish에서 EJB 모듈을 배치 해제하려면 다음 명령어를 실행한다.

    ant undeploy

저자 소개

Manisha Umbarje는 Sun Java System Application Server의 제품 엔지니어링 그룹 소속임.

"Java EE" 카테고리의 다른 글

2006/05/04 17:09 2006/05/04 17:09

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/316

댓글을 달아 주세요

  1. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 04:33
  2. 김문경  수정/삭제  댓글쓰기

    예제 코드 실행하기..이해가 되는데요

    2007/09/19 13:29
[로그인][오픈아이디란?]

◀ Prev 1  ... 404 405 406 407 408 409 410 411 412  ... 626  Next ▶