understanding personal java

49
Understanding Personal Java 김 김 김 , ( 김 ) 김김김 김김김김 ([email protected])

Upload: abba

Post on 13-Jan-2016

52 views

Category:

Documents


0 download

DESCRIPTION

Understanding Personal Java. 김 명 호 , ( 주 ) 비트웹 기술이사 ([email protected]). J2ME 와 PersonalJava PJAE API API 요소의 분류 최소 PJAE 의 정의 효율성을 고려한 PersonalJava 프로그램 설계. PJAE 를 위한 개발 지원 도구 JavaCheck 과 PJEE 주요 PJAE 구현사와 제품 PersonalJava 프로그래밍 프레임워크 e-Spider 프로그램 개발사례. 목 차. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Understanding  Personal Java

Understanding

Personal Java

김 명 호 , ( 주 ) 비트웹 기술이사([email protected])

Page 2: Understanding  Personal Java

목 차

J2ME 와 PersonalJava PJAE API

API 요소의 분류 최소 PJAE 의 정의

효율성을 고려한 PersonalJava 프로그램 설계

PJAE 를 위한 개발 지원 도구 JavaCheck 과 PJEE

주요 PJAE 구현사와 제품 PersonalJava 프로그래밍

프레임워크 e-Spider 프로그램 개발사례

Page 3: Understanding  Personal Java

Micro & Mobile Java’s

Java2 Micro Edition (J2ME)

Personal Java

Embedded Java, JavaCard, JavaTV, ...

Page 4: Understanding  Personal Java

Personal Java

네트웍 연결성이 있는 소형 기기를 위한 소규모의 Java 실행 환경

Classic VM 기반 Java API 의 부분 집합으로 구성새로운 API 도 추가로 정의

Truffle 그래픽 툴킷 , PTimer 타이머 클래스

Page 5: Understanding  Personal Java

EmbeddedJava, ...

여러 유형의 Closed System 을 정의 J2ME 를 보완하는 스펙으로 볼 수 있음

Page 6: Understanding  Personal Java

J2ME 와 PersonalJava

PersonalJava 도 CDC 를 위한 하나의 Profile 로 정의되어 J2ME 에 포함될 예정

Page 7: Understanding  Personal Java

J2ME 와 PersonalJava( 계속 )

PersonalJava ~

CDC +

Foundation Profile + Personal Profile

Page 8: Understanding  Personal Java

PJAE - PersonalJava Application Environment

JDK 1.1.8 API 의 패키지 , 클래스 ,메서드를 수정하여 정의

보안 기능은 Java 2 Security API 를 일부 채택 PJAE API 의 구성

필수 , 선택 , 미지원 , PJAE- 전용하나의 완성된 API 가 아니라 API 스펙트럼을 정의

JDK 1.1.8 의 후속 API 가 PJAE 에 자동으로 포함되지는 않음

Page 9: Understanding  Personal Java

PJAE 의 개념도

Java 2 API

JDK 1.1.8 API

JDK 1.1.8 API

Security API

PJAE- 전용 API

Page 10: Understanding  Personal Java

PJAE 의 필수 API

JDK 1.1.8 에서의 대응하는 기능을 그대로 유지하도록 정의된 API

Page 11: Understanding  Personal Java

PJAE 의 선택 API

PJAE 에서 반드시 구현하도록 요구되지는 않는 기능들의 집합

지원 여부는 PJAE 구현자 선택에 달려 있음

지원하는 경우 반드시 JDK 1.1.8 의 기능과 일치하도록 구현하여야 함

“ 미지원 선택 기능”구현되지 않은 선택 API 의 기능

Page 12: Understanding  Personal Java

PJAE 의 선택 API ( 계속 )

미지원 선택 기능 참조를 의미하는 예외 클래스com.sun.lang.UnsupportedOperationException

구현되지 않은 선택 패키지의 클래스 참조 시java.lang.NoClassDefFoundError 예외가 발생

구현되지 않은 선택 클래스의 내용 참조 시java.lang.NoClassDefFoundError 혹은 com.sun.lang.UnsupportedOperationException 예외가 발생

Page 13: Understanding  Personal Java

PJAE 의 미지원 API

PJAE 에서 지원되지 않는 기능들의 집합미지원 API 의 클래스 , 메서드 , 필드는 PJA

