PIM API 시작하기

Java ME 2006/02/02 17:32 Posted by Sun

JSR 75를 이용하여 모바일 장치의 개인정보 관리하기

개인정보 관리(PIM;Personal information management)는 일정, 연락처, 작업 등과 같이 폭넓은 부류의 사용자들이 편리하게 이용하고자 하는 개인 데이터를 전자적인 형태로 관리하는 기능을 가리키는 것으로, 장소에 구애를 받지 않고 이런 정보들을 손쉽게 관리할 수 있다는 점은 모바일 장치를 구입하는 구입하는 강력한 이유 중 하나입니다. PIM 데이터는 벤더가 제공하는 애플리케이션을 통해 액세스할 수 있도록 원시 포맷으로 장치에 저장되는 경우가 많은데, 이런 맥락에서 몇 가지 벤더 독립적 표준이 개발되기에 이르렀습니다. Internet Mail Consortium은 연락처 및 일정 데이터를 다른 PIM 애플리케이션과 전자적으로 교환하고 인터넷을 통해 전송할 수 있게 해주는 vCard(비즈니스 카드 포맷)와 vCalendar(일정 교환 포맷)의 두 가지 표준을 관리합니다.


최근까지만 해도 J2ME(Java 2 Platform, Micro Edition) 기반 애플리케이션 개발자들은 CLDC(Connected Limited Device Configuration)와 MIDP(Mobile Information Device Profile)가 원시 데이터베이스 또는 vCard/vCalendar 포맷으로 된 데이터의 용이한 액세스를 위한 API를 직접 정의하지 않기 때문에 장치 기반 PIM의 액세스가 어렵다고 생각했습니다. 하지만 이제 J2ME 플랫폼을 위한 PDA 옵션 패키지 JSR 75에서 해당 스펙을 구현하는 J2ME 장치가 장치 상의 원시 PIM 데이터와 vCard/vCalendar 포맷으로 된 연락처 및 일정 데이터를 액세스할 수 있게 해주는 API를 정의합니다.

본 문서에서는 PIM API에 관한 기본 튜토리얼 내용을 코드 위주로 살펴보도록 하겠습니다.

  • JSR 75 소개
  • javax.microedition.pim 옵션 패키지 설명
  • PIM API에 관한 세부사항
  • 사용에 따른 부수사항
  • 사용자의 각 무선 애플리케이션 니즈에 맞게 수정이 가능한 코드 제공

J2ME 플랫폼을 위한 PDA 옵션 패키지

JSR 75은 J2ME 개발자들이 PDA에서 흔히 볼 수 있는 중요한 기능에 액세스할 수 있도록 CLDC를 확대/강화하는 두 가지 옵션 패키지를 정의합니다.

  • FC(FileConnection) API J2ME 장치가 모바일 장치에 상주하는 파일 시스템에 표준화된 방식으로 액세스할 수 있도록 하며, 주로 외부 메모리 카드와 같은 휴대형 저장 매체에 액세스할 수 있게 해줍니다. 이 패키지에 관한 튜토리얼을 보려면 "FileConnection API 시작하기(영문)"를 참조하시기 바랍니다.
  • PIM(Personal Information Management) API J2ME 장치가 원시 포맷으로 저장된 개인 데이터에 액세스할 수 있게 해주며, 이번 문서에서 다룹니다.

CLDC 1.0을 지원하는 모든 장치는 JSR 75 지원이 가능한데, 이는 CLDC 1.0 이상을 지원하는 어떠한 J2ME 프로파일에도 PIM API가 배치될 수 있음을 의미합니다. CLDC는 이를테면 CDC(Connected Device Configuration)의 부분집합이기 때문에, PIM/ FC 옵션 패키지는 CLDC/CDC 기반 장치 모두에 배치가 가능합니다. 단, 두 패키지는 모두 옵션사양이며 서로 별개인 점에 유의하시기 바랍니다.


누가 옵션 패키지를 장치에 장착하는가 ? 주어진 장치에서 옵션 패키지를 지원할지 여부는 플랫폼 소프트웨어의 관리를 책임지는 곳(보통은 장치 제조업체)에서 결정합니다. 일반적으로, 최종 사용자나 애플리케이션 개발자는 옵션 패키지를 다운로드하여 장치에 설치할 수 없으며, 옵션 패키지에 의존하는 애플리케이션의 경우 제조업체가 먼저 옵션 패키지를 장치에 통합하기 전에는 실행이 불가능합니다.

