김상욱의 웹스타트(webstart) 강좌

 

※ 강좌에 대한 질문은 '문의게시판'에서 해주세요.

강좌진행중입니다.

기본 : 머리말 | 개요 | 서버설정 | jnlp파일 | jnlp패키지

응용 :

1. 파라미터 동적(dynamically)으로 넘기기

2. 파라미터 한글화(국제화)

...

참고사이트 [설치]

머리말 :

안녕하세요? /^.^_ 애플릿(Applet)의 단점을 극복한 웹스타트 강좌입니다.

애플릿은 웹 브라우저에서 돌아가는 작은 프로그램으로서 인터넷 열풍과 함께, 막강한 기능에 훌륭한 보안모델을 갖추고 있어 큰 인기를 끌었으며, 세계적으로 700만개 사이트에서 이용 중이며, 아직도 많은 국내 학원에서 애플리케이션 제작과 함께 애플릿 제작을 교육하고 있습니다. 애플릿은 분명 인터넷 시대에 Java라는 언어가 대중들에게 큰 인기를 끌게 한 주역임에 틀림없습니다. 각종 브라우저에서도 기본적으로 지원하고 있지요. 음, 오늘 글빨이 조금 되는군요. |O.O|

하지만, 애플릿의 단점도 적지 않습니다. 바로 보안 모델과 브라우저 지원문제인데요.

보안모델 때문에, 애플릿은 sandbox라고 불리우는 영역(임시디렉토리라고 생각하셔도 좋습니다.)에만 접근할 수 있고, 애플릿을 다운로드한 서버 이외의 다른 서버나, 로컬 컴퓨터의 자원에는 접근할 수 없었습니다. 이를 위해서는 번거로운 applet 인증 절차를 받아야 하고, 인증받은 애플릿은 실행시 클라이언트에게 "이거 믿을 만 합니까? 웬만하면 예 하지 마시죠." 라는 메세지 창을 띄워 의심을 사게 하지요.

대부분 아무 생각없이 그냥 예 누르시죠? 제가 제 홈피에 이거 절라 멋찐 채팅입니다. 하고 하드를 포맷해버리는 애플릿을 돌려둔다면, 예 눌렀다가는 큰일나겠지요. ^_^; (그 잘 정리한 야한 것들... 다시 모으려면...음 제 얘기는 아닙니다. 전 그런 거 별로 안 좋아합니다 흠흠.) 그 뿐이 아니라 익스플로러용 인증을 받으면 타 브라우저에서는 통하지 않습니다. 넷스케이프에서 이용하도록 하려면 넷스케이프 인증을 받아야 하지요. 으음...

게다가 브라우저에서 지원하는 가상머신을 사용해야 하기 때문에 브라우저에서 지원하는 버전 이상의 애플릿을 제작할 경우 제대로 보이지 않을 경우가 많습니다. 그 이쁜 스윙(swing)을 놔두고, 한글자 칠 때마다 다시 repaint해서 짜증나는 textField를 사용하는 AWT 패키지를 사용해야 했지요. 뭐, Sun사를 미워하는 MS가 제때제때 자바가상머신을 버전업 해줄 리가 있나요. 2001년 현재 jdk가 1.3.1이 통용되고 있고, 수개월 전 1.4 베타가 나왔는데도 window의 가상머신은 java 1에 머물고 있습니다. 위임형 이벤트 모델도 마음대로 못쓰지요. 일부러 deprecated된 클래스 메소드를 사용해야 하기도 했습니다. 그 뿐입니까? MS가 window XP 부터는 가상머신을 기본지원하지 않기로 결정했답니다. windowXP로 700만 사이트의 애플릿을 보기 위해서는 귀찮게 어차피 플러그인을 설치해야 할 것입니다.

이를 위해서 자바플러그인(plug-in)이 발표되었습니다. os의 가상머신 대신에 다운로드받은 jre를 사용하도록 하는 것입니다. 음, 오광신님의 표현을 빌리면 발표될 당시에는 획기적인 일이었다고 하지만, 인증과 같이 사용할 수 없다는 단점이 있었습니다. 8메가가 넘는 jre도 클라이언트들이 설치해야만 하는 부담이 있었지요. (이건 웹스타트도 마찬가지이긴 합니다만...) 스윙 애플릿이라는 말 한 번쯤 들어보셨지요? 그 배포에 무척 번거로운 점이 있었습니다.

