JEUS Application Client 안내서 JEUS v6.0 Fix#8 Copyright 2011 TmaxSoft Co., Ltd. All Rights Reserved.
Copyright Notice Copyright 2011 TmaxSoft Co., Ltd. All Rights Reserved. 대한민국경기도성남시분당구서현동 272-6 우 ) 463-824 Restricted Rights Legend All TmaxSoft Software (JEUS ) and documents are protected by copyright laws and the Protection Act of Com puter Programs, and international convention. TmaxSoft software and documents are made available under the terms of the TmaxSoft License Agreement and may only be used or copied in accordance with the terms of this agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any means, electronic, mechanical, or optical, without the prior written consent of TmaxSoft Co., Ltd. 이소프트웨어 (JEUS ) 사용설명서의내용과프로그램은저작권법, 컴퓨터프로그램보호법및국제조약에의해서보호받고있습니다. 사용설명서의내용과여기에설명된프로그램은 TmaxSoft Co., Ltd. 와의사용권계약하에서만사용이가능하며, 사용권계약을준수하는경우에만사용또는복제할수있습니다. 이사용설명서의전부또는일부분을 TmaxSoft의사전서면동의없이전자, 기계, 녹음등의수단을사용하여전송, 복제, 배포, 2차적저작물작성등의행위를하여서는안됩니다. Trademarks JEUS is registered trademark of TmaxSoft Co., Ltd. Other products, titles or services may be registered trademarks of their respective companies. JEUS 는 TmaxSoft Co., Ltd. 의등록상표입니다. 기타모든제품들과회사이름은각각해당소유주의상표로서참조용으로만사용됩니다. Open Source Software Notice This product includes open source software developed and/or licensed by "OpenSSL", "RSA Data Security, Inc.", "Apache Foundation", and "Jean-loup Gailly and Mark Adler". Information about the aforementioned and the related open source software can be found in the "${INSTALL_PATH}/license/oss_licenses" directory. 본제품은 OpenSSL, RSA Data Security, Inc., Apache Foundation 및 Jean-loup Gailly와 Mark Adler 에의해개발또는라이선스된오픈소스소프트웨어를포함합니다. 관련상세정보는제품의디렉터리 ${IN STALL_PATH}/license/oss_licenses 에기재된사항을참고해주십시오. 안내서정보안내서제목 : JEUS Application Client 안내서발행일 : 2011-11-04 소프트웨어버전 : JEUS v6.0 Fix #8 안내서버전 : v2.1.3
내용목차 안내서에대하여... xi 제1장 애플리케이션클라이언트... 1 1.1. 개요... 1 1.2. 프로그램작성... 1 1.2.1. 프로그램구조... 1 1.2.2. 예제... 2 1.3. Descriptor 생성... 3 1.3.1. Deployment Descriptor 작성... 3 1.3.2. Deployment Descriptor 생성... 4 1.4. 패키징... 5 1.5. Deploy... 5 1.6. 실행... 6 1.6.1. 콘솔에서실행... 6 제2장 고급애플리케이션클라이언트... 9 2.1. 개요... 9 2.2. Dependency Injection... 9 2.2.1. EJB Injection... 11 2.2.2. 리소스 Injection... 11 2.2.3. 그외의 Injection... 12 2.3. Dependency Injection을사용할수없는클라이언트... 12 2.4. 보안설정... 13 2.5. 트랜잭션... 14 제3장 애플릿클라이언트... 15 3.1. 개요... 15 3.2. 프로그램작성... 15 3.2.1. 예제... 15 3.2.2. HTML 예제... 16 3.3. Deploy... 17 3.4. 실행... 17 3.4.1. 웹브라우저에서실행... 18 3.4.2. 애플릿뷰어에서실행... 18 제4장 JNLP 클라이언트... 19 4.1. 개요... 19 4.2. 프로그램작성... 19 4.3. 프로그램실행... 22 4.3.1. 클라이언트실행... 22 4.3.2. 클라이언트컨테이너에서실행... 22 용어해설... 25 JEUS iii
색인... 27 iv JEUS Application Client 안내서
그림목차 [ 그림 1.1] 애플리케이션 / 애플릿클라이언트아키텍처... 2 JEUS v
표목차 [ 표 1.1] 서비스별추가적으로필요한 JEUS 라이브러리... 6 JEUS vii
예목차 [ 예 1.1] <<HelloClient.java>>... 2 [ 예 1.2] <<jeus-client-dd.xml>>... 4 [ 예 2.1] EJB 참조 Injection... 10 [ 예 2.2] 리소스의 Injection... 12 [ 예 2.3] <<HelloClient.java>>... 12 [ 예 2.4] <<jeus-client-dd.xml>>... 13 [ 예 2.5] <<Client.java>>... 14 [ 예 3.1] <<HelloClient.java>>... 15 [ 예 3.2] <<index.html>>... 16 [ 예 4.1] JNLP 서블릿 : <<web.xml>>... 20 [ 예 4.2] <<HelloClient.java>>... 20 [ 예 4.3] <<HelloClient.jnlp>>... 21 [ 예 4.4] <<HelloClient.java>>... 22 [ 예 4.5] <<HelloClient.jnlp>>... 23 JEUS ix
안내서에대하여 안내서의대상 본안내서는 JEUS 기반에서애플리케이션클라이언트를개발하는개발자를위한안내서이다. 본안내서에는 JEUS에서의애플리케이션클라이언트의개념과사용법그리고 JNLP의개념에대해설명한다. 애플리케이션클라이언트이란다음과같은실행가능한형태의프로그램을말한다. Java 애플리케이션클라이언트 애플릿 JNLP 클라이언트 안내서의전제조건 본안내서를원활하게이해하기위해서는다음과같은사항을미리알고있어야한다. Java EE 애플릿 JNLP 참고 본문에서사용한예제는 JEUS_HOME\samples\client 디렉터리에서전체소스를볼수있고직접실 행할수있다. 안내서의제한조건 웹서비스를이용하는클라이언트의경우에는본안내서의내용이외에웹서비스를위한추가작업이필 요하다. 참고 웹서비스의자세한내용은 "JEUS Web Service 안내서 " 를참고한다. 안내서에대하여 xi
안내서구성 본안내서는총 4개의장으로구성되어있다. 제1장애플리케이션클라이언트 JEUS 서버와는별도의 JVM에서수행되는애플리케이션클라이언트에대해서설명한다. 제2장고급애플리케이션클라이언트 클라이언트컨테이너없이동작하는클라이언트와애플리케이션클라이언트가사용할수있는서비스에대해설명한다. 제3장애플릿클라이언트 JEUS에서애플릿프로그램을어떻게작성하고설정및실행하는지에대해설명한다. 제4장 JNLP 클라이언트 클라이언트와이에대한 JNLP 파일를웹애플리케이션에 Deploy하는방법과실제로사용자가클라이언트를실행하는방법에대해설명한다. xii JEUS Application Client 안내서
안내서규약 표기 <<AaBbCc123>> <Ctrl>+C [Button] 진하게 " "( 따옴표 ) ' 입력항목 ' 하이퍼링크 > +---- ---- 참고주의 [ 그림 1.1] [ 표 1.1] AaBbCc123 의미프로그램소스코드의파일명 Ctrl과 C를동시에누름 GUI의버튼또는메뉴이름강조다른관련안내서또는안내서내의다른장및절언급화면 UI에서입력항목에대한설명메일계정, 웹사이트메뉴의진행순서하위디렉터리또는파일있음하위디렉터리또는파일없음참고또는주의사항주의할사항그림이름표이름 Java 코드, XML 문서 [ command argument ] < xyz > 옵션파라미터 < 와 > 사이의내용이실제값으로변경됨선택사항. 예 ) A B: A나 B 중하나파라미터등이반복되어서나옴 안내서에대하여 xiii
시스템사용환경 본안내서는모든예제와환경구성을 Microsoft Windows 의스타일을따랐다. UNIX와같은다른환경에서작업하는사람은몇가지사항만고려하면별무리없이사용할수있다. 대표적인것이디렉터리구분자인데, Windows 스타일인 \ 를 UNIX 스타일인 / 로바꿔서사용하면무리가없다. 이외에환경변수도 UNIX 스타일로변경해서사용하면된다. 그러나 Java 표준을고려해서문서를작성했기때문에, 대부분의내용은동일하게적용된다. 관련안내서 안내서 JEUS Server 안내서 JEUS EJB 안내서 JEUS Web Container 안내서 JEUS Web Service 안내서 JEUS WebAdmin 안내서 JEUS Security 안내서 JEUS Application & Deployment 안내서 설명 JEUS 시스템과서버의개요와시스템관리를위한안내서이다. JEUS EJB 엔진과 EJB 모듈의 Deploy에대해기술한안내서이다. JEUS 웹컨테이너의관리에대해내용과 Java EE WAR Archive, 서블릿 /JSP의관리및 Deploy하는방법에대해기술한안내서이다. JEUS 내의웹서비스에대해기술한안내서이다. JEUS 웹관리툴인 WebAdmin을사용한 JEUS의설정및제어, 모니터링, 클러스터링, 리소스설정및관리에대해기술한안내서이다. JEUS에서 Security 시스템의설정및운용방법과 Security 관련프로그래밍에대해기술한안내서이다. Java EE 애플리케이션을 JEUS에디플로이하기위한여러가지방법과툴에대해기술한안내서이다. 참고자료 The Java EE 5 Specification The JNLP Specification The Java WebStart Secification xiv JEUS Application Client 안내서
연락처 Korea TmaxSoft Co., Ltd 272-6, Seohyeon-dong, Bundang-gu, Seongnam-si, Gyeonggi-do, 463-721 South Korea Tel: +82-31-8018-1000 Fax: +82-31-8018-1115 Email: info@tmax.co.kr Web (Korean): http://www.tmax.co.kr 기술지원 : http://technet.tmaxsoft.com USA TmaxSoft, Inc. 560 Sylvan Avenue Englewood Cliffs, NJ 07632 U.S.A Tel: +1-201-567-8266 Fax: +1-201-567-7339 Email: info@tmaxsoft.com Web (English): http://www.tmaxsoft.com Japan TmaxSoft Japan Co., Ltd. 5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073 Japan Tel: +81-3-5765-2550 Fax: +81-3-5765-2567 Email: info@tmaxsoft.co.jp Web (Japanese): http://www.tmaxsoft.co.jp 안내서에대하여 xv
China TmaxSoft China Co., Ltd. Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan, Chaoyang District, Beijing, China, 100027 China Tel: +86-10-6410-6145~8 Fax: +86-10-6410-6144 Email: info.cn@tmaxsoft.com Web (Chinese): http://www.tmaxsoft.com.cn xvi JEUS Application Client 안내서
제 1 장애플리케이션클라이언트 본장에서는 JEUS 서버 ( 엔진컨테이너 ) 와는별도의 JVM 에서수행되는애플리케이션클라이언트에대해 서설명한다. 1.1. 개요 일반적으로 Java EE 애플리케이션을호출하거나 Java EE의서비스를제공받기위해서는 JEUS의클라이언트컨테이너에서구동되는애플리케이션클라이언트 (Application Client) 모듈을사용한다. 애플리케이션클라이언트는 Java EE 환경을사용하는 standalone 클라이언트로 Java EE 스펙에정의되어있는애플리케이션클라이언트컨테이너 (Application Client Container) 에서구동되는애플리케이션이다. 애플리케이션클라이언트모듈은 JEUS 클라이언트의한형태이다. 이형태는클라이언트 / 서버시스템이나테스트및디버깅을하는경우유용하게사용할수있는클라이언트이다. JEUS 애플리케이션클라이언트는클라이언트컨테이너를사용해서 Naming Service, Scheduler, Security 등과같은 JEUS 서비스를사용할수있다. 클라이언트컨테이너를사용하지않더라도 JEUS 클라이언트라이브러리를사용하면 JNDI, Security 등의일부 Java EE Service를사용할수는있지만 Dependency Injection, JEUS Scheduler 등에해당하는서비스는사용할수가없다. 참고 1. Java EE 기반의애플리케이션클라이언트의자세한내용은 Java EE 스펙을참고한다. 2. JEUS XML 스키마의자세한내용은 "JEUS Reference Book" 을참고한다. 1.2. 프로그램작성 본절에서는 JEUS 클라이언트와서버환경의아키텍처에대해알아보고, 간단한샘플코드를예로들어 설명한다. 1.2.1. 프로그램구조 애플리케이션클라이언트는서버와는다른 JVM에서실행되는클라이언트프로그램이다. 애플리케이션클라이언트는 main() 메소드를호출해서실행하고, 가상머신이종료되면실행을마친다. 다른 Java EE 애플리케이션컴포넌트처럼애플리케이션클라이언트는시스템서비스를제공하는클라이언트컨테이너에서동작한다. 클라이언트컨테이너는다른 Java EE 컨테이너에비해서적은양의시스템리소스를사용한다. 클라이언트컨테이너는일반애플리케이션클라이언트에서 JEUS가제공하는 Java EE 서비스를이용할수있는환경을제공한다. 제 1 장애플리케이션클라이언트 1
이서비스에는 JNDI, Scheduler, Security, 그리고 JNDI 서비스를통해서 JEUS에바인딩되어있는애플리케이션컴포넌트 (EJB) 및시스템리소스들 (JDBC DataSource, JMS Connection Factory 등 ) 에대한이용이포함된다. [ 그림 1.1] 애플리케이션 / 애플릿클라이언트아키텍처 JEUS Clients Web Browser JVM Applet Application JEUS Client Runtime JVM Application Client JEUS Client Runtime JVM Application Client JEUS Client Container JEUS Manager JNDI Security Engine Container EJB Transaction Manager 1.2.2. 예제 애플리케이션클라이언트는일반적인 Java 프로그램과마찬가지로반드시 public으로선언된 main 메소드를가지고있어야한다. 다음은 Java EE 5 style로작성된예제로 Injection을통해 EJB를호출한다. [ 예 1.1] <<HelloClient.java>> package helloejb; import java.io.*; import javax.ejb.ejb; public class HelloClient { @EJB private static Hello hello; public static void main(string[] args) { 2 JEUS Application Client 안내서
} } System.out.println("EJB output : " + hello.sayhello()); 참고 Java EE 애플리케이션클라이언트프로그래밍에관련된내용은 Java EE 5 specification(http://ja va.sun.com/javaee) 을참고한다. 1.3. Descriptor 생성 본절에서는 Deployment Descriptor 를작성하고생성하는방법에대해설명한다. 1.3.1. Deployment Descriptor 작성 Deployment Descriptor 작성방법은다음과같이 2가지로나누어진다. Java EE Deployment Descriptor Java EE 스펙에서는클라이언트모듈에대한 Deployment Descriptor를정의하고있는데, 이는 WAS에관계없이표준적인설정을담고있다. Java EE 5 이후부터는기존과는달리표준 Descriptor 파일이없어도되며, 필요한설정은 Annotation을통해설정가능하다. 따라서위의 [ 예 1.1] 도별도의 application-client.xml이없이도동작한다. 표준 XML Descriptor에대한자세한설명은 Java EE 스펙을참고한다. JEUS Deployment Descriptor 서버와애플리케이션클라이언트가통신할때클라이언트모듈에대한정보가필요한데, Deployment Descriptor는이러한정보들을가지고있는 XML 설정이다. 클라이언트를위한 Deployment Descriptor는 META-INF\jeus-client-dd.xml이다. Descriptor를이용하여각각의애플리케이션클라이언트를클라이언트컨테이너에디플로이할때에어떤서비스를사용할지결정할수있다. 또한실행하는경우에도별도의수정없이 Descriptor만수정하여해당하는애플리케이션클라이언트에게적용할수있다. 일반적으로클라이언트가사용하는리소스등을지정하기위해사용하는데, 위의 [ 예 1.1] 에대해서는이 Descriptor를사용하지않아도되므로생략한다. 참고 jeus-client-dd.xml 에대한자세한설명은 "JEUS Reference Book" 을참고한다. 제 1 장애플리케이션클라이언트 3
1.3.2. Deployment Descriptor 생성 Deployment Descriptor 를생성할때필요하다면 JEUS 에서클라이언트모듈을디플로이하기전에 jeusclient-dd.xml 파일을작성한다. 다음은 Deployment Descriptor를작성한 XML 파일의예이다. XML에서클라이언트가사용하는환경변수, EJB 애플리케이션이바인딩된이름, 바인딩된 JDBC Data Source의이름, JMS Queue의 JNDI 바인딩이름을지정하고있다. 환경변수를제외하고는 applicationclient.xml의 <ref-name> 에실제바인딩된 JNDI 이름을 <export-name> 으로지정한다. [ 예 1.2] <<jeus-client-dd.xml>> <jeus-client-dd> <env> <name>year</name> <type>java.lang.integer</type> <value>2002</value> </env> <ejb-ref> <jndi-info> <ref-name>count</ref-name> <export-name>count_bean</export-name> </jndi-info> </ejb-ref> <res-ref> <jndi-info> <ref-name>datasource</ref-name> <export-name>oracle_datasource</export-name> </jndi-info> </res-ref> <res-env-ref> <jndi-info> <ref-name>jms/salaryinfo</ref-name> <export-name>jms/salary_info_queue1</export-name> </jndi-info> </res-env-ref> </jeus-client-dd> 참고 jeus-client-dd.xml 파일의각 Element 에대한설명은 "JEUS Reference Book" 을참고한다. 4 JEUS Application Client 안내서
1.4. 패키징 클라이언트모듈의패키징은다음방식중하나를사용할수있다. 수동패키징필요하다면사용자의컴퓨터에설치되어있는텍스트에디터나 XML 에디터를사용해서 Deployment Descriptor XML 파일을생성하고, 필요한파일을모아서 Java에서제공하는 jar 툴을이용하여클라이언트모듈에대한 jar 파일을생성한다. 애플리케이션클라이언트를패키징하기위해서는애플리케이션을구성하고있는클래스파일과필요하다면 application-client.xml, jeus-client-dd.xml 파일이포함되어있어야한다. 콘솔에서는 jar 명령어를이용하여클라이언트모듈에대한 jar 파일을생성한다. 표준에서는 jar 파일의 MANIFEST.MF에 Main-Class 속성으로이 jar 파일이실행될때사용할 Main Class를지정할수있다. 이경우 JEUS 클라이언트컨테이너는 Main Class를알려주지않아도자동으로이클래스를실행한다. 다음은 jar 명령어를이용하여 jar 파일을생성하는예이다. jar cvf hello-client.jar * IDE 를이용한패키징 Eclipse 나 NetBeans, IntelliJ IDEA 와같이 Java EE 환경을지원하는 IDE 툴에서생성한다. 이방법은 각 IDE 의도움말을참고한다. 1.5. Deploy 애플리케이션클라이언트모듈은 수동 으로직접디플로이를진행하거나 JEUS WebAdmin를이용한다. 모듈안에는필요에따라 Java EE 표준 Descriptor 파일인 application-client.xml과 JEUS에서제공하는 jeus-client-dd.xml이있다. 애플리케이션클라이언트에대한모듈파일을생성한후해당파일을원하는위치로이동한다. 만약웹서비스클라이언트로동작하는기능이있다면추가로 jeusadmin이나 WebAdmin을통해디플로이를수행하거나 appcompiler를사용해야웹서비스 Stub이생성된다. 참고 WebAdmin 을이용하는방법에대해서는 "JEUS WebAdmin 안내서 " 를참고하고, 웹서비스클라이 언트의 Deploy 에대해서는 "JEUS Web Service 안내서 " 를참고한다. 제 1 장애플리케이션클라이언트 5
1.6. 실행 본절에서는각서비스별로추가적으로필요한 JEUS 라이브러리와콘솔에서모듈을실행하는방법에대해설명한다. 애플리케이션클라이언트로웹서비스를사용할경우, 라이브러리실행단계에서기본라이브러리인 JEUS_HOME/lib/client/clientcontainer.jar 외에추가적으로필요한라이브러리들이존재한다. 이들은대부분 JEUS_HOME/lib/system( 이하 SYSTEM_LIB_DIR) 아래위치하며다음의표를참고한다. [ 표 1.1] 서비스별추가적으로필요한 JEUS 라이브러리 서비스 JMS(Java Message Service) Web Service JEUS 라이브러리 - SYSTEM_LIB_DIR/jms.jar - SYSTEM_LIB_DIR/jeus-ws.jar - SYSTEM_LIB_DIR/activation.jar - SYSTEM_LIB_DIR/mail.jar - SYSTEM_LIB_DIR/jaxb-impl.jar - SYSTEM_LIB_DIR/saaj-impl.jar - SYSTEM_LIB_DIR/jaxws-rt.jar - SYSTEM_LIB_DIR/sjsxp.jar - SYSTEM_LIB_DIR/streambuffer.jar - SYSTEM_LIB_DIR/stax-ex.jar - SYSTEM_LIB_DIR/resolver.jar - SYSTEM_LIB_DIR/FastInfoset.jar - SYSTEM_LIB_DIR/wsit.jar JMX(Java Management extensions) SYSTEM_LIB_DIR/jmxremote.jar 1.6.1. 콘솔에서실행 콘솔에서모듈을실행하기위해서 appclient를사용한다. appclient는 JEUS_HOME\bin에존재하는스크립트로클라이언트컨테이너를통해애플리케이션클라이언트모듈을실행한다. JEUS에서제공하는클라이언트컨테이너의 command line은다음과같은형식을가진다. 사용법 appclient -client client_jar_path [-main main_class] [-cp classpath] application_arguments... 다음은명령어옵션에대한설명이다. 6 JEUS Application Client 안내서
옵션 -client client_jar_path [-main main_class] [-cp classpath] 설명실행할애플리케이션클라이언트의패스를지정한다. 애플리케이션클라이언트의 Main-Class를지정한다. 클라이언트의클래스패스로지정된곳에 META-INF\MANIFEST.MF에 Main-Class가지정되어있다면이옵션이필요하지않다. 필요한경우클라이언트실행에필요한클래스패스를지정한다. 예제위의예제를실행하면다음과같다. 애플리케이션클라이언트가정상적으로실행되기위해서 Hello EJB 가디플로이되어있어야한다. runappclient: [echo] appclient -client C:\jeus\samples\client\hello/hello-client/dist/ hello-client.jar [exec] JEUS prepend classpath : file:/c:/jeus/jeus6/classes/ [exec] AppClientContainer - JEUS 6.0 [exec] [2007.02.13 16:24:24][2][b008] [client-10] starting client application [helloejb.helloclient:] [exec] EJB output : Hello EJB! 위의내용중 JEUS log를출력하지않고싶다면다음을설정한다. -Djeus.log.level=OFF log 설정에대한자세한설명은 "JEUS Server 안내서 " 를참고한다. 제 1 장애플리케이션클라이언트 7
제 2 장고급애플리케이션클라이언트 본장에서는이전장에서설명한애플리케이션클라이언트의설명보다좀더고급의모듈구현에대해서 설명한다. 2.1. 개요 Java EE 스펙에제시된클라이언트컨테이너를사용하지않고도간편하게일반 Java 클래스를실행하듯이 JEUS 클라이언트를실행할수있다. 이를위해서클라이언트컨테이너가 Dependency Injection을하는리소스의종류와이들의 JNDI 디폴트바인딩이름을살펴본다. 또한클라이언트컨테이너없이동작하는클라이언트와애플리케이션클라이언트가사용할수있는서비스 ( 보안설정, 트랜잭션 ) 에대해자세히설명한다. 클라이언트컨테이너를사용하지않고 JEUS 클라이언트를실행하는경우에는컨테이너의 Dependency Injection 서비스를받을수없음에유의해야한다. 또한보안설정을함으로써 JEUS가제공하는다양한서비스를실행할수있고, 트랜잭션기능을사용하면클라이언트가사용한애플리케이션과리소스들을글로벌트랜잭션으로관리할수있다. 2.2. Dependency Injection 본절에서설명하는 Injection 의내용은애플리케이션클라이언트를포함하여웹애플리케이션, EJB 애플 리케이션등에모두적용되는내용이다. Injection이가능한리소스는 EJB 객체와 JNDI로매핑이가능한 Environment Variable 등이있으며기본적으로애플리케이션컴포넌트의 JNDI Context인 java:comp/env context에서지정된이름을찾는다. 실제리소스는 JNIDI 글로벌 Context에바인딩되어있으므로이글로벌바인딩이름을알아야한다. 리소스들은자신의 JNDI 글로벌바인딩이름을갖고있다. EJB 애플리케이션을예로들면이이름은다음중에한가지방법으로설정되어야한다. JEUS에서인식하는 jeus-ejb-dd.xml의 <export-name> 을사용 표준에있는 ejb-jar.xml의 <mapped-name> 을사용 EJB 애플리케이션에지정된 Annotation의 mappedname을사용 "JEUS EJB 안내서 " 에서제시되어있는 JEUS의기본 JNDI 이름으로 EJB가바인딩클라이언트컨테이너가없는환경등에서 JNDI를직접사용하여 EJB를얻을경우에는이런기본 JNDI 이름이정해지는규칙을알아야한다. 이렇게어떤이름으로바인딩될지개발자가알기힘들기때문에실제개발에서는위의방법중어느하나의방법으로 JNDI 바인딩이름을명시하는것이일반적이다. 제 2 장고급애플리케이션클라이언트 9
리소스를 Injection하는쪽에서는 JEUS 자체의 Descriptor인 jeus-ejb-dd.xml, jeus-web-dd.xml, jeus-clientdd.xml 등에서 Injection에사용할 JNDI 글로벌바인딩이름을지정하거나 ejb-jar.xml, web.xml, applicationclient.xml 등의표준 Descriptor의 mapped-name, 혹은 Annotation의 mappedname에지정된값을사용하여매핑한다. 이모든값이지정되어있지않는경우에는 JEUS의기본규칙에따른이름으로 Injection 을시도한다. 실제개발에서는 Annotation의 mappedname으로 JNDI 글로벌바인딩이름을지정하기보다는 XML을사용하여지정하는것이좋다. 특히여러곳에서운영할애플리케이션이라면그환경에맞는글로벌이름을사용해야하므로 XML을사용해야한다. Injection은 Annotation을한변수와 setter method에대해서이루어지지만 Annotation을하지않아도 XML Descriptor에서지정한변수와 setter method에대해 injection이가능하다. Injection의자세한설명은 Java EE 5 Specification을참고하고, Injection이가능한리소스의자세한설명은해당안내서의 "5. Resources, Naming and Injection" 을참고한다. 참고 EJB 애플리케이션에대한 EJBContext injection 등은 "JEUS EJB 안내서 " 를참고한다. 다음의예는이들중 Annotation의 mappedname을사용한 EJB 애플리케이션을클라이언트에서 Injection 하는예제이다. StatelessEJB1 애플리케이션이 MyEJB1이란이름을 JNDI 글로벌바인딩이름으로사용하므로클라이언트에서는 @EJB Annotation의 mappedname에같은이름을지정한다. 또한클라이언트에서 Injection 대신 JNDI Lookup을사용한다면 JNDI 글로벌바인딩이름으로바로 Lookup을하거나클라이언트컨테이너등에서동작하는클라이언트라면 application-client.xml 등을이용하여애플리케이션 Context에등록된이름인 java:comp/env/ejb/sless1를사용할수있다. [ 예 2.1] EJB 참조 Injection import ejb1.remotesession; @Stateless(name="StatelessEJB1", mappedname="myejb1") public class StatelessEJB1 implements RemoteSession, LocalSession {... }... @EJB(name="sless1", beanname="statelessejb1", mappedname="myejb1") private RemoteSession sless1;... RemoteSession session = context.lookup("myejb1");... // with client container and application-client.xml descriptor RemoteSession session = context.lookup("java:comp/env/ejb/sless1"); 10 JEUS Application Client 안내서
2.2.1. EJB Injection EJB 참조의경우 Injection을위해다음과같은바인딩이름을사용한다. 변수타입이비즈니스인터페이스인경우 mappedname이있는경우에 mappedname + "#" + Business_Interface_Name을 Lookup할때사용할글로벌이름으로사용한다. 위예제의경우 MyEJB1#RemoteSession을사용한다. 만약 EJBHome 인터페이스를사용하지않고비즈니스인터페이스만있는 EJB라면 mappedname을글로벌이름으로사용할수있다. EAR이나 EJB JAR 등으로디플로이된경우 ejb-jar.xml에 ejb-link가주어졌거나 Annotation에 beanname 이있을때에는동일애플리케이션내의 EJB를찾아그 EJB의 mappedname을글로벌이름으로사용하여 Lookup한다. 만약이런정보가없는경우에는비즈니스인터페이스의이름으로같은애플리케이션내에서 EJB를찾아그 EJB의 mappedname을글로벌이름으로이용한다. 마지막으로비즈니스인터페이스이름으로 JNDI에서 Lookup한다. 위의예제인경우 ejb1.remotesession 이름으로 Lookup한다. 이방식은 EJB Deploy의경우 mappedname이없을때기본바인딩이름을사용하는것이다. 변수타입이 EJBHome/EJBObject 인터페이스의하위인터페이스인경우 mappedname이있는경우에 mappedname을글로벌이름으로사용한다. EAR이나 EJB JAR 등으로디플로이된경우 ejb-jar.xml에 ejb-link가주어졌거나 Annotation에 beanname 이있을때에는동일애플리케이션내의 EJB를찾아그 EJB의 mappedname을사용하여 Lookup한다. 만약이런정보가없는경우에는변수타입의인터페이스이름으로같은애플리케이션내에서 EJB를찾아그 EJB의 mappedname을글로벌이름으로이용한다. 마지막으로비즈니스인터페이스이름으로 JNDI에서 Lookup한다. 2.2.2. 리소스 Injection 리소스인경우에는 @Resource Annotation을사용할수있다. mappedname이지정된경우에는이이름을리소스의 JNDI 글로벌바인딩이름으로 Lookup한다. 지정되어있지않은경우에는 @Resource의 name 속성값을 JNDI 글로벌바인딩이름으로사용한다. name 속성값이지정되지않은경우에는스펙에따라애플리케이션클래스의이름 + / + 변수혹은 setter method의프로퍼티이름이사용된다. 다음의예제에서는 jdbc/db2 이름으로 JNDI Lookup을한다. 만약 name 속성이지정되지않았다면 test.client/mydatasource3로 Lookup한다. 참고 name이있는경우혹은 name 속성이지정되지않을경우의기본값은스펙으로정해져있지만이값은애플리케이션 Context에매핑되는이름이고실제 JNDI 글로벌바인딩이름은벤더마다다른규칙을갖고있다. 따라서호환성을위해서는 mappedname 등을사용하는것이좋다. 제 2 장고급애플리케이션클라이언트 11
[ 예 2.2] 리소스의 Injection package test; class Client { @Resource(name="jdbc/DB2") // default mapping if no mapped-name private javax.sql.datasource mydatasource3;... } 2.2.3. 그외의 Injection 이외에도 @WebServiceRef, @PersistenceUnit, @PersistenceContext 등의 Annotation 을이용해서각각 웹서비스객체, EntityManager 객체, EntityManagerFactory 객체등을 Injection 으로얻을수있다. 참고 그외자세한설명은 Java EE 5 Specification 을참고한다. 2.3. Dependency Injection 을사용할수없는클라이언트 애플리케이션컨테이너를사용하지않고도 JEUS의 JNDI 등을통해 JEUS의리소스 (Resource) 와애플리케이션을사용할수있다. 이경우에는 JEUS_HOME\lib\client의 jclient.jar 파일을클래스패스로설정하고작성한클라이언트를수행한다. 하지만이경우 Dependency Injection은사용할수없으므로다음과같이소스를변경해서사용해야한다. 예제에서사용한 EJB 애플리케이션의바인딩이름은 JEUS의기본바인딩이름규칙에따른이름을사용한다. 이클라이언트는클라이언트컨테이너위에서도동작한다. 즉, 클라이언트컨테이너를사용하지않는모든클라이언트는클라이언트컨테이너위에서도동작한다. [ 예 2.3] <<HelloClient.java>> package helloejb; import java.io.*; import javax.ejb.ejb; import javax.naming.context; import javax.naming.initialcontext; import java.util.hashtable; /** * HelloEJB application client */ public class HelloClient { private static Hello hello; 12 JEUS Application Client 안내서
public static void main(string[] args) { try { Hashtable env = new Hashtable(); env.put(context.initial_context_factory,"jeus.jndi.jnscontextfactory"); Context context = new InitialContext(env); hello = (Hello) context.lookup("helloejb.hello"); } } System.out.println("EJB output : " + hello.sayhello()); } catch (Exception ex) { ex.printstacktrace(); } 클라이언트패키징은 XML 파일을처리하는클라이언트컨테이너에서실행하는것이아니므로표준, JEUS XML 파일없이 JAR 파일로작성한다. 디플로이는마찬가지로자신이원하는위치에 JAR 파일을복사한다. 실행할때는일반 Java 클래스를실행하는것과같이위의클라이언트클래스를실행한다. 실행한결과는다음과같다. C:\>java -cp %JEUS_HOME%\lib\client\jclient.jar;c:\hello-client.jar helloejb.helloclient EJB output : Hello EJB! 2.4. 보안설정 클라이언트에서는 JEUS가제공하는 Java EE의서비스를사용할때자신이이서비스를사용할수있는권한이있는지를확인할수있도록클라이언트의사용자명, 패스워드를클라이언트런타임에지정해야한다. 이런서비스에는 EJB 애플리케이션, JMS 리소스등이있다. 이를지정하는방법은다음의 3가지가있다. jeus-client-dd.xml을사용하는방법 jeus-client-dd.xml의 <security-info> 를지정하면클라이언트컨테이너에서애플리케이션을수행하기전에주어진사용자명, 패스워드로로그인한다. 이후애플리케이션에서는 JEUS 서비스를사용할때이사용자명으로인증을시도한다. jeus-client-dd.xml 설정의자세한설명은 "JEUS Reference Book" 을참고한다. 다음은설정의예이다. [ 예 2.4] <<jeus-client-dd.xml>> <jeus-client-dd>... <security-info> <provider-node-name>jeusnode</provider-node-name> 제 2 장고급애플리케이션클라이언트 13
<user>jeus</user> <passwd>jeuspass</passwd> </security-info>... </jeus-client-dd> JNDI Context를사용하는방법애플리케이션에서 JNDI Context를생성할때 JNDI의프로퍼티를이용해서원하는사용자명, 패스워드로로그인할수있다. 이후로그인한사용자명으로인증이이루어진다. 이방법은클라이언트컨테이너를사용하지않을경우에도가능하다. JNDI 설정은 "JEUS Server 안내서 " 를참고한다. [ 예 2.5] <<Client.java>> Hashtable env = new Hashtable(); env.put(context.initial_context_factory, "jeus.jndi.jnscontextfactory"); env.put(context.provider_url, "jeusnode"); env.put(context.security_principal, "jeus"); env.put(context.security_credentials, "jeuspass"); Context context = new InitialContext(env); JEUS Security API 를직접사용하는방법 JEUS 의 Security API 를사용하여로그인할수있다. Security API 설명은 "JEUS Security 안내서 " 를참 고한다. 2.5. 트랜잭션 클라이언트에서사용하는 EJB 애플리케이션, JDBC DataSource, JMS Connection Factory와 Destination 등을하나의글로벌트랜잭션, 혹은 XA 트랜잭션으로사용하기위해서는 UserTransaction을사용한다. UserTransaction의자세한설명은 Java EE 5 Specification (http://java.sun.com/javaee) 을참고한다. 클라이언트에서사용하는트랜잭션매니저는리소스를직접관리하는지의여부에따라서버트랜잭션매니저와클라이언트트랜잭션매니저로나눌수있다. 트랜잭션매니저의자세한설명은 "JEUS Server 안내서 " 를참고한다. 14 JEUS Application Client 안내서
제 3 장애플릿클라이언트 본장에서는 JEUS 에서애플릿프로그램의작성, 설정및실행방법에대해설명한다. 3.1. 개요 애플릿은웹브라우저에서실행되는 Java 애플리케이션이다. 웹브라우저에서실행되는애플릿에서 JEUS 의 Java EE 서비스를사용하기위해서는애플릿컨테이너를사용한다. 기본적으로애플릿은애플리케이션클라이언트이지만 JEUS에서는아직경량클라이언트컨테이너를제공하지않기때문에 JEUS의라이브러리들에바로접근할수없는애플릿은컨테이너없이바로 JEUS의 Java EE 서비스를사용하는방법으로구현한다. 애플릿을사용하면브라우저에서 Java 애플리케이션을수행할수있다. 더불어 JEUS의기능을사용하는클라이언트로동작할수있다. 3.2. 프로그램작성 애플릿이구동되는데필요한파일들은웹애플리케이션내에존재한다. HTML의 JAVA_CODEBASE가 "." 으로되어있기때문에이 jar 파일들은 HTML 문서가디플로이되는웹애플리케이션에서 HTML 문서와같은디렉터리에존재해야한다. 본절에서는사용자가참고할수있는샘플예제를설명한다. 3.2.1. 예제 애플릿애플리케이션은 Applet 또는 JApplet 클래스를상속받고, start() 메소드를구현해야한다. 다음예제는클라이언트컨테이너를통해서가아닌독립적으로수행되는클라이언트의예이다. 따라서, Dependency Injection을사용하지않고 JNDI API를사용하여해당 EJB를직접 Lookup하게되어있다. 앞의클라이언트컨테이너와동일한 EJB를사용하고이경우 EJB는 helloejb.hello라는인터페이스이름을바인딩 name으로사용한다. [ 예 3.1] <<HelloClient.java>> package helloejb; import javax.naming.context; import javax.naming.initialcontext; import java.applet.applet; import java.util.hashtable; 제 3 장애플릿클라이언트 15
import java.awt.borderlayout; import java.awt.font; import java.awt.event.*; import javax.swing.*; public class HelloClient extends JApplet { public void start() { try { Hashtable env = new Hashtable(); env.put(context.initial_context_factory,"jeus.jndi.jnscontextfactory"); Context context = new InitialContext(env); Hello hello = (Hello) context.lookup("helloejb.hello"); System.out.println("EJB output : " + hello.sayhello()); } } JLabel label = new JLabel(hello.sayHello()); label.setfont(new Font("Helevetica", Font.BOLD, 15)); getcontentpane().setlayout(new BorderLayout()); getcontentpane().add(label, BorderLayout.CENTER); setsize(500, 250); setvisible(true); } catch (Exception ex) { ex.printstacktrace(); } 참고 EJB 가어떤이름으로 JNDI 에바인딩될지는 "JEUS EJB 안내서 " 를참고한다. 3.2.2. HTML 예제 HTML 문서에는어떤애플릿을호출하고이애플릿의클래스들의위치를지정한다. 예제에서는위의애플리케이션클래스와 helloejb.hello EJB 인터페이스가 hello-client.jar에포함되어있다고가정한다. jclient.jar 는 JEUS_HOME\lib\client에존재하는클라이언트용 JEUS 라이브러리이다. [ 예 3.2] <<index.html>> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>hello JavaEE</title> </head> <body> 16 JEUS Application Client 안내서
<center> <h1>hello JavaEE Sample Applet!</h1> <APPLET CODE = "helloejb.helloclient" JAVA_CODEBASE = "." ARCHIVE = "hello-client.jar,jclient.jar" WIDTH = 300 HEIGHT = 300/> </APPLET> </center> </body> </html> 참고 HTML 문서를브라우저에관계없이사용하고또한브라우저가실행되는곳에 JDK가설치되어있지않다면이를설치하도록유도할수있다. HTML 문서로변환하기위해서는 JDK의 htmlconverter를이용한다. 자세한내용은 http://java.sun.com/j2se/1.5.0/docs/guide/plugin/developer_guide/html_con verter.html를참고한다. 3.3. Deploy 애플릿은기본적으로 HTML 문서에서접근하므로이 HTML 문서를웹으로전송하기위해서는웹애플리케이션이필요하다. 애플릿을실행하기전에웹애플리케이션과 EJB의디플로이가완료되어야한다. 웹애플리케이션 Deploy 웹애플리케이션을생성하고 HTML 문서및 ARCHIVE에지정된 jar 파일들을추가한다. 웹애플리케이션의생성과디플로이에대한자세한내용은 "JEUS Application & Deployment 안내서 " 를참고한다. EJB Deploy 웹애플리케이션디플로이가완료되면 EJB 애플리케이션을디플로이한다. 3.4. 실행 웹브라우저를실행하고 HTML 문서 URL을입력하여애플릿을실행한다. 애플릿의경우 Java Security 모델에따라 java.policy에지정된대로 Access control을한다. 따라서 java.pol icy 파일에애플릿에서사용하는클래스에대해 permission을제공해야애플릿이문제없이수행된다. 참고 java.policy 설정은 http://java.sun.com/j2se/1.5.0/docs/guide/deployment/deployment-guide/securi ty.html 문서를참고한다. 제 3 장애플릿클라이언트 17
3.4.1. 웹브라우저에서실행 웹브라우저는 HTML 페이지내의 <applet> 태그로접속한다. 예제의애플릿은 Swing을사용하므로다음의주소로웹브라우저를통해서접근할수있다. http://localhost:8088/hello/index.html 3.4.2. 애플릿뷰어에서실행 테스트과정에서는브라우저를통하지않고 JDK에포함된애플릿뷰어를사용하여애플릿을수행할수있다. 이경우 Exception 등을바로확인할수있어서브라우저에서테스트하는것보다쉽게개발할수있다. appletviewer index.html 18 JEUS Application Client 안내서
제 4 장 JNLP 클라이언트 본장에서는클라이언트와이에대한 JNLP 파일를웹애플리케이션에디플로이하는방법과실제로사용 자가클라이언트를실행하는방법에대해설명한다. 4.1. 개요 애플리케이션의사이즈가크고버전이자주변경된다면 JNLP를사용한다. JNLP는 Java Network Launching Protocol의약자로소프트웨어컴포넌트의배포및실행에관한프로토콜이다. 프로토콜을이용하여클라이언트애플리케이션 ( 이하클라이언트 ) 을웹서버를통해자동으로다운받아클라이언트를실행할수있는데이를 Java Web Start라고한다. JNLP를통해다운받은클라이언트도다른것들과마찬가지로 JEUS를사용할수있다. JNLP를사용하면클라이언트프로그램의배포가간편하고버전이업그레이드됨에따라자동으로필요한바이너리를전송받으므로지속적인배포가가능하다. 또한 JDK 홈디렉터리의 sample\jnlp에는여러가지 JNLP 샘플이있으므로이디렉터리아래에위치한 README 파일을따라실행하면 JNLP를쉽게연습할수있다. 본안내서에서 JNLP에대한상세한정보를제공하지않는다. 그러므로 JNLP에대해서어느정도의사전지식이필요하다. JLNP를통해서 jar 파일을배포할때는 Java Permission 문제가항상따라다니기때문에대부분 sign을하게된다. JEUS에서제공하는 jclient.jar, clientcontainer.jar 등의파일들은 sign이되어있지않으므로반드시다른 jar 파일들과함께 sign한다. 참고 JNLP 의자세한내용은 http://java.sun.com/products/javawebstart/index.jsp 를참고한다. 4.2. 프로그램작성 본절에서는웹애플리케이션의구성방법에대해설명한다. 웹애플리케이션구성 JNLP 파일을웹에서얻고거기에정의된 JAR 파일들을웹서버에서다운받기위해서는 JNLP 프로토콜을구현한서블릿이필요하다. JEUS에서는이를직접제공하지않으므로 JDK 1.5에서제공하는샘플 JNLP 서블릿을사용한다. 이런서블릿을구현해둔 jnlp-servlet.jar 파일은 Sun JDK 1.5 기준으로다음의디렉터리에위치한다 (IBM JDK 1.5는 lib 디렉터리 ). sample\jnlp\servlet 제 4 장 JNLP 클라이언트 19
jnlp-servlet.jar 파일을웹애플리케이션의 WEB-INF\lib 에복사해두고다음과같이 web.xml 을작성하면이 서블릿이 JNLP 프로토콜에따라 JNLP 파일과리소스파일들을클라이언트로전송해준다. 참고 JNLP 프로토콜에따라리소스파일을전송하는 JnlpDownloadServlet에대한자세한설명은 http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/downloadservlet guide.html를참고한다. 다음은 JNLP 서블릿을위한 web.xml 예제이다. [ 예 4.1] JNLP 서블릿 : <<web.xml>> <?xml version="1.0" encoding="utf-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>jnlpdownloadservlet</servlet-name> <servlet-class>jnlp.sample.servlet.jnlpdownloadservlet</servlet-class> <init-param> <param-name>loglevel</param-name> <param-value>debug</param-value> </init-param> <init-param> <param-name>logpath</param-name> <param-value>jnlpdownloadservlet.log</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>jnlpdownloadservlet</servlet-name> <url-pattern>*.jnlp</url-pattern> </servlet-mapping> </web-app> 다음은 HelloClient 클래스의소스이다. JNLP 클라이언트는일반클라이언트동일하다. JNLP 클라이언트는콘솔창이없으므로여기서는애플릿과같이 Swing을사용하여 GUI 창을만들었다. [ 예 4.2] <<HelloClient.java>> package helloejb; import javax.naming.context; import javax.naming.initialcontext; import java.util.hashtable; 20 JEUS Application Client 안내서
import java.awt.borderlayout; import java.awt.font; import java.awt.event.*; import javax.swing.*; public class HelloClient extends JFrame { public static void main(string[] args) { new HelloClient(); } public HelloClient() { try { Hashtable env = new Hashtable(); env.put(context.initial_context_factory,"jeus.jndi.jnscontextfactory"); Context context = new InitialContext(env); Hello hello = (Hello) context.lookup("helloejb.hello"); } } JLabel label = new JLabel(hello.sayHello()); label.setfont(new Font("Helevetica", Font.BOLD, 15)); getcontentpane().setlayout(new BorderLayout()); getcontentpane().add(label, BorderLayout.CENTER); setsize(500, 250); setvisible(true); } catch (Exception ex) { ex.printstacktrace(); } Java Web Start는이 HelloClient를실행하기위한정보가담긴 JNLP 파일을요청한다. 다음의예에서는 HelloClient를수행하기위해필요한 JAR 파일과사용하는 Java 버전등이명시되어있다. <jnlp> 태그에서 codebase 속성의 $$codebase는 JNLP 서블릿을포함한웹애플리케이션이디플로이되는 Context에따라자동으로교체된다. 여기서는 JAR 파일의 href 값에별다른경로가지정되어있지않으므로 JNLP 파일과 JAR 파일은모두동일한디렉터리에위치시켜야한다. [ 예 4.3] <<HelloClient.jnlp>> <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0" codebase="$$codebase"> <information> <title>helloclient</title> <vendor>tmaxsoft</vendor> </information> 제 4 장 JNLP 클라이언트 21
<resources> <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/> <jar href="hello-client.jar"/> <jar href="jclient.jar"/> </resources> <application-desc main-class="helloejb.helloclient"/> </jnlp> 참고 $$codebase 와같은예약어는 Sun 의 JNLP 서블릿구현에서제공하는것이며 JNLP 표준에서정의 한것은아니다. 4.3. 프로그램실행 본절에서는클라이언트의실행방법에대해설명한다. 4.3.1. 클라이언트실행 웹애플리케이션을디플로이한후 JNLP 파일을웹브라우저에서접근하면 Java Web Start가시작되고클라이언트가실행된다. JNLP 파일을요청하는 URL의예는웹애플리케이션의 Context가 hello인경우다음과같다. 이경우 Hel loclient.jnlp와 HelloClient.jnlp에정의된 hello-client.jar, jclient.jar는 url path가 app로되어있기때문에 hello 디렉터리혹은 war 파일내의 app 디렉터리에존재한다. http://localhost:8088/hello/app/helloclient.jnlp 이 JNLP 파일을웹브라우저에서요청한결과로지정된클라이언트가수행된다. 웹브라우저와별도의 Java 화면이나타나고그곳에서클라이언트가실행된것을확인할수있다. 4.3.2. 클라이언트컨테이너에서실행 JNLP 클라이언트의경우클라이언트컨테이너를통해서 Dependency Injection을사용할수있다. 그렇게하려면위에서제시한방법과는다른방법이필요하다. 다음은 HelloClient.java에서 Injection을사용한코드의예이다. [ 예 4.4] <<HelloClient.java>> package helloejb; import java.awt.borderlayout; import java.awt.font; import java.awt.event.*; 22 JEUS Application Client 안내서
import javax.swing.*; import javax.naming.context; import javax.naming.initialcontext; import javax.ejb.ejb; public class HelloClient extends JFrame { @EJB private static Hello hello; public static void main(string[] args) { } new HelloClient(); } public HelloClient() { try { JLabel label = new JLabel(hello.sayHello()); label.setfont(new Font("Helevetica", Font.BOLD, 15)); getcontentpane().setlayout(new BorderLayout()); getcontentpane().add(label, BorderLayout.CENTER); setsize(500, 250); setvisible(true); } catch (Exception ex) { ex.printstacktrace(); } } JNLP 파일도이에맞추어서작성해야한다. 클라이언트의메인클래스대신에 JEUS의클라이언트컨테이너클래스를기술하고그클래스에전달할파라미터를설정해야한다. 파라미터에대한설명은 1.6.1. 콘솔에서실행 을참고한다. <resources> 태그에는 client.jar 대신 clientcontainer.jar를기술하고, JEUS 클라이언트컨테이너가 Java Web Start로실행하는모드임을알수있도록 jeus.client.container.jws property를 true로설정해야한다. 또한 Java Web Start 프로그램의경우 Permission을체크하기때문에 <security> 태그에 all-permission 또는 j2ee-application-client-permissions를기술하고 JAR 파일은반드시 sign을해야한다. [ 예 4.5] <<HelloClient.jnlp>> <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0" codebase="$$codebase"> <information> <title>helloclient</title> <vendor>tmaxsoft</vendor> </information> <security> 제 4 장 JNLP 클라이언트 23
<all-permissions/> </security> <resources> <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/> <jar href="clientcontainer.jar"/> <jar href="hello-client.jar"/> <property name="jeus.client.container.jws" value="true"/> </resources> <application-desc main-class="jeus.client.container.clientcontainer"> <argument>-main</argument> <argument>helloejb.helloclient</argument> </application-desc> </jnlp> 위의경우와마찬가지로웹브라우저나 Java Web Start 를통해서 JNLP 파일을로딩하면실행되고결과 는동일하다. JAR 파일 sign 하기 JNLP 파일에 <security> 태그가있을경우 Java Web Start는반드시 signed JAR 파일을요구하기때문에예제의 hello-client.jar를 sign해야한다. 다음은 JDK에서제공하는 keytool과 jarsigner를이용해서 hello-client.jar를 sign하는예이다. keytool -genkey -alias helloclient -keypass 1234 -keystore helloks -storepass 1234 jarsigner -keystore helloks hello-client.jar helloclient 24 JEUS Application Client 안내서
용어해설 Java Web Start 클라이언트가 JNLP 리소스를액세스하거나다운받을수있도록, SUN에서제공하는소프트웨어이다. JNLP JNLP는 Java Network Launching Protocol을나타내며, 소프트웨어컴포넌트를배포하는프로토콜이다. 용어해설 25
색인 A appclient, 6 Applet, 15 C Client Container, 3 D Deploy, 5 J Java EE Deployment Descriptor, 3 JEUS Deployment Descriptor, 3 JNLP, 19 ㅇ 아키텍처, 2 애플릿, 2, 15 ㅍ 패키징, 5 색인 27