PIM 옵션 패키지

PIM API의 주된 목적은 J2ME 장치로 하여금 원시 애플리케이션이 액세스하고 있는 것과 동일한 개인 데이터에 액세스할 수 있도록 하는 것입니다. 이 옵션 패키지의 주요 목표는 다음과 같습니다.

  • 장치, 휴대형 매체, 또는 네트워크에 상주하는 원시 포맷의 개인 데이터에 대한 액세스 제공
  • vCard 포맷의 주소록 엔트리, vCalendar 포맷의 일정/작업 엔트리의 가져오기/내보내기 지원
  • 필드 또는 속성을 요구하지 않음
  • 이러한 API 사용에 따른 보안 기능 제공

PIM 옵션 패키지 API는 PIM 리스트라고 불리는 세 가지 유형의 PIM 데이터를 정의합니다.

  • Contact(연락처) 리스트: 비즈니스 상대 및 개인 연락처의 이름, 주소, 전화번호 등의 정보를 포함
  • Event(일정) 리스트: 약속, 미리 알림 등을 비롯한 날짜 관련 항목
  • To-do(해야할 일) 리스트: 사용자가 수행해야 할 작업 기록

모든 장치가 세 유형을 모두 지원하지는 않지만, 적어도 한가지 이상의 유형을 지원해야 PIM 옵션 패키지를 지원하는 장치라고 말할 수 있습니다.

PIM API

PIM API는 javax.microedition.io.pim 패키지에 정의되고, 이 패키지는4개의 예외 타입이 포함하여 8개의 인터페이스와 6개의 클래스로 구성됩니다.

인터페이스 설명
PIMItem 항목이 단일 PIM 엔트리(Contact, Event, 또는 ToDo)의 데이터 집합인 PIM 리스트에 저장되는 항목의 공통 슈퍼인터페이스
PIMList 각각 PIMItems를 포함할 수 있는 ContactList, EventList, ToDoList의 공통 슈퍼 인터페이스
Contact 연락처(contact) 데이터베이스의 단일 엔트리. 이 인터페이스의 정적 필드는 vCard 스펙에 정의된 필드의 부분집합입니다.
ContactList Contact 항목의 리스트
Event 일정 데이터베이스의 단일 엔트리
EventList Event 항목의 리스트
ToDo 작업(to-do) 데이터베이스의 단일 항목
ToDoList ToDo항목의 리스트
 
클래스 설명
PIM PIMList에 관한 정보를 찾고 액세스를 획득하기 위한 정적 메소드 집합을 제공합니다.
RepeatRule 관련 이벤트가 발생할 시기를 지정하는 Event 항목의 반복 패턴에 대한 설명. 이 클래스의 정적 필드는 vCalendar 1.0 스펙에 정의된 VEVENTRRULE 필드의 기능들의 부분집합입니다.
FieldEmptyException Thrown when an attempt is made to access a field that doesn't have any data values associated with it 관련 데이터 값을 가지지 않는 필드에 액세스하려는 시도가 있을 때 throw됩니다.
FieldFullException 가용 데이터 값 슬롯이 이미 할당된 필드에 데이터를 추가하려는 시도가 있을 때 throw됩니다.
PIMException PIM 클래스에 의해 throw됩니다.
UnsupportedException 참조된 필드가 엘리먼트가 속한 PIM 리스트에서 지원되지 않을 때 throw됩니다.
 

모든 J2ME 플랫폼에서 PIM 옵션 패키지를 이용하지 못할 수도 있습니다. 주어진 장치의 구현 여부를 확인하려면 microedition.pim.version 키로 System.getproperty()를 호출합니다. 지원할 경우에는 메소드가 API의 버전 번호를 리턴하고 지원하지 않을 경우에는 null을 리턴합니다.

.
. . .
. : CLDC는 구현 시 존재하지 않는 클래스를 참조하는 애플리케이션의 로드를 거부할 수 있게 해주므로, 이를 지원하지 않는 장치에서 PIM API의 지원에 대한 런타임 체크를 수행하는 것이 불가능할 수도 있습니다. 이런 경우에는 두 가지의 서로 다른 버전의 애플리케이션(이 중 하나는 PIM API를 사용하고 나머지는 사용하지 않는)의 패키지를 준비해야 합니다. .
.
.
 