위와 같은 문제점을 해결하고자 Java Web Start라는 기술이 발표되었습니다. 웹에서 애플리케이션을 실행할 수 있게 된 것입니다. 그냥 바로 ASP가 되는군요. (active server page가 아닙니다. ㅡㅡ)클라이언트는 adobe나 flash shockwave처럼 플러그인으로 Java Web Start이 설치되면 됩니다. jre, 프로그램 업데이트, 인증 등이 한 큐에 해결되는 것이죠. jdk1.4에서는 기본으로 포함될 것입니다. 이것도 발표 당시에는 혁명으로 불리었는데, 알고 보면 그 정도까지는 아니고요. Active X처럼 맨 처음 접속시 시간이 다소 걸리고요.(웹스타트가 설치되어있지 않다면 설치하는데에도 시간이 걸리겠지요.) 그 다음부터는 캐시를 이용하기 때문에 매우 빠릅니다.

뭐....."한 큐"에 해결된다는 게 제일 큰 장점이죠. ^_^

개요: Sun사의 한글 문서입니다.

Java Web Start는 Java TM 기술 기반 응용프로그램을 위한 새로운 배포 기술입니다. 사용자가 웹에서 바로 응용프로그램을 시작하고 관리할 수 있도록 컴퓨터와 인터넷 사이를 이어주는 다리 역할을 합니다. Java Web Start는 클릭 한 번으로 응용프로그램을 쉽게 작동하고 복잡한 설치나 업그레이드 절차 없이도 항상 최신 버전을 실행할 수 있도록 해 줍니다.
지금까지는 웹을 통해 소프트웨어를 배포하려면 사용자가 웹에서 설치 관리자를 찾아 다운로드하고, 위치를 지정하여 설치 관리자를 실행해야 했습니다. 설치 관리자를 실행하면 설치 디렉토리와 전체, 일반 또는 최소 등의 설치 옵션을 묻는 메시지가 나타납니다. 이런 방식은 대개 시간이 많이 걸리는 복잡한 작업이며 소프트웨어의 새 버전이 나올 때마다 반복해야 합니다.

이와 반대로, HTML 기반 전자 우편 클라이언트와 일정, 경매 사이트 등의 웹 배포 응용프로그램은 설치와 사용이 매우 쉽습니다. 웹 브라우저는 전체 프로세스를 자동화했습니다. 복잡한 다운로드, 설치 및 구성 단계가 없으며 항상 최신 버전을 실행할 수 있습니다.

Java Web Start는 위에서 HTML 기반 응용프로그램처럼 모든 기능을 갖춘 응용프로그램과 동일한 이점을 제공합니다. Java Web Start는 웹용 응용프로그램 배포 솔루션입니다. HTML 기반 클라이언트 대신 이러한 모든 기능을 갖춘 응용프로그램을 사용하면 다음과 같은 여러 가지 이점이 있습니다.

워드 프로세서 및 스프레드시트와 같은 기존 응용프로그램과 호환되는 대화형 사용자 인터페이스를 사용합니다.
대역폭 요구 수준이 낮습니다. 클릭할 때마다 응용프로그램이 반드시 웹 서버에 연결될 필요가 없으며 이미 다운로드한 정보를 캐시할 수 있습니다. 따라서 연결이 느려도 더 나은 대화형 기능을 제공할 수 있습니다.
오프라인 사용을 지원합니다.
단점은 처음에 응용프로그램을 다운로드해야 한다는 것입니다. HTML 기반 응용프로그램은 최초 작동 비용이 매우 낮습니다. 일반적으로 웹 페이지는 몇 초 안에 볼 수 있습니다. Java TM 기술 기반 응용프로그램은 일반 모뎀 연결로 다운로드할 때 몇 분이 걸립니다. Java Web Start는 컴퓨터에서 로컬로 다운로드한 모든 파일을 캐시합니다. 따라서, 응용프로그램의 최초 작동 비용은 HTML 페이지에 비해 높지만 필요한 모든 자원을 로컬에서 사용할 수 있기 때문에 이후에 응용프로그램을 시작할 때는 거의 즉시 시작됩니다.
시작할 때마다 Java Web Start는 웹 서버를 확인하여 응용프로그램의 새 버전이 있는지 확인하고 자동으로 다운로드하여 시작합니다. 따라서 응용프로그램이 자동으로 업데이트됩니다. 복잡한 업그레이드 절차가 없습니다.

