500 likes | 649 Views
Personal Java 로 모바일 자바 프로그램 방법 소개. 김 명 호 , ( 주 ) 비트웹 기술이사 (toodull@hitel.net). J2ME 와 PersonalJava PJAE API API 요소의 분류 최소 PJAE 의 정의 효율성을 고려한 PersonalJava 프로그램 설계. PJAE 를 위한 개발 지원 도구 JavaCheck 과 PJEE 주요 PJAE 구현사와 제품 PersonalJava 프로그래밍 프레임워크 e-Spider 프로그램 개발사례. 목 차.
E N D
Personal Java로 모바일 자바 프로그램 방법 소개 김 명 호, (주)비트웹 기술이사 (toodull@hitel.net)
J2ME와 PersonalJava PJAE API API 요소의 분류 최소 PJAE 의 정의 효율성을 고려한PersonalJava 프로그램설계 PJAE를위한개발 지원 도구 JavaCheck과 PJEE 주요 PJAE 구현사와 제품 PersonalJava 프로그래밍 프레임워크 e-Spider 프로그램 개발사례 목 차
Micro & Mobile Java’s • Java2 Micro Edition (J2ME) • Personal Java • Embedded Java, JavaCard, JavaTV, ...
Personal Java • 네트웍연결성이 있는 소형기기를 위한소규모의Java 실행환경 • Classic VM 기반 • Java API의부분집합으로구성 • 새로운API도추가로정의 • Truffle 그래픽툴킷, PTimer 타이머 클래스
Embedded Java, ... • 여러유형의Closed System을정의 • J2ME를보완하는스펙으로 볼 수 있음
J2ME와Personal Java Personal Java도CDC를위한하나의Profile로정의되어J2ME에포함될예정
J2ME와Personal Java(계속) • PersonalJava ~ CDC + Personal Profile • Personal Java코드는CDC + Personal Profile에서수정없이동작할것으로기대됨
PJAE – Personal Java Application Environment • JDK 1.1.8 API의 패키지, 클래스,메서드를수정하여정의 • 보안기능은Java 2 Security API를일부채택 • PJAE API의구성 • 필수, 선택, 미지원, PJAE-전용 • 하나의 완성된 API이기보다API의스펙트럼을정의 • JDK 1.1.8의 후속 API가PJAE에자동으로포함되지는않음
PJAE의 개념도 Java 2 API JDK 1.1.8 API Security API PJAE-전용API
PJAE의 필수 API • JDK 1.1.8에서의대응하는기능을 그대로 유지하도록정의된API
PJAE의 선택 API • PJAE에서반드시구현하도록요구되지는않는기능들의집합 • 지원여부는PJAE 구현자선택에달려있음 • 지원하는경우반드시JDK 1.1.8의기능과일치하도록구현하여야함 • “미지원선택기능” • 구현되지 않은 선택 API의 기능
PJAE의 선택 API (계속) • 미지원선택기능참조를의미하는예외클래스 com.sun.lang.UnsupportedOperationException • 구현되지않은선택패키지의클래스참조 시 java.lang.NoClassDefFoundError 예외가발생 • 구현되지않은선택클래스의내용참조 시 java.lang.NoClassDefFoundError 혹은com.sun.lang.UnsupportedOperationException예외가발생
PJAE의 미지원 API • PJAE에서지원되지않는기능들의집합 • 미지원API의클래스, 메서드, 필드는PJAE 구현에어떤형태로든제공되지않아야함 • 미지원패키지나 그내용을참조하면java.lang.NoClassDefFoundError예외발생
PJAE의 변경 API • JDK 1.1.8와는 다르게 정의된PJAE의기능 • 변경패키지 일부클래스가선택, PJAE-전용, 혹은변경클래스 • 변경클래스 일부메서드가선택, PJAE-전용, 혹은변경메서드 • 변경메서드 메서드의기능이JDK 1.1.8에서와다르게정의
PJAE의 전용 API • PJAE에는있지만JDK에는대응하는기능이없는기능들의집합 • com.sun.lang 패키지 com.sun.util.PTimer 클래스 com.sun.awt 패키지의input method 인터페이스 java.awt.Component.isDoubleBuffered 메서드
최소 PJAE • 모든 선택패키지/클래스/메서드, 변경메서드의선택적기능이 제공되지 않는 PJAE의구현 • Personal Java 프로그래머는최소PJAE를목표로프로그램을설계, 구축하여야함!
PJAE API의대표적요소 • java.applet (필수) • java.awt (변경) • 변경클래스 • Frame: 생성자를한번만호출할수있음 • Dialog: 하나의모드가 있는(modal) 다이얼로그를지원 • Window: 윈도우 객체의 직접생성금지 • 선택클래스 • FileDialog • CheckboxMenuItem, Menu, MenuBar, MenuShortcut: Frame과미지원 선택 클래스 그룹을형성
PJAE API의대표적요소(계속) • java.awt.datatransfer (필수) • java.awt.event (필수) • java.awt.iamge (필수) • java.beans (필수) • java.io (변경) • 가시적인파일시스템관련클래스들은미지원선택클래스그룹을형성함 • java.lang (변경) • Java 2 Security API의클래스와메서드를제공
PJAE API의대표적요소(계속) • java.lang.reflect (변경) • Java 2의정밀액세스제어클래스를제공 • Constructor, Field, Method의직접상위클래스가java.lang.reflect.AccessibleObject로변경 • java.math (선택) • java.security 패키지의코드서명기능과미지원 선택클래스의그룹을형성함
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 (변경)
PJAE API의대표적요소(계속) • java.sql (선택) • java.math와 미지원 선택클래스의그룹을형성함 • java.text (필수) • 지원되는문자인코딩은구현에따라다를수있음 • ISO 8859-1, Unicode, 플랫폼자체의문자인코딩은반드시제공
PJAE API의대표적요소(계속) • java.util (변경) • 정밀액세스제어를위한 Java 2 Security API 관련클래스를제공하여야함 • 코드서명기능을구현할경우Java 2의Collection API도완전하게제공하여야함 • java.util.jar, java.util.zip (변경)
PJAE를위한프로그램설계 • 최소PJAE를추구하라 • GUI는단일프레임만가질수있음 • RMI, JDBC 등의API가지원되지않을가능성이높음 • 인터넷기능은소켓과HTTP에의존해야함 • ... • 불편한 입출력을 고려하여 최소 입력, 최적 출력을추구하라 • 효율성을항상생각하라 • PJAE는 이식성이나유연성보다효율성을고려해야할경우가많다
효율성을고려한Personal Java 프로그램설계 • 효율성의 요소 • 실행 시간, 실행 및 탑재에 필요한 기억 장소 • 효율성과 관련된 일반 원칙 • 효율성이의심스러우면Java를사용하지말라(^^) • Java는 효율성을 손쉽게 제어할 수 있는 언어가 아니다! • 복잡한 기능을 서버로이전하라 • 보다 효율적 알고리즘과 데이터 구조를 사용하라
Personal Java와 효율성(계속) • 실행시간을고려하여코드를작성하라 • 필드나정적변수대신지역변수를사용하라 • 문자열접속에String 대신StringBuffer를사용하라 • 스레드를사용하되불필요한동기화를피하라 • java.util.Vector, java.util.Hashtable 사용을자제하라 • ...
Personal Java와 효율성(계속) • 실행에요구되는기억장소양을최소화하라 • 객체보다는기본형과배열을활용하라 • 객체생성의 비용을최소화하라 • 핫 스팟 주변에서는 중량급 객체를 피하라 • 불필요한 객체의 생성을 피하고기존 객체를 재사용하라 • 객체 생성을최대한지연시켜라 (lazy instantiation) • 자동적 가비지수집에 지나치게 의존하지말라
PJAE를위한프로그램개발 • J2SE용 RAD 도구는 별로 도움이되지않음 • PersonalJava를 위한 통합형개발도구는거의없음 • Sun사의 개발도구를 활용할 경우 • 개발: javac + pjcc (PJAE compatibility classes) • 검사: JavaCheck • 실험: PJEE (PersonalJava Emulation Environment) • 프로파일링, 튜닝과벤치 마킹 • java –Xrunhprof:cpu=samples MainClass
JavaCheck • 플랫폼 사양 파일을 기준으로 코드에 포함된 • 패키지/클래스/메서드가 특정 사양의 만족여부를 판단하기 위한 도구 • 플랫폼 사양 파일 • SGML 형식으로 인코딩된 텍스트 파일 • 현재 최소 PJAE 1.1.0을 위한 사양 파일만 제공 • PJAE를 위한 JavaCheck 메시지 • 에러: 미지원/Unsupported, 선택/Optional • 경고: 변경/Modified, 미해결/Unresolved, OK
JavaCheck 실행의 예 • 우측 예에서는java.awt.Frame 생성자가변경된기능임을경고하고있으며,프로그램변경이필요하지않으면 무시해도괜찮다는 것을의미
PJEE-Personal Java Emulation Environment • PJAE 준수 코드를 실행할 수 있는 데스크 탑 소프트웨어 • 최소 및 최대 PJAE를 위한 환경을 제공, 다양한 구현을 위한 코드 실험 가능 • 최소PJAE + Touchable LAF에서실험한예
주요 PJAE 구현사와 제품 • Sun의Reference Implementation (http://java.sun.com/) • 지원환경 • 프로세서: MIPS, SH3, SH4, ARM • 운영체제: Windows CE • 구현수준 • java.awt, java.io, java.math, java.rmi, java.sql, java.util.zip 패키지를구현하였으나java.security는구현하지않음
주요 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의모든기능을완전하게구현하였음
주요 PJAE 구현사와 제품(계속) • NSIcom의JSCP/CrEme (http://www.nsicom.com) • JSCP는 Sun사의Personal Java 코드를이식, • CrEme은 JSCP를WinCE 환경을위하여최적화한것 • 지원환경 • 프로세서: 68k, Sparc, MIPS, ARM, x86, PowerPC, SH3 • 운영체제: DOS, Win32, Linux, LynxOS, pSOS, VRTX, VxWorks • 구현수준 • 주문자의 요구에따른다양한수준의구현을제공
주요 PJAE 구현사와 제품(계속) • KadaSystems의KadaVM (http://www.kadasystems.com/) • Sun 코드에의존하지않고가상머신(Kada EVM)을새로이구축 • 지원환경 • Palm Computing Platform, Win32 환경 • 구현수준 • java.beans(필수), java.rmi(선택), java.security(변경) 패키지를지원하지않음
Personal Java 프로그래밍 프레임워크 • Main(Frame)+Skeleton(Cards)+RatioLayout • 최소PJAE에적합한 단일프레임 구조 • 메뉴 처리 모듈 스켈리튼 Skeleton • 카드스택설정과디스플레이 조정 등을자동화 • 실행하기, 이전메뉴, 메시지인터페이스의 일관성 제공 • 레이아웃은 기억장소 효율적인RatioLayout을사용 • 실시간 웹데이터 처리를 위한인터페이스제공 • 실제 서비스는웹자동화미들웨어인Wire Server로 이전
Personal Java 프로그래밍프레임워크(계속) • 메뉴 처리 모듈 스켈리튼 Skeleton (계속) • 카드할당을최대한지연, 불필요한카드는 즉시회수 • 최소입력과최적출력을구현 • 각 메뉴 처리 모듈 • Skeleton 클래스를 상속하여 작성 • Provider: initialize, execute, cleanup메서드작성 • Caller: setup, fire 메서드 호출 • 단순화,규모최소화, 인터페이스 일관성 실현
Wire 웹자동화미들웨어Wire = WebIDL Runtime Engine Wire 클라이언트 모듈 Wiring Protocol 클라이언트 코드 Wire Server 웹서버 웹 자동화 프로그램 서비스 스크립트 웹 서비스 설계와 검증 Wire Inspector HTTP
“주요뉴스” 서비스스크립트의예 <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>
Personal Java 클라이언트 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 요소를 추상화
Personal Java응용프로그램 e-Spider • Personal Java와 Wire Server를 사용하여 개발된 모바일 형 웹 기반 종합정보시스템 • 65KB jar 파일로 배포할 수 있는 초경량 프로그램 • 증권, 증시, 뉴스, 웹 메일, 문자메시지, 영화리뷰, 일기예보, 게시판, 영한사전 서비스, ...
spider.util.Skeleton package spider.util; import spider.Spider; 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 = Spider.makeButton("실행하기"); exit = Spider.makeButton("이전메뉴"); send.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fire(); }}); final Skeleton sk = this; exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cleanup(); Spider.delete(sk); hide(); Spider.front(parent); }}); message = Spider.makeStrongLabel("실행 대기중입니다", Label.LEFT); if (Spider.isColor()) message.setForeground(Color.red.darker()); } ...
spider.util.Skeleton (계속) public abstract class Skeleton extends Panel { … public Skeleton setup() { setLayout(new RatioLayout()); initialize(); Spider.insert(ident, this); Spider.front(ident); return this; } public void fire() { StopWatch timer = new StopWatch(); try { timer.start(); execute(); } catch (Exception exc) { Spider.putMessage(exc.toString()); } finally { timer.finish(); } } protected abstract void initialize(); protected abstract void execute() throws Exception; protected void cleanup() { send = exit = null; message = null; } Button send, exit; Label message; ... }
“주요뉴스” 메뉴처리모듈 package spider; import wire.proto.*; // Wire 클라이언트 모듈 API import java.awt.*; import java.awt.event.*; class News extends spider.util.Skeleton { public News(String parent) { super("주요 뉴스", parent); } protected void initialize() { titles = Spider.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); // Fields send, exit, and message from Skeleton add(".50, .84; .48, .08", exit); add(".02, .92; .96, .08", message); }
“주요뉴스” 메뉴처리모듈(계속) class Newsextends spider.util.Skeleton { ... protected void execute() throws Exception { // Connector Spider.wire() throws ConnectionFailureException; Binding os = Spider.wire().request("news", "top", null); // Wire Server에 서비스 요청 stories = (String[])os.get("stories"); if (stories != null) for(int i = 0; i < stories.length; i++) titles.addItem(stories[i]); links = (String[])os.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();
e-Spider의배포 • 3가지의 배포 형식이 있음 • 독자 실행형 Personal Java 클라이언트 • 최소 PJAE + i18n.jar(국제화 지원 라이브러리) 환경 • 독자 실행형 Java 클라이언트 • JDK1.1.8 이상의 임의의 Java 환경 • 애플릿 • http://210.217.5.110/demo.html 애플릿 링크 참조 • e-Spider *is* a DONATION-ware!
Afterthoughts • Personal Java 프로그래밍 • 최소 PJAE 에 대한 충분한 이해 • 실행 성능과 기억장소를 위한 프로그램 최적화 기술 • 재사용 프레임워크 구축과 활용 기술 • Personal Java의 이식성 • 상위 스펙(프로파일)에 대한 호환성 제공 • 하위 스펙이나 서로 다른 구현 수준에 대한 이식성은 보장되지 않음!