보안 관련 문제

PIM API 보안을 지원하는 보안 모델을 제공하는 것은 PIM API가 배치된 J2ME의 책임이고, 구현은 포함하는 프로파일 또는 플랫폼의 몫입니다. 이 경우, 다음과 같은 특정 요건이 적용됩니다.

  • 보안 모델은 반드시 읽기 전용, 쓰기 전용 및 읽기/쓰기 액세스를 수행할 권한을 지원해야 합니다.
  • 보안 모델은 반드시 SecurityException을 throw하는 javax.microedition.pim 패키지의 메소드 안에서 적용되어야 합니다.

PIM API 사용법

데이터 액세스에 대한 엔트리 포인트는, PIM 인스턴스 획득을 위한 팩토리 메소드를 제공하는 PIM 클래스를 통해 이루어집니다.

import javax.microedition.pim.*;

PIM singleton = PIM.getInstance();

이와 더불어, PIM은 예를 들어 fromSerialFormat()toSerialFormat()과 같은 가져오기/내보내기 기능을 제공합니다.

모든 PIM 리스트는 PIMList 인터페이스와 세 가지의 서브인터페이스: ContactList, EventList, ToDoList로 표현됩니다.

PIM 리스트를 액세스하는 데는 openPIMList() 메소드를 이용합니다. 첫 번째 매개변수는 리스트 타입: PIM.CONTACT_LIST 또는 PIM.EVENT_LIST,PIM.TODO_LIST를 나타내고, 두 번째 매개변수는 모드: PIM.READ_ONLY 또는 PIM.READ_WRITE, PIM.WRITE_ONLY를 지정합니다. 세 번째의 옵션 매개변수는 원하는 PIM 리스트의 이름을 지정합니다. 이 매개변수를 생략하면 openPIMList()는 내장 PIM 애플리케이션이 사용하는 지정 타입의 리스트인 기본값 PIM 리스트를 리턴하고, 메소드가 찾을 수 없는 리스트를 지정할 경우에는 PIMException이 throw됩니다.

...
PIM pim = PIM.getInstance();
ToDoList list = null;

try {
   list = (ToDoList) pim.openPIMList(PIM.TODO_LIST, PIM.READ_ONLY, "list-name");
   // use the list
} catch (PIMException pe) {
  // no such list
} catch (SecurityException se) {
  // MIDlet is not allowed access to the specified list
}
...

PIM 리스트에는 PIMItem 인터페이스와 해당 서브인터페이스 Contact, Event, ToDo로 표현되는 항목이 포함됩니다. 이 리스트의 items() 메소드를 이용하면 PIM 리스트에 포함된 항목의 Enumeration을 얻을 수 있습니다.

...
Enumeration enum = list.items();
while(enum.hasMoreElements()) {
    ToDo task = (ToDo) enum.nextElement();
    // do something with task
}
...

다음 예제는 연락처 리스트를 여는 방법과 연락처 값을 검색하고 추가하는 방법을 보여줍니다.

...
// Open default contact list
PIM pim = PIM.getInstance();
ContactList clist;
try {
   clist = (ContactList) pim.openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE);
} catch(Exception e) {
   // security or other exception
}

// Retrieve contact values
// The countValues() method returns the number of data values currently
// set in a particular field.
Enumeration contacts = clist.items();
Contact c = (Contact) contacts.nextElement();
int phoneNumbers = c.countValues(Contact.TEL);
for(int i = 0; i < phoneNumbers; i++) {
   if((c.getAttributes(Contact.TEL) != 0) & Contact.ATTR_HOME != 0) {
      // Home number
      String home = c.getString(Contact.TEL, i);
   }
}

//Add contact values
Contact c = clist.createContact();
int attrs = Contact.ATTR_HOME;
c.addString(Contact.TEL, attrs, "416-799-1313");
// Some fields can be added without attributes
c.addString(Contact.ORG, PIMItem.ATTR_NONE, "someName Corporation");
// Add the item to the native contact database
c.commit();
...
 