보안
Java Web Start는 Java 2 플랫폼의 최상위에 구축되어 포괄적인 보안 구조를 제공합니다. Java Web Start를 사용하여 시작한 응용프로그램은 기본적으로 파일과 네트워크에 대한 액세스가 제한된 환경("sandbox")에서 실행됩니다. 따라서, Java Web Start를 사용하여 응용프로그램을 시작하면 시스템 보안과 무결성이 유지됩니다.
응용프로그램은 시스템에 대한 무제한 액세스를 요구할 수 있습니다. 이 경우, Java Web Start는 응용프로그램을 처음 시작할 때 보안 경고 대화 상자를 표시합니다. 보안 경고는 응용프로그램을 개발한 공급업체에 대한 정보를 표시합니다. 공급업체를 신뢰하기로 선택하면 응용프로그램이 시작됩니다. 응용프로그램 제공처에 대한 정보는 디지털 코드 서명을 기반으로 합니다.

서버설정:

웹 스타트는 2001년 8월 현재 Windows 95/98/NT/2000, Solaris (SPARC & Intel editions), and Linux (RH6.1/x86) 등에서 지원됩니다. 그리고 서버는 어떤 standard web server라도 가능합니다.

자, 우선 웹 서버를 설정해야겠지요. 음. 확장자가 jnlp인 파일을 다운받으면, 클라이언트의 java 웹스타트를 구동시키도록 해주어야 합니다. 바로 mime type 설정이지요. 여기에

application/x-java-jnlp-file JNLP

항목을 추가시켜주어야 합니다. 웹 서버마다 조금씩 다른데 각 웹서버의 설정을 참고하세요. 몇 가지만 본다면, Apache에서는 mime.types 파일이 따로 있지요. 예를 들어 apache디렉토리가 /usr/local/apache이고, conf밑에 mime.types가 있다면, vi /usr/local/apache/conf/mime.types 를 보시면

# MIME type Extension
application/EDI-Consent
application/EDI-X12
application/EDIFACT
application/activemessage
application/andrew-inset ez
....

뭐 이런 항목이 있을 겁니다. 여기에

application/x-java-jnlp-file JNLP 를 추가하시면 되는 겁니다. 혹은 mime파일 건드릴 거 없이 httpd.conf 파일에 AddType하는 방법도 있습니다. 저장하시고서, apache를 재구동 시켜주어야 겠지요.

tomcat은 web.xml을 열어서 MIME type 지정하는 부분에 아래처럼

<mime-mapping>

<extension>

jnlp

</extension>

<mime-type>

application/x-java-jnlp-file

</mime-type>

</mime-mapping>

추가시켜주시면 되고요. 확장자 jnlp에 application/x-java-jnlp-file을 붙이고 있지요?

resin은 http://www.caucho.com에 가보시면 아시듯이.(co.kr이 아닙니다...co.kr누르면 무슨 중대부속초등학교 1회 동창회가 나옵니다....ㅡㅡ) 아래처럼 바꾸시고.

<web-app id='/'>

<mime-mapping extension='.jnlp'
mime-type='application/x-java-jnlp-file'/>

</web-app>

물론, tomcat 혹은 resin과 apache를 연동시키셨으면, 그냥 apache만 설정해두셨으면 됩니다. 끝.

jnlp파일:

전체 문법입니다.

<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for SwingSet2 Demo Application -->
<jnlp
spec="1.0+"
codebase="http://javaweb.eng.com/jaws/apps"
href="swingset2.jnlp">
<information>
<title>SwingSet2 Demo Application</title>
<vendor>Sun Microsystems, Inc.</vendor>
<homepage href="docs/help.html"/>
<description>SwingSet2 Demo Application</description>
<description kind="short">A demo of the capabilities of the Swing Graphical User Interface.</description>
<icon href="images/swingset2.jpg"/>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.3"/>
<jar href="lib/SwingSet2.jar"/>
</resources>
<application-desc main-class="SwingSet2"/>
</jnlp>

아이구 많군요. 음 저걸 다 치실 필요는 없고요. 복사하신 다음에 몇몇 부분만 고쳐주시면 됩니다. 뭐... title이라든지... vendor 이런 거 알아서 고치시고요. (안고치면 화면에 뜹니다. -_- )

음 맨 처음에 jnlp의 spec이 1.0+로 되어있군요. 1.0 버전 이상의 jnlp 스펙이군요. 글쿤.

codebase 어엇 중요하지요. application이 실행되는 url이고요.

href 음 브라우저 url에서 jnlp파일을 읽었다면? 얘는 필요 없겠습니다만... 나중에 cgi나 jsp 등을 이용해서 jnlp파일을 동적으로 생성해줄 때에는 이 href를 빼주셔야 되겠습니다. mimeType을 jsp쪽이 아니라 웹스타트쪽으로 바꾸어 주려는데 도로 jnlp파일로 읽으면 안되겠지요.

