Java Web Start 퍼시스턴스

Java SE 2006/12/24 11:07 Posted by Sun

글쓴이: Joshua Marinacci (NetBeans 엔지니어)

Java Web Start는 경량 클라이언트 애플리케이션을 배치하는 데 매우 적합한 기술로, 자동 업데이트도 지원이 된다. Web Start에서 잘 알려져 있지 않은 기능 중 하나가 바로 PersistenceService API인데, 본 팁에서는 PersistenceService 클래스를 사용하여 클릭을 통한(click-through) 라이선스 화면을 제작하는 방법에 대해 알아보도록 한다.

먼저, Java Web Start에 대해 간단히 요약해보자. Web Start는 자바 플랫폼에 내장되어 경량 애플리케이션을 배치할 수 있게 해주는 기술이다. 사용자는 먼저 애플리케이션을 기술하는 XML 파일을 다운로드하여 필요한 jar를 리스트하고, 옵션에 따라 풀 데스크탑 퍼미션을 요청한다. 다운로드가 모두 완료되면 애플리케이션이 시작되는데, 애플리케이션이 퍼미션을 요구할 경우에는 경고 대화상자가 표시되고, 요청하지 않을 경우에는 마치 애플릿처럼 안전한 sandbox에서 실행된다. Java Web Start 애플리케이션을 작성할 때는 sandbox에서 실행하는 것이 가장 적절하고 안전한 방법이다. 그렇다면 애플리케이션이 안전한 sandbox 내에 있다면 데이터를 디스크에 저장하는 것과 같은 다소 불안전한 작업은 어떻게 수행할 수 있을까? 바로 이런 경우에 Java Web Start의 Service API가 필요하다. 본 팁에서는 PersistenceService 클래스가 제공하는 한 가지 서비스에 대해 설명한다.

Web Start 환경은 사용자의 애플리케이션이 각자의 하드 드라이브를 완전히 액세스하지 않고도 데이터를 안전하게 저장할 수 있게 해주는 PersistenceService 클래스를 제공한다. 서비스는 데이터 크기를 제한하며, 오직 사용자의 애플리케이션만 데이터를 읽고 쓸 수 있는데, 이는 사용자의 하드 드라이브에 있는 다른 애플리케이션이 사용자의 애플리케이션이 저장한 정보를 액세스할 수 없다는 것을 의미한다. 이러한 보안 기능은 Java Web Start를 안전한 애플리케이션 플랫폼으로 만드는 요체가 된다.

아래 예제 코드는 라이선스 승인 대화상자를 보여준다. 사용자가 라이선스를 수락하면 코드는 해당 노트를 저장하여 애플리케이션이 라이선스를 다시 표시하지 않도록 한다. 아래 예제에서 볼 수 있는 것처럼, Web Start 환경 내의 모든 서비스는 ServiceManager 클래스를 이용하여 얻을 수 있다.

import javax.jnlp.*; 
//.... 
 
public void showDialog() { 
  // show the dialog. after the user accepts do the following 
  try { 
    PersistenceService service = (PersistenceService) 
ServiceManager.lookup("javax.jnlp.PersistenceService"); 
    service.create(new URL("http://www.myserver.com/CoolApp/ApprovedLicense"),100); 
    print("created the license"); 
    }  catch (Throwable thr) { 
     print(thr); 
    } 
} 
 
public static void print(Object o) { 
  System.out.println(o); 
  if(o instanceof Throwable) { 
    ((Throwable)o).printStackTrace(); 
  } 
} 

ServiceManager.lookup() 메소드에 서비스의 클래스 이름, "javax.jnlp.PersistenceService"를 제공하여 PersistenceService 인스턴스를 획득한다. 일단 서비스에 대한 레퍼런스를 가지고 있으면, create() 메소드를 이용하여 스토리지 엔트리를 생성할 수 있다. 이 메소드는 2개의 인수를 취하는데, 첫 번째는 레퍼런스 URL이다. 이 URL은 사용자의 애플리케이션이 로드된 URL과 일치해야 한다. 두 번째 인수는 원하는 크기를 바이트로 표시한다. 이 예제 코드는 실제로 데이터를 저장할 필요가 없으므로 데이터 사이즈는 100으로 작다.

일단 스토리지 엔트리를 생성한 후에는 어떻게 사용해야 할까? 위의 코드는 빈 엔트리를 생성하게 되는데, 엔트리의 내용은 관련이 없으므로, PersistenceService 인스턴스의 get 메소드를 호출하여 그것이 존재한다는 것만 확인하면 된다. 데이터 엔트리가 존재하지 않을 경우 서비스는 FileNotFoundException 오브젝트를 throw하는데, 이는 사용자가 라이선스를 수락하지 않았거나 애플리케이션이 이번에 처음 실행되었음을 의미한다. 어느 경우에든 우리는 라이선스를 표시해야 한다. 스토리지 엔트리에서 데이터를 로드하려면 service.get() 메소드에서 리턴되는 FileContents 오브젝트를 사용하면 된다.

public void checkLicenseApproved() { 
  try { 
    PersistenceService service = (PersistenceService) 
ServiceManager.lookup("javax.jnlp.PersistenceService"); 
    FileContents contents = 
    service.get(new URL("http://www.myserver.com/CoolApp/ApprovedLicense")); 
    print("The user has already approved the license"); 
  } catch (FileNotFoundException fnfe) { 
    print("need to show the license"); 
    showDialog(); 
  } catch (Throwable ex) { 
    print(ex); 
  } 
} 

라이선스 패널을 조건부로 표시하는 데는 이것으로 충분하다. 단, 퍼시스턴스 스토어에 데이터를 저장하고 로드할 때 반드시 동일한 URL을 사용해야 하는 점에 유의할 것. 잘못된 URL을 사용하면 MalformedURLException 오브젝트가 throw된다. Web Start 환경은 애플리케이션 간에 보안을 적용하는 데 이 URL을 사용하여 오로지 사용자의 애플리케이션만이 사용자의 데이터에 액세스할 수 있도록 한다.

PersistenceService 클래스는 Java Web Start 배치 시스템이 제공하는 여러 서비스 중 한 가지이다. Java Web Start에 관한 자세한 내용은 다음 링크를 참조하기 바란다:

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

2006/12/24 11:07 2006/12/24 11:07

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

댓글을 달아 주세요

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

    좋은 정보 감사해요~

    2007/09/19 04:02
  2. 고진구  수정/삭제  댓글쓰기

    매일 매일 하나씩 좋은 정보 얻어갑니다. 감사해요

    2007/09/19 16:10
  3. 김복선  수정/삭제  댓글쓰기

    좋은 정보 감사드려요.

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

◀ Prev 1  ... 317 318 319 320 321 322 323 324 325  ... 626  Next ▶