JSR 75의 구현

PIM API의 공식적인 구현은 IBM 사이트의 PDA 옵션 패키지(영문)에서 참조할 수 있습니다. 이 구현의 타깃은 PocketPC 운영체제이므로 PocketPC용 J9 자바 가상 머신을 필요로 합니다.

썬 마이크로시스템즈의 J2ME Wireless Toolkit 2.2에는 JSR 75 구현이 포함되어 있는데, 필자는 이 툴킷을 사용하여 본 문서의 예제를 테스트했습니다.

다음은 PIM 구현과 관련한 주의사항입니다.

  • 구현은 장치에 부착된 SIM 카드나 원격 PIM 데이터베이스처럼 잘 알려진 위치에 상주하는 PIM 데이터베이스에 대한 액세스를 제공할 수 있으므로, 결과적으로 동일한 유형의 PIM 리스트가 여러 개 존재할 수 있습니다. 예를 들어, 휴대폰이 폰과 SIM 카드에 각각 하나씩 두 개의 ContactList를 가질 수 있는 경우가 그것입니다. 이 리스트들은 이름 별로 구분이 이루어지며, PIM.listPIMLists()를 호출하여 이름을 검색하면 주어진 유형의 모든 PIM 리스트 이름의 목록을 리턴합니다.
  • PIM API는 세 가지 유형의 PIM 리스트를 정의하지만, 구현이 하나 또는 두 가지 유형만 지원하는 경우라도 요건이 충족되는 것으로 간주될 수 있습니다. 구현이 연락처 리스트를 지원하는 경우에는 반드시 vCard 2.1을, 일정 또는 작업 리스트를 지원하는 경우에는 vCalendar 1.0을 지원해야 합니다. 어떤 유형의 PIM 리스트가 지원되지 않는 경우에는 지원되지 않는 유형의 리스트를 액세스하는 데 사용되는 메소드가 반드시 PIMException을 throw해야 합니다.
  • 마지막으로, PIM API는 locking operations를 제공하지 않습니다. 따라서, 구현은 모든 PIM list-record operations가 원자적, 동기적, 연속적으로 이루어지도록 하여 복수의 액세스로 인해 데이터가 손상되지 않도록 해야 합니다. 사용자의 애플리케이션이 복수의 쓰레드를 이용하여 PIM 리스트에 액세스할 경우, 의도하지 않은 결과를 방지하기 위해 액세스를 조정하는 것은 각자의 책임이라 할 수 있습니다.

아울러, 모든 장치가 모든 필드를 지원하지는 않는다는 점에 유의할 필요가 있습니다. 예컨대 사용자는 원시 데이터베이스에 저장될 수 없는 필드가 포함된 vCard를 가져올 수 있습니다. 사용자는 이 문제에 대해 테스트할 수 있는데, 즉, PIM.isSupportedField() 메소드는 주어진 PIM 리스트 필드의 지원 여부를 나타냅니다. 이런 문제점에 대한 일반적인 해결책이 없을 수 있지만 적어도 정보가 손실되기 전에 문제점을 알아 차릴 수는 있는 것입니다.

J2ME Wireless Toolkit 2.2에 포함된 PIM 데모

J2ME Wireless Toolkit 2.2에는 연락처, 일정, 작업 리스트를 관리할 수 있게 해주는 PIM 데모가 포함되어 있습니다. 실행을 위해 다음의 절차를 따릅니다.

  1. 툴킷을 다운로드하여 설치합니다.
  2. KToolbar를 시작합니다.
  3. PDAPDemo 프로젝트를 엽니다. .
  4. 4. 애플리케이션을 실행하면 그림 1과 같은 결과가 표시됩니다.

    그림 1: J2ME Wireless Toolkit의 PDAPDemo
  5. 리스트 유형 중 하나를 선택합니다. 하지만 많은 결과를 기대하지는 마십시오. 에뮬레이터에는 아직 리스트가 포함되어 있지 않기 때문에 아무 내용도 표시되지 않습니다.
    .
    . . .
    . 툴킷 에뮬레이터에서, PIM API는 여러분의 데스크톱 컴퓨터의 하드디스크에 저장된 PIM 리스트에 대한 액세스를 제공합니다(toolkit/appdb/DefaultColorPhone/pim/events/Events, toolkit/appdb/DefaultColorPhone/pim/todo/To Do). 연락처는 vCard 포맷으로, 그리고 일정과 작업은 vCalendar 포맷으로 저장됩니다. .
    .
    .

 