E 구현에 어떤 형태로든 제공되지 않아야 함

미지원 패키지나 그 내용을 참조하면 java.

lang.NoClassDefFoundError 예외 발생

Page 14: Understanding  Personal Java

PJAE 의 변경 API

JDK 1.1.8 와는 다르게 정의된 PJAE 의 기능 변경 패키지

일부 클래스가 선택 , PJAE- 전용 , 혹은 변경 클래스

변경 클래스일부 메서드가 선택 , PJAE- 전용 , 혹은 변경 메서드

변경 메서드메서드의 기능이 JDK 1.1.8 에서와 다르게 정의

Page 15: Understanding  Personal Java

PJAE 의 전용 API

PJAE 에는 있지만 JDK 에는 대응하는 기능이 없는 기능들의 집합

com.sun.lang 패키지

com.sun.util.PTimer 클래스

com.sun.awt 패키지의 input method 인터페이스

java.awt.Component.isDoubleBuffered 메서드

Page 16: Understanding  Personal Java

최소 PJAE

모든 선택 패키지 / 클래스 / 메서드 , 변경 메서드의 선택적 기능이 제공되지 않는 PJAE 의 구현

PersonalJava 프로그래머는 최소 PJAE를 목표로 프로그램을 설계 , 구축하라 !

Page 17: Understanding  Personal Java

PJAE API 의 대표적 요소 java.applet ( 필수 ) java.awt ( 변경 )

변경 클래스Frame: 생성자를 한번만 호출할 수 있음Dialog: 하나의 모드가 있는 (modal) 다이얼로그를 지원Window: 윈도우 객체의 직접 생성 금지

선택 클래스FileDialogCheckboxMenuItem, Menu, MenuBar, MenuShortcut: Fra

me 과 미지원 선택 클래스 그룹을 형성

Page 18: Understanding  Personal Java

PJAE API 의 대표적 요소 (계속 )

java.awt.datatransfer ( 필수 ) java.awt.event ( 필수 ) java.awt.iamge ( 필수 ) java.beans ( 필수 ) java.io ( 변경 )

가시적인 파일 시스템 관련 클래스들은 미지원 선택 클래스 그룹을 형성함

java.lang ( 변경 )Java 2 Security API 의 클래스와 메서드를 제공

Page 19: Understanding  Personal Java

PJAE API 의 대표적 요소 (계속 )

java.lang.reflect ( 변경 )Java 2 의 정밀 액세스 제어 클래스를 제공Constructor, Field, Method 의 직접 상위 클래스가 ja

va.lang.reflect.AccessibleObject 로 변경

java.math ( 선택 ) java.security 패키지의 코드 서명 기능과 미지원 선택 클래스의 그룹을 형성함

Page 20: Understanding  Personal Java

PJAE API 의 대표적 요소 (계속 )

java.net ( 변경 )URL 클래스

필수 프로토콜 : HTTP 1.0선택 프로토콜 : SSL, Gofer, FTP, SMTP, File

java.rmi 관련 패키지 ( 선택 ) java.security ( 변경 )

Java 2 Security API 를 채택정밀 액세스 제어는 필수 , 코드 서명은 선택 기능임 java.security.acl ( 미지원 ) java.security.cert/interfaces/spec ( 변경 )

Page 21: Understanding  Personal Java

PJAE API 의 대표적 요소 (계속 )

java.sql ( 선택 ) java.math 와 미지원 선택 클래스의 그룹을 형성함

java.text ( 필수 )지원되는 문자 인코딩은 구현에 따라 다를 수 있음

ISO 8859-1, Unicode, 플랫폼 자체의 문자 인코딩은 반드시 제공

Page 22: Understanding  Personal Java

PJAE API 의 대표적 요소 (계속 )

java.util ( 변경 )정밀 액세스 제어를 위한 Java 2 Security API 관련 클래스를 제공하여야 함

코드 서명 기능을 구현할 경우 Java 2 의 Collection API 도 완전하게 제공하여야 함

java.util.jar, java.util.zip ( 변경 )

Page 23: Understanding  Personal Java

PJAE API 의 대표적 요소 (계속 )

JDK 1.1.8JDK 1.1.8 Package Package PersonalJavaPersonalJava 포함여부포함여부java.applet 필수java.awt 변경java.awt.datatransfer 필수java.awt.event 필수java.awt.image 필수java.beans 필수java.io 변경java.lang.reflect 변경

