GWT/AppEngine/C2DM<br />
Google Web Toolkit<br />[CODE: GWT Sample 예제]<br />최근 클라이언트 디바이스 , 접속방법  -> 다양화<br />멀티 디바이스 /Browser를지원하는 웹 애플리케이션 개발 증가<...
JAVA로 작성<br />[CODE: GWT Sample 예제]<br />publicclass Person {<br />final String firstName;<br />final String lastName;<br ...
결과<br />[CODE: GWT Sample 예제]<br />
실제 생성된 JavaScript<br />function Person(firstName, lastName){<br />    this._firstName = firstName;<br />    this._lastName...
나름의 최적화<br />최적화된JavaScript]<br />function Person(){<br />this.firstName = 'Brian';<br />this.lastName = 'Lee';<br />}<br ...
클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />비동기 처리 방식인 AJAX웹 애플리케이션에서 보편적으로 사용<br />사용자에게 좀 더 인터렉티브하고 자연스러운 경험 제공<br ...
클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />1. 클라이언트: RPC를 사용하여 서버로 부터 서비스 받을 인터페이스를 정의, 어떤 메소드 형태로 해당 서비스를 제공 받을지 정의...
클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />2. 서버:클라이언트에 제공할 서비스 구현 코드(Servlet형태)를 작성한다. 작성된 코드(클래스)는 'RemoteServiceS...
클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />3. 클라이언트: 클라이언트가 서버에서 제공하는 서비스를 호출했을 때 비동기 방식으로 응답 받기 위한 콜백 인터페이스를 정의하고, ...
AppEngine<br />온라인 서비스를 안정적으로 처리할 서버, 미들웨어, 데이타베이스 및 네트웍 직접 구성?<br />애플리케이션의 인기가 수직 상승하면서 방문자 수가 급격히 늘어날<br />경우 최대 부하량의 예...
AppEngine<br />
AppEngine<br />Python, Java, Go 언어를 지원하는 런타임 환경과 SDK를 제공하며 각 환경은 웹<br />애플리케이션 개발을 위한 표준 프로토콜과 기술을 제공한다.<br />▫ Sandbox : ...
AppEngine<br />▫ DataStore<br />데이터를 분산 저장하고, 손쉽게 저장공간을 객체(object) 데이터베이스로 이해해야 <br />Datastore는 일관성 제공과 최적화된 동시성 제어를 한다. ...
AppEngine<br />▫ DataStore<br />데이터를 분산 저장하고, 손쉽게 저장공간을 객체(object) 데이터베이스로 이해해야 <br />Datastore는 일관성 제공과 최적화된 동시성 제어를 한다. ...
C2DM<br />APNS(apple push notification service)<br />Android Cloud to Device Messaging Framework<br />
C2DM<br />서버 -> 안드로이드 디바이스로 데이터를 보내는 푸쉬 서비스(폴링은 이제 그만)<br />대용량의 데이터를 전송하는 것이 아니라, lightweight 메시지 전송용(1024바이트)<br />서버에 새...
C2DM<br />-컴포넌트(물리적인 엔터티)<br /> ☞모바일 디바이스 : 안드로이드 2.2 이상, 구글 계정에 로그인 되어 있어야 함<br /> ☞Third-Party App. Server : 안드로이드 디바이스(...
C2DM<br /> ☞ C2DM 활성화<br />    1. 메시징 서비스 사용을 위해 디바이스 C2DM 서버에 등록, indent(REGISTER)를 C2DM 서버로 보냄(Sender ID와 ApplicationID ...
C2DM<br />
C2DM<br />
DEMO<br />http://code.google.com/p/chrometophone/<br />http://cloudtasksio.appspot.com/<br />
이벤트<br />스파게티 소스를 피하기 위해서는 EventBus를 사용하자<br />
Model – View - Presenter<br />
Model – View - Presenter<br />classPhone implementsContactDetail {<br />    finalContactDetailId id;<br />    String numbe...
Model – View - Presenter<br />void bindDisplay(Display display) {<br />    this.display= display;<br />    display.getSave...
사용자 정의 이벤트 : GwtEvent(이벤트)<br />com.google.web.bindery.event.shared.Event<H extends EventHandler><br />Type<H><br />ⓢ<br /...
사용자 정의 이벤트 : EventHandler(이벤트 핸들러)<br />com.google.gwt.event.shared.EventHandler<br />ⓘ<br />Mark Interface<br />
사용자 정의 이벤트 : 등록 및 발생<br />이 interface를 구현한 클래스는 이벤트 TYPE의 연결되어 있는 핸들러의 리스트를 가지고 있고, 해당 이벤트 TYPE에 맞는 핸들러를 수행한다.<br />직접적인 의...
사용자 정의 이벤트 : 예제<br />이벤트 핸들러 정의<br />public interface FriendEditEventHandler extends EventHandler {<br />void onEditFriend...
사용자 정의 이벤트 : 예제<br />이벤트 버스 생성<br />private SimpleEventBus eventBus = new SimpleEventBus();<br />이벤트 등록<br />eventBus.addH...
사용자 인터페이스 : Widget<br />com.google.gwt.user.client.ui.UIObject<br />Type<H><br />ⓢ<br /> <br />-모든 UI의 슈퍼 클래스<br />-단순이 DO...
Upcoming SlideShare
Loading in …5
×

구글 기술을 이용한 모바일 클라우드 애플리케이션 개발

2,318 views
2,226 views

Published on

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,318
On SlideShare
0
From Embeds
0
Number of Embeds
117
Actions
Shares
0
Downloads
31
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

구글 기술을 이용한 모바일 클라우드 애플리케이션 개발

  1. 1. GWT/AppEngine/C2DM<br />
  2. 2. Google Web Toolkit<br />[CODE: GWT Sample 예제]<br />최근 클라이언트 디바이스 , 접속방법 -> 다양화<br />멀티 디바이스 /Browser를지원하는 웹 애플리케이션 개발 증가<br />많은 양의 JavaScript 및 AJAX 컴포넌트 코드 어렵고 부담스러운 일<br />복잡한 JavaScript 코드를 객체지향 언어인 Java프로그래밍 언어를 사용해서 개발<br />
  3. 3. JAVA로 작성<br />[CODE: GWT Sample 예제]<br />publicclass Person {<br />final String firstName;<br />final String lastName;<br />public Person(String firstName, String lastName) {<br />this.firstName = firstName;<br />this.lastName = lastName;<br /> }<br />public String getName(){<br />returnfirstName + " " + lastName;<br /> }<br />}<br />publicclass Test implements EntryPoint {<br />publicvoid onModuleLoad() {<br /> TextBox nameField = new TextBox();<br /> Person usr = new Person("Brian", "Lee");<br /> nameField.setText(usr.getName());<br /> RootPanel.get("nameFieldContainer").add(nameField);<br /> }<br />}<br />
  4. 4. 결과<br />[CODE: GWT Sample 예제]<br />
  5. 5. 실제 생성된 JavaScript<br />function Person(firstName, lastName){<br /> this._firstName = firstName;<br /> this._lastName = lastName;<br />}<br />function getName(e){<br /> return e._firstName + ' ' + e._lastName;<br />}<br />function TextBox(){<br /> vare = parent.document.createElement('INPUT');<br /> e.type = 'text';<br /> e.style = 'gwt-TextBox';<br /> return e;<br />}<br />function setText(e, str){<br /> e.value = str;<br />}<br />function get(elem_id){<br /> return document.getElementById(elem_id);<br />}<br />function add(container, child){<br /> container.appendChild(child);<br />}<br />function onModuleLoad(){<br /> var nameField, usr;<br /> nameField= new TextBox;<br /> usr = new Person('Brian', 'Lee');<br /> setText(nameField, getName(usr));<br /> add(get('nameFieldContainer'), nameField);<br />}<br />
  6. 6. 나름의 최적화<br />최적화된JavaScript]<br />function Person(){<br />this.firstName = 'Brian';<br />this.lastName = 'Lee';<br />}<br />setText(nameField, usr.firstName + ' ' + usr.lastName);<br />
  7. 7. 클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />비동기 처리 방식인 AJAX웹 애플리케이션에서 보편적으로 사용<br />사용자에게 좀 더 인터렉티브하고 자연스러운 경험 제공<br />GWT RPC는 HTTP 기반에서 클라이언트와 서버간의 Java 오브젝트를 쉽게 주고 받을 수 있도록 한다. <br />서버에서 클라이언트에게 제공하는 코드를 보통 '서비스' (Java Servlet)<br />클라이언트에서는 프록시 클래스(자동 생성, 서버제공 서비스 정의)를 사용<br />GWT는 클라이언트와 서버간의 전달되는 Java 객체(보통 서비스<br />메소드의 인자 또는 리턴값으로 전달)의 직렬화<br />GWT RPC는 SOAP과 REST에 기반한 웹서비스와는 다르고 클라이언트와 서버간에 데이터를 전송하는데 간단하고, 처리에 가벼운 방법을 제공한다.<br />
  8. 8. 클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />1. 클라이언트: RPC를 사용하여 서버로 부터 서비스 받을 인터페이스를 정의, 어떤 메소드 형태로 해당 서비스를 제공 받을지 정의한다<br />@RemoteServiceRelativePath("stockPrices")<br />publicinterface StockPriceService extends RemoteService {<br /> StockPrice getSumPrices(StockPrice[] items) throws IllegalArgumentException;<br />}<br />
  9. 9. 클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />2. 서버:클라이언트에 제공할 서비스 구현 코드(Servlet형태)를 작성한다. 작성된 코드(클래스)는 'RemoteServiceSevlet' 을 상속받고, 1번에서 작성한 서비스 할(받을) 인터페이스를 실제 구현한다.<br />publicclass StockPriceServiceImpl extends RemoteServiceServlet implements StockPriceService{<br />publicStockPrice getSumPrices(StockPrice[] items) throws IllegalArgumentException{<br />intsum = 0;<br /> for (int i=0; i<items.length; i++) {<br /> sum += items[i].getPrice();<br /> }<br /> StockPrice stk = new StockPrice();<br /> stk.setSymbol("총합");<br /> stk.setPrice(sum);<br />returnstk;<br /> }<br />}<br />
  10. 10. 클라이언트와 서버간 통신(GWT RPC)<br />최적화된JavaScript]<br />3. 클라이언트: 클라이언트가 서버에서 제공하는 서비스를 호출했을 때 비동기 방식으로 응답 받기 위한 콜백 인터페이스를 정의하고, 비동기 응답 처리를 위한 콜백오브젝트를 작성한다.<br />final StockPriceServiceAsync stockPriceSvc = GWT.create(StockPriceService.class);<br />AsyncCallback<StockPrice> callback = new AsyncCallback<StockPrice>() {<br /> publicvoid onSuccess(StockPrice result) {<br /> nameField.setText(result.getSymbol() + ":" + result.getPrice());<br /> }<br />};<br />stockPriceSvc.getSumPrices(items, callback);<br />
  11. 11. AppEngine<br />온라인 서비스를 안정적으로 처리할 서버, 미들웨어, 데이타베이스 및 네트웍 직접 구성?<br />애플리케이션의 인기가 수직 상승하면서 방문자 수가 급격히 늘어날<br />경우 최대 부하량의 예측이 어렵다. 비용을 생각 무한정인프라 자원을 넉넉하게 구성?<br />수도세, 전기세를 내듯이 인프라 자원을 쓴 만큼만 비용을 지불하면?<br />PAAS(platform-as-a-service)라는 도구를 통해 애플리케이션을 더욱 쉽게<br />작성, 전개 및 배포<br />
  12. 12. AppEngine<br />
  13. 13. AppEngine<br />Python, Java, Go 언어를 지원하는 런타임 환경과 SDK를 제공하며 각 환경은 웹<br />애플리케이션 개발을 위한 표준 프로토콜과 기술을 제공한다.<br />▫ Sandbox : 보안이 뒷 받침된 환경에서 수행된다. 해당 애플리케이션이 수행되는 공간은 다른 환경(다른 애플리케이션, OS, 하드웨어 등)과는 독립적으로 분리되어 운영<br />몇가지 제한적인 측면도<br />∙ 앱엔진에서 구동되는 애플리케이션은 앱엔진이 제공하는 URL Fetch와 email<br />서비스를 통해서만 다른 외부 컴퓨터에 접근할 수 있다. 반대로 외부 컴퓨터에서 해당<br />애플리케이션에 접근하려면, 지정된 포트의 HTTP(또는 HTTPS) 요청을 통해서만<br />접근가능 하다.<br />∙ 애플리케이션이 직접 파일 시스템에 쓸 수 없다. 단지 파일을 읽을 수 만 있다. 만약<br />파일 업로드나 데이터 저장 같은 지속적인 상태 유지를 위해서는 앱엔진 Datastore 또는<br />메모리 캐쉬등을 이용한다.<br />∙ 애플리케이션 코드는 웹 요청, 예정된 Task에 의해서만 수행되고, 30초를 초과하는<br />애플리케이션 코드는 앱엔진에 의해 중단된다. 뿐만 아니라 요청 핸들러는 하위<br />프로세스를 생성하거나, 요청에 대한 응답이 보내진 후에는 다른 코드를 수행하지<br />않는다.<br />
  14. 14. AppEngine<br />▫ DataStore<br />데이터를 분산 저장하고, 손쉽게 저장공간을 객체(object) 데이터베이스로 이해해야 <br />Datastore는 일관성 제공과 최적화된 동시성 제어를 한다. 예를 들어, 하나의 데이터 엔터티에 대해 업데이트를 수행하려고 할 때 다른 프로세스가 동일한 엔터티를 업데이트 하고 있어 오류가 발생한다면, 해당 업데이트가 성공할 때 까지 동일한<br />트랜젝션 내에서 여러 번 업데이트를 수행<br />▫ Google 계정<br />당연한 얘기일 수 있으나 앱엔진은 사용자 인증을 위해서 Google 계정과의 연동을 지원한다. 앱엔진 애플리케이션에서 Google 계정을 가지고 해당 애플리케이션에 로그인 할 수 있다. 또한 Google 계정에 연결된 여러가지 정보(ID/email주소/표시이름 등)를<br />애플리케이션에서 사용할 수 있다. 따라서 애플리케이션에서 따로 새로운 계정을 생성할 필요 없이 Google 계정을 사용할 수 있어서, 사용자가 빠르게 해당 애플리케이션을시작할 수 있게 한다.<br />▫ 앱엔진 서비스<br />앱엔진에서 애플리케이션 개발을 용이하게 하기 위해 여러가지 서비스를 제공한다.<br />사용할 수 있는 서비스 API는 URL Fetch, Mail, Memcache, Image 처리 관련 API,<br />주기적인 Task및 Background Task 처리가 있다.<br />
  15. 15. AppEngine<br />▫ DataStore<br />데이터를 분산 저장하고, 손쉽게 저장공간을 객체(object) 데이터베이스로 이해해야 <br />Datastore는 일관성 제공과 최적화된 동시성 제어를 한다. 예를 들어, 하나의 데이터 엔터티에 대해 업데이트를 수행하려고 할 때 다른 프로세스가 동일한 엔터티를 업데이트 하고 있어 오류가 발생한다면, 해당 업데이트가 성공할 때 까지 동일한<br />트랜젝션 내에서 여러 번 업데이트를 수행<br />▫ Google 계정<br />당연한 얘기일 수 있으나 앱엔진은 사용자 인증을 위해서 Google 계정과의 연동을 지원한다. 앱엔진 애플리케이션에서 Google 계정을 가지고 해당 애플리케이션에 로그인 할 수 있다. 또한 Google 계정에 연결된 여러가지 정보(ID/email주소/표시이름 등)를<br />애플리케이션에서 사용할 수 있다. 따라서 애플리케이션에서 따로 새로운 계정을 생성할 필요 없이 Google 계정을 사용할 수 있어서, 사용자가 빠르게 해당 애플리케이션을시작할 수 있게 한다.<br />▫ 앱엔진 서비스<br />앱엔진에서 애플리케이션 개발을 용이하게 하기 위해 여러가지 서비스를 제공한다.<br />사용할 수 있는 서비스 API는 URL Fetch, Mail, Memcache, Image 처리 관련 API,<br />주기적인 Task및 Background Task 처리가 있다.<br />
  16. 16. C2DM<br />APNS(apple push notification service)<br />Android Cloud to Device Messaging Framework<br />
  17. 17. C2DM<br />서버 -> 안드로이드 디바이스로 데이터를 보내는 푸쉬 서비스(폴링은 이제 그만)<br />대용량의 데이터를 전송하는 것이 아니라, lightweight 메시지 전송용(1024바이트)<br />서버에 새로운 데이타가 있다는 걸 애플리케이션에게 알림<br />C2DM은 메세지 순서와 전달에 대한 개런티가 없음. 새로운 메시지를 즉시 전달하는데 사용<br />안드로이드 애플리케이션에서 메시지 수신을 위한 별도의 처리가 필요 없음. <br />애플리케이션이 설치되어 있고, 브로드케이스 리시버와 퍼미션이 있으면 안드로이드 시스템에서 메시지가 도착했을 때 Intent broadcast로 해당 애플리케이션을 동작시킨다.<br />android 2.2 버전 이상, 구글 계정 설정이 필요.<br />
  18. 18. C2DM<br />-컴포넌트(물리적인 엔터티)<br /> ☞모바일 디바이스 : 안드로이드 2.2 이상, 구글 계정에 로그인 되어 있어야 함<br /> ☞Third-Party App. Server : 안드로이드 디바이스(애플리케이션)으로 메시지를 보내는 서버.<br /> ☞C2DM Server : 구글이 운영, Third-Party 애플리케이션 서버로 부터의 메시지를 디바이스로 전달해주는 역할<br />- 인증<br /> ☞Sender ID : 애플리케이션 개발자 ID. 해당 애플리케이션을 인증하는데 사용<br /> ☞Application ID : 애플리케이션 ID, manifest의 패키지 명. 수신된 메시지가 올바른 애플리케이션을 찾게함<br /> ☞Registration ID: C2DM서버가 발급, 애플리케이션이 해당 ID를 third-party 서버에 보냄. 나 너가 보낸 메시지를 받을 수 있는 디바이스야라고..특정 디바이스의 특정 애플리케이션이라는 걸 나타냄<br /> ☞구글 계정 : 로그인 되어 있어야<br /> ☞Sender Auth Token :  ClientLogin Auth token은 third-party 애플리케이션 서버에 저장하고, third-party 서버가 구글 서비스에 접근할 수 있는 권한을 줌<br />
  19. 19. C2DM<br /> ☞ C2DM 활성화<br />    1. 메시징 서비스 사용을 위해 디바이스 C2DM 서버에 등록, indent(REGISTER)를 C2DM 서버로 보냄(Sender ID와 ApplicationID 포함)<br />    2. C2DM 서버는 REGISTRATION indent를 브로드 케스트(애플리케이션의 Registration ID를 보냄)<br />       Google은 주기적으로 Registration ID를 갱신하기 때문에, 그에 대한 처리 필요<br />    3. 등록절차를 완료하기 위해, 애플리케이션은 Registration ID를 애플리케이션 서버로 보냄. 서버는 해당 ID를 저장해야 함<br />    <br /> ☞ 메시지 전송 : 서버 -> 디바이스<br />    1. 전송할 디바이스의 Registration ID를 가지고 있어야 함.<br />    2.  ClientLogin authorization token 도 있어야 함(구글로긴)<br />    3. application 서버는 C2DM 서버로 메시지를 보낸다. C2DM서버는 device가 <br />활성화 되었을 때 디바이스로 메시지 전송<br /> ☞ 메시지 수신 : Android 앱 <- C2DM<br />    1. 안드로이드 시스템에서 메시지가 도착했을 때 <br />Intent broadcast로 해당 애플리케이션을 동작시킨다.<br />
  20. 20. C2DM<br />
  21. 21. C2DM<br />
  22. 22. DEMO<br />http://code.google.com/p/chrometophone/<br />http://cloudtasksio.appspot.com/<br />
  23. 23.
  24. 24. 이벤트<br />스파게티 소스를 피하기 위해서는 EventBus를 사용하자<br />
  25. 25. Model – View - Presenter<br />
  26. 26. Model – View - Presenter<br />classPhone implementsContactDetail {<br /> finalContactDetailId id;<br /> String number;<br /> String label; // work, home...<br />}<br />classPhoneEditor {<br /> interfaceDisplay {<br /> HasClickHandlers getSaveButton();<br /> HasClickHandlers getCancelButton();<br /> HasValue<String> getNumberField();<br /> HasValue<String> getLabelPicker();<br /> …<br />Display interface using characteristic interfaces<br />
  27. 27. Model – View - Presenter<br />void bindDisplay(Display display) {<br /> this.display= display;<br /> display.getSaveButton().addClickHandler(new ClickHandler() {<br /> publicvoid onClick(ClickEvent event) {<br /> doSave();<br /> }<br /> });<br /> display.getCancelButton().addClickHandler(new ClickHandler() {<br /> publicvoid onClick(ClickEvent event) {<br /> doCancel();<br /> }<br /> });<br />}<br />
  28. 28. 사용자 정의 이벤트 : GwtEvent(이벤트)<br />com.google.web.bindery.event.shared.Event<H extends EventHandler><br />Type<H><br />ⓢ<br /> <br />구현해야 하는 메소드<br />getAssociatedType : 이벤트를 등록할 때 사용된 Type클래스<br />dispatch(H handler) : 해당 핸들러를 수행<br />이벤트를 등록(HandlerManager)할 때 사용됨<br />GWT위젯/DOM이벤트의 ROOT <br />생성될 떄마다 index 가 +1 증가<br />Type<H><br />ⓢ<br /> <br />com.google.gwt.event.shared.GwtEvent<Hextends EventHandler><br />Type은 <br />Static 이다.<br />
  29. 29. 사용자 정의 이벤트 : EventHandler(이벤트 핸들러)<br />com.google.gwt.event.shared.EventHandler<br />ⓘ<br />Mark Interface<br />
  30. 30. 사용자 정의 이벤트 : 등록 및 발생<br />이 interface를 구현한 클래스는 이벤트 TYPE의 연결되어 있는 핸들러의 리스트를 가지고 있고, 해당 이벤트 TYPE에 맞는 핸들러를 수행한다.<br />직접적인 의존성 없이 객체들을 연결(이벤트 소스 없이 연결가능), (이벤트 TYPE, 이벤트 핸들러) 등록 및 관심있는 대상에게 이벤트를 전파함<br />ⓘ<br />com.google.gwt.event.shared.<br />HasHandlers<br />com.google.web.bindery.event.shared.<br />EventBus<br />addHandler<br />addHandlerToSource<br />fireEvent(GwtEvent<?> event)<br />fireEvent(Event<?>)<br />fireEventFromSource<br />com.google.gwt.event.shared.EventBus<br />Event -> GwtEvent로 변환<br />com.google.gwt.event.shared.SimpleEventBus<br />
  31. 31. 사용자 정의 이벤트 : 예제<br />이벤트 핸들러 정의<br />public interface FriendEditEventHandler extends EventHandler {<br />void onEditFriend(FriendEditEvent event);<br />}<br />이벤트 정의<br />public class FriendEditEvent extends GwtEvent<FriendEditEventHandler>{<br />public static Type<FriendEditEventHandler> TYPE = new Type<FriendEditEventHandler>();<br />private final String id;<br />public FriendEditEvent(String id) {<br />this.id = id;<br />}<br />public String getId() { return id; }<br />@Override<br />public Type<FriendEditEventHandler> getAssociatedType() {<br />returnTYPE;<br />}<br />@Override<br />protected void dispatch(FriendEditEventHandler handler) {<br /> handler.onEditFriend(this);<br />}<br />}<br />
  32. 32. 사용자 정의 이벤트 : 예제<br />이벤트 버스 생성<br />private SimpleEventBus eventBus = new SimpleEventBus();<br />이벤트 등록<br />eventBus.addHandler(FriendEditEvent.TYPE, new FriendEditEventHandler() {<br />public void onEditFriend(FriendEditEvent event) {<br /> GWT.log("AppController: Friend edit event received. Id: " + event.getId());<br />xxx}<br />});<br />이벤트 발생<br />eventBus.fireEvent(newFriendEditEvent(“0001“));<br />
  33. 33. 사용자 인터페이스 : Widget<br />com.google.gwt.user.client.ui.UIObject<br />Type<H><br />ⓢ<br /> <br />-모든 UI의 슈퍼 클래스<br />-단순이 DOM 엘리먼트를 둘러싸다.<br />-이벤트를 받을 수 없다.<br />-Style을 적용시킬 수 있다. cf) GWT의 스타일명은 [project]-[widget] 이다. 생성자에서 setStyleName()이 호출된다.<br />-ㅇㅇ<br />이벤트를 등록(HandlerManager)할 때 사용됨<br />GWT위젯/DOM이벤트의 ROOT <br />생성될 떄마다 index 가 +1 증가<br />Type<H><br />ⓢ<br /> <br />com.google.gwt.event.shared.GwtEvent<H><br />Type은 <br />Static 이다.<br />

×