PIM 리스트 설정

자체 vCard가 있는 경우에는 이를 toolkit/appdb/DefaultColorPhone/pim/contacts/Contacts에 파일 형태로 저장하고, 그렇지 않은 경우에는 다음의 예제 vCard를 sample.vcf로 저장합니다.


BEGIN:VCARD
VERSION:2.1
N:Mahmoud;Qusay;H.
FN:Qusay H. Mahmoud
ORG:JavaCourses
TITLE:Developer
NOTE:Helping You With Java!
TEL;WORK;VOICE:(416) 999-1111 ext 1000
TEL;WORK;FAX:(416) 333-9999
ADR;WORK;ENCODING=QUOTED-PRINTABLE:;;1500 Java Ave.=0D=0ASuite 101;Toronto;ON;M9V1L1;Canada
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:1500 Java Ave.=0D=0ASuite 101=0D=0AToronto, ON M9V1L1=0D=0ACanada
URL;WORK:http://www.javacourses.com
EMAIL;PREF;INTERNET:qmahmoud@javacourses.com
REV:20043335T124220Z
END:VCARD


그림 1에 표시된 화면에서 Contact Lists를 선택하면 그림 2와 같은 결과가 나타납니다.

그림 2: vCard로 저장된 연락처 항목

여기에 나타나듯이, 데모는 선택된 연락처 항목을 열람, 삭제하거나 새로운 항목을 작성할 수 있게 해줍니다. 강조 표시된 항목을 선택하면 그림 3과 같이 vCard에서 읽혀지는 전체 세부사항을 볼 수 있습니다.

그림 3: vCard 정보의 액세스

데모는 또한 그림 4에서 보는 것처럼 필드를 편집할 수 있게 해줍니다.

vCard 필드 수정하기

vCalendar 포맷의 엔트리를 내보내기할 수 있는 일정 애플리케이션을 가지고 있는 경우에는 하나의 엔트리를 toolkit/appdb/DefaultColorPhone/pim/events/Eevnts로 복사합니다. 그렇지 않은 경우에는 다음의 예제 vCalendar 항목을 이용하여 sample.vcs로 저장합니다.

BEGIN:VCALENDAR
VERSION:1.0
BEGIN:VEVENT
DTSTART:19980114T210000Z
DTEND:19980114T230000Z
LOCATION:My office
CATEGORIES:Business
DESCRIPTION;ENCODING=QUOTED-PRINTABLE:
This is a note associated with the meeting=0D=0A SUMMARY:Meeting to discuss new architecture PRIORITY:3 END:VEVENT END:VCALENDAR

이제 그림 1에 표시된 옵션 중에서 Event Lists를 선택합니다. 그림 5와 유사한 결과가 표시됩니다.

그림 5: vCalendar 정보의 액세스

결론

J2ME 플랫폼을 위한 옵션 패키지인 JSR 75는 Personal Information Management와 FileConnection의 두 가지 옵션 패키지를 정의하는데, PIM 패키지의 API는 J2ME 장치가 세 가지 유형의 범용 개인 데이터에 항시 액세스할 수 있게 해줍니다. 본 문서에서는 PIM API를 검토하고 그 사용법에 관한 튜토리얼을 제시해 보았으며, 또한 예제 코드를 통해서 원시 연락처, 일정, 작업 정보를 읽고 쓰는 MIDlet을 개발하는 일이 얼마나 간단한지 알 수 있었습니다. 이제 여러분은 약간의 클래스와 인터페이스만으로도 PIM API 옵션 패키지 지원 장치의 개인 정보를 처리하는 MIDlet 개발 작업에 착수할 수 있습니다.

추가 정보

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

2006/02/02 17:32 2006/02/02 17:32

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

댓글을 달아 주세요

  1. 이우철  수정/삭제  댓글쓰기

    좋은 정보 고맙습니다 (__)

    2007/09/07 20:06
  2. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

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

◀ Prev 1  ... 437 438 439 440 441 442 443 444 445  ... 626  Next ▶