Page 24: Understanding  Personal Java

PJAE API 의 대표적 요소 (계속 )

JDK 1.1.8JDK 1.1.8 Package Package PersonalJavaPersonalJava 포함여부포함여부java.math 선택

java.rmi 관련 선택

java.security 관련 변경

java.sql 선택

java.text 필수

java.util 변경

java.util.zip 변경

Page 25: Understanding  Personal Java

PJAE 를 위한 프로그램 설계 최소 PJAE 를 추구하라

GUI 는 단일 프레임만 가질 수 있음RMI, JDBC 등의 API 가 지원되지 않을 가능성이 있음인터넷 기능은 소켓과 HTTP 에 의존해야 함 ...

불편한 입출력을 고려하여 최소 입력 , 최적 출력을 추구하라

효율성을 항상 생각하라PJAE 는 이식성이나 유연성보다 효율성을 고려해야 할 경우가 많다

Page 26: Understanding  Personal Java

효율성을 고려한 PersonalJava 프로그램 설계

효율성의 요소실행 시간 , 실행 및 탑재에 필요한 기억 장소

효율성과 관련된 일반 원칙효율성이 의심스러우면 Java 를 사용하지 말라 ()

Java 는 효율성을 손쉽게 제어할 수 있는 언어가 아니다 !

복잡한 기능을 서버로 이전하라보다 효율적 알고리즘과 데이터 구조를 사용하라

Page 27: Understanding  Personal Java

PersonalJava 와 효율성 ( 계속 )

실행 시간을 고려하여 코드를 작성하라객체 초기화 과정에 필요한 비용을 최소화하라문자열 접속에 String 대신 StringBuffer 를 사용하라필드나 정적 변수 보다는 지역 변수를 사용하라스레드를 사용하되 불 필요한 동기화를 피하라

Vector 나 Hashtable 의 사용을 자제하라

...

Page 28: Understanding  Personal Java

PersonalJava 와 효율성 ( 계속 )

실행에 요구되는 기억장소 양을 최소화하라객체 보다는 기본형과 배열을 활용하라가능한 적은 개수의 객체를 생성하라

객체 생성을 최대한 지연시켜라 (lazy instantiation)불필요한 객체의 생성을 피하고 기존 객체를 재사용하라

자동적 가비지 수집에 지나치게 의존하지 말라...

Page 29: Understanding  Personal Java

PJAE 를 위한 프로그램 개발 J2SE 용 RAD 도구는 별로 도움이 되지 않음

PersonalJava 를 위한 통합형 개발 도구는 거의 없음 Sun 사의 개발도구를 활용할 경우

개발 : javac + pjcc (PJAE compatibility classes)검사 : JavaCheck실험 : PJEE (PersonalJava Emulation Environment)

프로파일링 , 벤치마킹 , 튜닝 java –Xrunhprof:cpu=samples MainClass

Page 30: Understanding  Personal Java

JavaCheck 플랫폼 사양 파일을 기준으로 코드에 포함된 패키지 / 클래스 / 메서드가 특정 사양의

만족여부를 판단하기 위한 도구 플랫폼 사양 파일

SGML 형식으로 인코딩된 텍스트 파일현재 최소 PJAE 1.1.0 을 위한 사양 파일만 제공

PJAE 를 위한 JavaCheck 메시지에러 : 미지원 /Unsupported, 선택 /Optional경고 : 변경 /Modified, 미해결 /Unresolved, OK

Page 31: Understanding  Personal Java

JavaCheck 실행의 예

우측 예에서는 java.awt.Frame 생성자가 변경된 기능임을 경고하고 있으며 , 프로그램 변경이 필요하지 않으면 무시해도 괜찮다는 것을 의미

Page 32: Understanding  Personal Java

PJEE-PersonalJava Emulation Environment

PJAE 준수 코드를 실행할 수 있는 데스크 탑 소프트웨어

최소 및 최대 PJAE를 위한 환경을 제공 , 다양한 구현을 위한 코드 실험 가능

최소 PJAE + Touchable LAF 에서 실험한 예

Page 33: Understanding  Personal Java

주요 PJAE 구현사와 제품

