강의 자료 - 모바일 자바

Download Report

Transcript 강의 자료 - 모바일 자바

Personal Java로 모바일 자바 프로그램 방법 소개
김 명 호, (주)비트웹 기술이사
([email protected])
목
 J2ME와 PersonalJava
 PJAE API
차
 PJAE를 위한 개발 지원 도구
 JavaCheck과 PJEE
 API 요소의 분류
 주요 PJAE 구현사와 제품
 최소 PJAE 의 정의
 PersonalJava 프로그래밍
 효율성을 고려한
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
PJAE-전용 API
Security 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.UnsupportedOperationExcep
tion 예외가 발생
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 API의 대표적 요소(계속)
JDK 1.1.8 Package
Personal Java 포함여부
java.applet
필수
java.awt
변경
java.awt.datatransfer
필수
java.awt.event
필수
java.awt.image
필수
java.beans
필수
java.io
변경
java.lang.reflect
변경
PJAE API의 대표적 요소(계속)
JDK 1.1.8 Package
Personal Java 포함여부
java.math
선택
java.rmi 관련
선택
java.security 관련
변경
java.sql
선택
java.text
필수
java.util
변경
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.*;
import java.awt.*;
import java.awt.event.*;
// Wire 클라이언트 모듈 API
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 News extends 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!
e-Spider의 스크린 샷
Afterthoughts
 Personal Java 프로그래밍
최소 PJAE 에 대한 충분한 이해
실행 성능과 기억장소를 위한 프로그램 최적화
기술
재사용 프레임워크 구축과 활용 기술
 Personal Java의 이식성
상위 스펙(프로파일)에 대한 호환성 제공
하위 스펙이나 서로 다른 구현 수준에 대한 이식
성은 보장되지 않음!
- 감사합니다 -