음음 죽죽 필요없고. icon은 에, 웹스타트는 한 번 다운로드 받으면, 브라우저 없이도 바로 실행할 수 있습니다. 웹 스타트 설치할 때 작업표시줄이랑 바탕화면에 바로가기 아이콘이 남거든요. 그렇게 실행했을 때,(offline 실행) 거기에 뜨게 할 아이콘입니다. 지정 안하시면....... 안하시면...... 뻘건 동그라미(웹스타트 아이콘)이 설정됩니다... 그 밑에 offline-allowed는 설명할 필요 없겠군요.

그리고.....information 끝나고...

security 오호. 이건 인증걸 때 필요한 부분으로 일반적으로 그냥 위처럼 all-permissions(모든 권한)로 놓습니다.

full access to the client machine and local network라는 거지요. 파일접근만 되게 하라! 등 개별적으로 지정할 수도 있나보지요?

히야. 그 다음이 가장 중요한 resource부분입니다. 많은 초보님들이 의외로 이 부분을 정확히 지정을 안해서 resource를 찾지 못하는 에러 메시지를 보시더군요. 보시면 j2se의 버전을 지정하고 있는데요. 음, 웹스타트는 사용자 시스템에 jre가 깔려있지 않을 경우 자동으로 다운로드 받아서 자바애플리케이션을 실행합니다. 1.3 으로 되어 있으면, 1.3이 깔려있으면 다운로드 받지 않고 1.3으로 실행하겠지요. 음 +키나 *키가 쓰일 수 있습니다.

<j2se version="1.2.2 1.3.*">

이정도로 되어있으면 되겠군요.

<j2se version="1.3" initial-heap-size="64m"/>

<j2se version="1.2"/>

<j2se version="1.4-beta" href="http://java.sun.com/products/autodl/j2se"/>

등도 가능합니다.

그 밑에 jar 파일 위치 자알 지정해주시고요. nativelib를 포함하는 jar파일은 아래처럼.

<nativelib href="lib/windows/corelib.jar"/>

혹은

<resources os="SunOS" arch="sparc">
<nativelib href="lib/solaris/corelibs.jar"/>
</resource>

그 다음은 메인클래스와, 애플리케이션의 인자나 애플릿의 파라미터 지정부분입니다.

위에서는

<application-desc main-class="SwingSet2"/>

이렇게 끝났지만,

만약 SwingSet2에 argument들을 주고 싶다면. (아시죠? main메소드의 인자 String[] args)

<application-desc main-class="Main">
<argument>arg1</argument>
<argument>arg2</argument>
</application-desc>
이렇게 해주시고.

애플릿의 경우는

<applet-desc
documentBase="http://..."
name="TimePilot"
main-class="TimePilot.TimePilotApp"
width="527"
height="428">
<param name="key1" value="value1"/>
<param name="key2" value="value2"/>
</applet-desc>

이렇게 하시면 됩니다. 메인 클래스에 .class 확장자가 없지요?

xml이니까. / 조심해서 쓰시고요. 쩝. / 잘못 붙여서 저 하루 삽질했습니다.

jnlp문법 끝났군요.

jnlp패키지:

음 자바웹스타트 까시면 그 디렉토리에 javaws.jar파일이 있습니다. 그 안에 jnlp 패키지가 있지요.

유용한 클래스들이 있는데 아직 사용은 못해봤군요. 이번 프로젝트에서 사용해 봐야겠습니다. Sun사의 문서에 따르면,

애플릿의 AppletContext 처럼 이용하게 해주는 BasicService 클래스,

시스템의 클립보드를 이용하는 ClipboardService 클래스.

캐쉬여부를 결정하는 DownloadService 클래스.

File[Open/Save]Service클래스.

PrintService 클래스.

등등 유용한 클래스가 많네요.

패키지 다운로드 : http://java.sun.com/products/javawebstart/download-jnlp.html

1. 파라미터 동적(dynamically)으로 넘기기

2. 파라미터 한글화(국제화)

참고 사이트 :

Sun사 공식 페이지 - 웹스타트 다운로드 및 개발자 정보 페이지 (영문)

    개발자 가이드 페이지

        jnlp 파일 전체 문법 anchor

Sun사 웹스타트 포럼 - 개발자들의 각종 질답을 볼 수 있는 페이지 (영문)

Venus Application Publisher for JNLP - jnlp 제작 툴

광신님 홈페이지 - 거의 국내 유일의 webstart정보를 담고 있지요.