Sun 의 Reference Implementation (http://java.sun.com/)지원 환경

프로세서 : MIPS, SH3, SH4, ARM운영체제 : Windows CE

구현 수준java.awt, java.io, java.math, java.rmi, java.sql, j

ava.util.zip 패키지를 구현하였으나 java.security는 구현하지 않음

Page 34: Understanding  Personal Java

주요 PJAE 구현사와 제품 ( 계속 )

Insignia 의 Jeode (http://www.insignia.com/)Sun 코드에 의존하지 않고 가상머신 (Jeode EVM) 과 라이브러리 (Jeode Classes) 를 새로이 구축

지원 환경프로세서 : ARM, MIPS, x86, SH3, SH4, PowerPC운영체제 : Win32, VxWorks, Linux, Nucleus, BSDi, pSOS

구현 수준PJAE 1.2 의 모든 기능을 완전하게 구현하였음

Page 35: Understanding  Personal Java

주요 PJAE 구현사와 제품 ( 계속 )

NSIcom 의 JSCP/CrEme (http://www.nsicom.com)JSCP 는 Sun 사의 PersonalJava 코드를 이식 , CrEme 은 JSCP 를 WinCE 환경을 위하여 최적화 한 것지원 환경

프로세서 : 68k, Sparc, MIPS, ARM, x86, PowerPC, SH3운영체제 : DOS, Win32, Linux, LynxOS, pSOS, VRTX, VxWorks

구현 수준주문자의 요구에 따라 다양한 수준의 구현을 제공

Page 36: Understanding  Personal Java

주요 PJAE 구현사와 제품 ( 계속 )

KadaSystems 의 KadaVM (http://www.kadasystems.com/)Sun 코드에 의존하지 않고 가상머신 (Kada VM) 을 새로이 구축

지원 환경Palm Computing Platform, Win32 환경

구현 수준java.beans( 필수 ), java.rmi( 선택 ), java.security( 변경 ) 패키지를 지원하지 않음

Page 37: Understanding  Personal Java

PersonalJava 프로그래밍 프레임워크

package personal.framework Main(Frame)+Skeleton(Cards)+RatioLayout

최소 PJAE 를 위한 프로그래밍에 적합한 구조 RatioLayout

최소 자원 사용으로 복합 레이아웃을 효과적으로 표현 메뉴 처리 모듈 스켈리튼 Skeleton

카드 스택 설정 , 디스플레이 조정 등을 자동화객체의 배치를 위해 RatioLayout 을 사용

Page 38: Understanding  Personal Java

PersonalJava 프로그래밍 프레임워크 (계속 )

Skeleton ( 계속 )최소 PJAE 환경에 적합한 대화 모델 정의

look-and-feel 의 일관성 유지사용자 인터페이스 구축을 위한 코드의 중복 방지

카드 할당을 최대한 지연 , 불필요한 카드 즉시 회수 각 메뉴 처리 모듈

Skeleton 클래스를 확장하여 작성생성자 , initialize, execute, cleanup 메서드 작성모듈 사용자는 setup, fire 메서드 호출

Page 39: Understanding  Personal Java

personal.framework.Skeletonpackage personal.framework;import wire.proto.*;import java.awt.*;import java.awt.event.*;

public abstract class Skeleton extends Panel { public Skeleton(String ident, final String parent) { this.ident = ident; this.parent = parent; send = UI.makeButton(" 실행하기 "); exit = UI.makeButton(" 이전메뉴 "); send.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fire(); }}); exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cleanup(); UI.delete(this); hide(); UI.front(parent); }}); message = UI.makeStrongLabel(" 실행 대기중입니다 ", Label.LEFT); if (UI.isColor()) message.setForeground(Color.red.darker()); } ...

Page 40: Understanding  Personal Java

personal.framework.Skeleton ( 계속 )

public abstract class Skeleton extends Panel { … public Skeleton setup() { setLayout(new RatioLayout()); initialize(); UI.insert(ident, this); UI.front(ident); return this; } public void fire() { … try { execute(); … } catch (Exception ex) { putMessage(ex.toString()); } finally { … } } protected abstract void initialize(); protected abstract void execute() throws Exception; protected void cleanup() { send = exit = null; message = null; System.gc(); }

Button send, exit; Label message; ...}

Page 41: Understanding  Personal Java

PersonalJava 응용 프로그램 e-Spider

personal.framework 와 Wire Server 로 개발된 모바일형 실시간 웹 기반 종합정보시스템

증권 , 뉴스 , 웹 메일 , SMS, 영화 리뷰 , 일기 예보 , 게시판 , 영한사전 , …

유선 인터넷을 위한 웹 서비스를 수정 없이 활용

60KB 규모의 초경량 프로그램으로 배포 가능

Page 42: Understanding  Personal Java

e-Spider 스크린 샷

Page 43: Understanding  Personal Java

Wire 웹 자동화 미들웨어Wire = WebIDL Runtime Engine

웹 서버

HTTP

Wiring Protocol

Wire Inspector

 웹 자동화프로그램

 웹 서비스 설계와 검증

  서비스 스크립트 

 클라이언트 코드

Wire Server

Wire 클라이언트 모듈

Page 44: Understanding  Personal Java

“ 주요 뉴스” 서비스 스크립트 <MODULE NAME="news"> <SERVICE NAME="top"

OUTPUT="topOutput" URL="http://www.kdaily.com/news/newslist.php"/>

<BINDING NAME="topOutput"> <VARIABLE NAME="stories" NULLOK="TRUE" TYPE="STRING[]"> doc.table[3].a['*[*]*'].text</VARIABLE> <VARIABLE NAME="links" NULLOK="TRUE" TYPE="STRING[]"> doc.table[3].a['*[*]*'].href</VARIABLE></BINDING>

</MODULE>

Page 45: Understanding  Personal Java

PersonalJava 클라이언트 API

class Connector Connector(String host, [int port], [boolean mode]); Binding request(String mod, String svc, Binding inputs) throws RequestFailureException; void quit();

boolean TRANSIENT = false;boolean PERMANENT = (! TRANSIENT);

class Binding WIDL 언어의 <BINDING> 요소를 추상화

Page 46: Understanding  Personal Java

“ 주요 뉴스” 메뉴 처리 모듈 import personal.framework.*; // Skeleton, UI, ...import wire.proto.*; // Wire 클라이언트 모듈 APIimport java.awt.*;

class News extends Skeleton { public News(String parent) { super(" 주요 뉴스 ", parent); } protected void initialize() { titles = UI.makeList( new ListAction() { public void fire(int index) { titles.select(index); new NewsView(titles.getItem(index), links[index]).fire(); }}); add(".02, .02; .96, .81", titles); // RatioLayout 에 따라 객체를 배치 add(".02, .84; .48, .08", send); // class Skeleton 에서 상속 받은 필드 add(".50, .84; .48, .08", exit); add(".02, .92; .96, .08", message); }

Page 47: Understanding  Personal Java

“ 주요 뉴스” 메뉴 처리 모듈 ( 계속 )class News extends Skeleton { ... protected void execute() throws Exception { // Connector Spider.getWire() throws ConnectionFailureException; Binding outputs = Spider.getWire().request("news", "top", null); // news.top 호출 stories = (String[])outputs.get("stories"); if (stories != null) for(int i = 0; i < stories.length; i++) titles.addItem(stories[i]); links = (String[])outputs.get("links"); } protected void cleanup() { if (titles != null) { titles.removeAll(); titles = null; } stories = links = null; super.cleanup(); } private java.awt.List titles; private String[] stories, links;}// News 모듈 호출 : (new News("e-Spider")).setup().fire();

Page 48: Understanding  Personal Java

e-Spider 의 배포 독자 실행형 PersonalJava 클라이언트

최소 PJAE + i18n.jar 환경 독자 실행형 Java 클라이언트

JDK1.1.8 이상을 지원하는 임의의 Java 환경 Java 혹은 PersonalJava 애플릿

http://210.217.5.110/demo.html 애플릿 참조

e-Spider is a DONATION-ware!

Page 49: Understanding  Personal Java

Final Thoughts

PersonalJava 프로그래밍의 요소최소 PJAE 에 대한 충분한 이해실행 성능과 기억 장소를 위한 프로그램 최적화 기술

재사용 프레임워크 구축과 활용 기술 PersonalJava 와 WORA

Write-Once, Really Run-Anywhere ?상위 스펙이나 프로파일에 대한 호환성은 제공하위 스펙이나 서로 다른 구현 수준에 대한 이식성은 보장되지 않음 !