교육 및 세미나2011. 1. 10. 09:54
얼마 전에 Adobe에서 RIA관련 세미나에 참석 했다가 경품으로 목도리를 받게 되었다. JQTouch에 관심이 있어
참여 한
세미나였는데
끝날 때 쯤 진행자에게 문자를 먼저 보낸 5사람에게 목도리를 선물로 준다길래 욕심내봤는데
용케도 5위안에
들어 요즘처럼 추운 날씨에 요긴하게 쓰고 있다 ^^

아래글은 어도비 사이트에 올라온 세미나 후기다.




 
[세미나 후기 & 발표자료] 자바 커뮤니티 공동 4회 공감 세미나
RIA 세미나 / Posted 2010/12/09 14:35:
 

자바 커뮤니티 공동 제 4회 '공감' 세미나

발표 제목을 클릭하시면 자료로 이동합니다

발표 내용 발표자
Everywhere Adobe Platform 오창훈(ACC)
제이쿼리 모바일 허광남(OKJSP)
웹 소켓을 처리하는 분산캐시 김병곤(JBoss User Group) 
스프링 시큐리티를 이용한 OAuth 구현 고종봉(KSUG)

OKJSP, JBoss User Group, KSUG
가 공동 주최하고 한국어도비시스템즈가 후원하는, 자바 개발자를 위한네번째 공감세미나가 12 4일에 진행되었습니다.  올해 처음 시작된 "자바 개발자를 위한共感(공감)’을 찾아서"가 벌써 네 번째를 맞았고

내용도 알차고 의미도 있었던 자리였습니다.

 

첫 번째 세션은 Everywhere Adobe Platform 이라는 주제로 ACC 오창훈님께서 활기차게 미투로 시작을 알리며 진행해 주셨습니다.

앞으로는 Platform, Device에 관계없이 모두 호환이 되어야 한다는 것이 큰 맥락이였죠. 그래서 주제가 Everywhere Adobe Platform 이겠죠?

 


두 번째 세션은 OKJSP 허광남님께서 John Resig가 만든 jQuery에 대해, 모바일 웹의 대세(?)가 될 수도 있는 jQuerymobile에 대해 최근의 Trend와 맞물려 재밌게 소개해 주셨습니다.

 


BreakTime
을 갖고 세번째 세션은 JBoss User Group 김병곤님께서 웹 소켓을 처리하는 분산캐시(Extremely Scalable, High Available Data Grid Platform )라는 주제로 진행해 주셨죠

점점 커지는 데이터, 스마트폰의 출현 등으로 인해 분산캐시의 활용은 증가 될 수 밖에 없겠죠.

 


마지막 세션은 KSUG 고종봉님께서 스프링 시큐리티를 이용한 OAuth 구현이라는 주제로

OAuth 소개와 실제 데모를 진행해 주셨습니다.

 

바쁘신 주말에도 불구하고 참석 해 주신 모든 분들에게 감사 드리고, 발표를 맡아주신

오창훈님, 허광남님, 김병곤님, 고종봉님께도 다시 한번 감사 드립니다.

 




그리고 깜짝 이벤트로 목도리를 준비했는데요 모두 따뜻한 겨울 되세요~

 

Posted by 심밧드
Posted by 베니94
GXT RIA App 만들기2011. 1. 9. 21:42

1. 프로젝트 생성하기





▶ 프로젝트 명을 "RiaApp"로 하고 패키지명은 "com.gxt.riaapp"로 하고 "Finish"를 클릭하자


▶ 아래 그림과 같이 프로젝트가 생성되었다.




2. 샘플 프로그램 실행하기
- 프로젝트 생성시 자동 생성된 gwt프로그램을 실행해보자

 


▶ 브라우저를 실행하고 카피한 주소를 붙여넣어 실행해보자. 아래와 같이 정상적으로 작동하면 된다.




3. Encoding 설정 변경
- 프로젝트 생성 시 기본 세팅된 encoding을 "MS949"에서 "UTF-8"로 변경한다.
- 우측패널에서 "프로젝트명"에 마우스 우측 클릭 후 "Properties"를 클릭하고 아래 그림과 같이 "Text Encoding"을
Other를 클릭하고 "UTF-8"로 변경하자.

Posted by 베니94
GXT RIA App 만들기2011. 1. 9. 13:07

오늘 부터 Gxt를 이용해 실제 사용 가능 한 어플리케이션을 개발해보자 .
 이 어플리케이션에는 아래의 내용이 기본 들어가게 된다.

- 사용자 권한->사용자별 프로그램
- 세션 -> 특정 시간을 사용하지 않을 경우 재로그인 유도
- GXT의 모든 UI객체
- 다양한 종류의 RPC통신 방법(솔직히 몇개안됨)GXT를 이용해 이미 개발한 바 있는
 시스템의
소스를 일부 수정하여 만들어보도록 한다.


관련 기술
1. Gxt
2. iBatis
3. Database
4. Jsp
등등....

2011/01/06 - [Gxt, Gwt] - 스크린 샷
Posted by 베니94
카테고리 없음2011. 1. 6. 17:11

가끔 사번에 경우 숫자지만 앞쪽에 0으로 채워야 하는 경우가 있다.
이 때 lpad를 쓰는데 가끔 까먹어서 생각이 안나 찾곤했다. 간단한 거지만
급할때 생각안나면 곤란하니깐 정리해 놓자.


select lpad(sabun, 6, 0), sabun from OAD_RETIREMENT

이럼 좌측에 0을 붙어 총 6자리로 만들어 준다.
Posted by 베니94
카테고리 없음2011. 1. 6. 17:10

회사에서 채용사이트를 오픈하려는데 문제가 발생했다고 한다.
문제인 즉은 2대의 서버를 운영하여 부하와 장애에 어는정도 대비 했는데
이미지가 문제란다. 이 이미지란 채용등록시 자기 사진을 업로드 하게 되는데
업로드시 서버 한대만 업로드가 되고 한대는 업로드가 안되어 이미지를 못보는 경우가 발생한다고 한다. 해서 문제해결을 위해서는 업로드시 나머지 한대에도 이미지를 같이 업로드해서 동기화 시키면 되는거 아니냐구 반문했다. 그런데 개발업체에서 못한다고 했단다.
우리 파트 일이 아니라 업체에 뭐라 하구 싶어두 참았다. 암튼 이미지 서버와 이미지 사이트용 도메인을 구매해야 하는지 검토해야한다고 해서 꼭 그렇게 해야하는지 의문스러워 해결방법을 생각해봤다.
일단 각 서버마다 이미지에 대한 싱크만 맞추면 되는 문제 아닌가!!
필요한 기능을 나열해 보면
1. app 프로그램을 못 고친다고 버티고 있으니 서버에 데몬을 띄워서 해결할 수 밖에 없다.
2. 이미지 폴더를 실시간으로 감시하고 있다가 이미지가 업로드 되면 나머지 하나의 서버에 이 이미지파일을 보내줘야 한다.
3. 어느쪽에 이미지가 업로드 될지 모르니 데몬은 양쪽 서버에 모두 설치해야한다.
4. 시간이 없으니 최대한 심플하게 갈수 있는 프로그램이여야 한다.
5. 데몬은 서버에 부하를 주지 말아야한다. (몰릴 때는 작은 부하도 문제가 될터..)



해결책을 찾아보자 . 예전에 회사서버에 FTP를 통해 허가 받지 않고 업로드되는 파일을 제어할 수 있는 프로그램을 만들려구 이거저것 준비하던게 기억나서 그때 자료를 찾아보면 쓸만한게 나올까 싶었는데 꼼꼼하지 못한 성격으로 어디 있는지 알수가 없어 구글을 다시 뒤져서 아래 와 같은 걸 찾아냈다.
http://twit88.com/blog/2007/10/02/develop-a-java-file-watcher/

File Watcher라는 건데 일단 이런걸 만들 능력이 안되니 가져다 쓸 능력이라도 있어야 하지 않겠는가~!
1. 일단 이클립스로 프로젝트를 만들자
2. 받아온 소스를 풀고 에러가 없도록 약간 손을 보자
3. Main메소드가 있는 클래스를 열어 감시할 폴더를 입력할 수 있도록 수정하자.
4. 파일이 입력될때 실행되는 메소드를 찾아 FTP를 열고 전송할 서버에 전송하도록 코딩하면 끝..
5. 로컬에서 5000개의 파일을 가지고 테스트 해본 결과 괜찮은 듯...
6. 양쪽 서버에 설치하고 서로 동기화 하는지 테스트 해본 결과 잘 작동됨.
7. 해당 파트에 제공하고 이미지 서버와 이미지 도메인 구매는 pass하기로 함.
Posted by 베니94
Gxt, Gwt2011. 1. 6. 17:09

날자 형식을 표현할 경우 어떻게 되는지 알아보자.
1. 데이터베이스 테이블 필드의 type이 date이다. 이때는 시분초까지 저장되겠다.
2. rs.getDate("필드명")로 꺼내온다.
3. 꺼내온 값을 객체에 담아줄때 setter, getter메소드를 사용하는데 두개의 메소드도 아래와
 같이 date를 인자로 사용한다.
    public Date getBuy_dt() {     return (Date) get("buy_dt"); }
    public void setBuy_dt(Date buy_dt) { set("buy_dt", buy_dt); }
4. 화면에 보여줄 경우에 아래와 같은 코드가 들어간다.
ColumnConfig confirmDt    = new ColumnConfig("buy_dt", "구입일",120);
confirmDt.setDateTimeFormat(DateTimeFormat.getFormat("yyyy.MM.dd"));

이렇게 할 경우 grid나 다른 컴포넌트에서 년월일을 출력하게 된다.
그런데 년월일 뿐만 아니라 시분초까지 표현하고 싶어 setDataTimeFormat을 아래와 같이
수정하고 확인하니 시분초가 모두 00:00:00으로 찍힌다.
confirmDt.setDateTimeFormat(DateTimeFormat.getFormat("yyyy.MM.dd HH:mm:ss"));

삽질 좀 하다 나온 결론은 시분초까지 표현할 경우 서버쪽 코드인 rs.getDate("buy_dt:")
이부분을 아래와 같이 수정해주자.
// DateFormat
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// ResultSet를 객체에 저장
p.setBuy_dt(sf.parse(rs.getString("buy_dt")));

이제 아래와 같이 시분초가 표현되는 것을 확인할 수 있다.

'Gxt, Gwt' 카테고리의 다른 글

Gxt Scheduler Touch Support  (3) 2011.01.11
Ext GWT Book  (0) 2011.01.11
GXT Scheduler  (0) 2011.01.11
스크린 샷  (0) 2011.01.06
Posted by 베니94
일상2011. 1. 6. 17:07

이탈리아 ADR스튜디오에서 컨셉디자인으로 내놓은 iWatch란다.
아이폰도 없는 내가 아이폰보다 더 갖고 싶은 요놈은 아직 만들어지지도 않은
걍 컨셉이란다. Sony Ericson의 live view를 눈여겨 보다 live view가 안드로이드만
지원되다하여 아이폰쪽은 비슷한 물건이 없을까 해서 찾은 것이다.

빨랑 나왔음 좋으련만.. ^^

라이브뷰에 대한 기사는 여기

'일상' 카테고리의 다른 글

생각을 정리할 수 있는 Mind Map  (0) 2011.01.18
Posted by 베니94
Gxt, Gwt2011. 1. 6. 17:06

몇달 동안 혼자서 Gxt를 이용해 시스템을 구축해 보았다.
소감이라고 하면 결과물은 정말 최고~ 그러나 개발과정은
도움받 을 곳이 구글 밖에 없어서 참 힘들었던 것 같다.
암튼 담에 하라고 하면 더 잘할 수 있을 듯. . 그러나 개발시
수정하고 확인하고 하는 반복적인 작업에 소스가 많아지면
많아 질수록 시간이 걸리는 문제는 뭔가 해결책이 필요한듯
하다.

 


'Gxt, Gwt' 카테고리의 다른 글

Gxt Scheduler Touch Support  (3) 2011.01.11
Ext GWT Book  (0) 2011.01.11
GXT Scheduler  (0) 2011.01.11
날자 형식의 표현  (0) 2011.01.06
Posted by 베니94
Eclipse RCP2011. 1. 6. 17:05

eclipse 3.5 (Galileo) - P2 Auto Update

1. Project 생성
 1.1.  File > New > Project > Plug-in Development >  Plug-in Project

 1.2. Project Name : com.benney.crfinder.main
 1.3. Rich Client Application 여부를 "Yes"로 한다.

 1.4.  Next > Hello RCP > Next
 1.5. Add Branding에 Check > Finish
 
2. Plug-In 설정

 2.1. Project가 생성되었다. 이후 자동업데이트와 도움말에 관련된 Plug-in을
     Dependencies에 추가한다.
  • org.eclipse.equinox.p2.ui.sdk / Update 관련
  • org.eclipse.help.ui / 도움말
  • org.eclipse.help.webapp  / 도움말
3. ApplicationActionBarAdvisor 수정

4. 실행해보자.
 4.1. Run As > Eclipse Application


5.Product Configuration 생성하기
 5.1. File > New > Plug-in Development > Product Configuration:
 5.2. com.benney.crfinder.main.product 라는 이름으로 Product를 생성한다.


 5.3. OverView 내의 Product Definition > plug-in을 feature로 변경한다.

6. Feature Project 생성
 6.1. File > New > Project > Progin-in Development > Plug-in Project > Next

 6.2. Project name에 com.benney.crfinder.main.feature를 입력하고 "Next"를 클릭한다.

 6.3. 포함할 Plug-in을 선택해 준다. 여기서는 "com.benney.crfinder.main"을 체크한다. "Finish"를 클릭한다.

 6.4. Feature Project 가 생성되었다.

 6.5.  Included Features를 선택하고 Add를 클릭하여 "org.eclipse.rcp"를 추가한다.

 6.6. 기존 생성된 Product com.benney.crfinder.main.product의 Dependencies에 위에서 생성한
 Feature를 추가한다.
Posted by 베니94
Gxt , Ext Gwt강좌2011. 1. 6. 16:46
2011/01/06 - [Gxt , Ext Gwt강좌] - Ext Gwt[Gxt] 강좌06-BorderLayout을 이용한 화면프레임 구성하기

1. 우선 패키지를 하나 생성하자. com.hansol.gxtsmpl.client밑에 programs라는 패키지를 생성하자 우리는 이 패키지
     안에 새로 만들 프로그램을 추가할 것이다.

2. 패키지를 추가했다면 앞서 강좌05에서 생성한 화면의 중간에 들어갈 클래스를 생성해 보도록 하자.

3. 패키지명은 GridSmplTabItem.java로 생성하자.
     com.hansol.gxtsmpl.client.programs.GridSmplTabItem.java

4. 소스를 그대로 따라해보자. 우선 이 클래스는 TabPanel(강좌05에서 설명한 중간패널이(TabPanel이다.)에
     추가될 것이므로 TabItem을 상속 받도록 하자
public class GridSmplTabItem  extends TabItem {   
  public GridSmplTabItem() {   
    // 현재생성한 TabItem의 표기이름 지정   
    setText("Grid List");   
    // ViewPort를 탑재할 Container   
    LayoutContainer lc = new LayoutContainer();   
    // 실제 화면  UI를 탑재할 VerticalPanel    
    VerticalPanel vp = new VerticalPanel();   
    vp.setSpacing(10); // Margin   
    lc.add(vp); // LayoutContainer에 VerticalPanel을 추가한다.   
    lc.setLayout(new FlowLayout(10)); // LayoutContainer의 Layout지정   
     add(lc); // LayoutContainer를 TabItem에 추가한다.   
  }   
} 
5. GxtApp를 수정하여 위에서 생성한 클래스를 화면 중간에 삽입하고 GxtApp몯률을 실행해서 결과를 확인 해보자..
private void setTabitem() {   
  TabPanel tabPanel = new TabPanel();   
  tabPanel.setCloseContextMenu(true);   
  tabPanel.setBorderStyle(false);   
  tabPanel.setBodyBorder(false);   
  tabPanel.setTabScroll(true);   
  tabPanel.setAnimScroll(true);   
  GridSmplTabItem grid = new GridSmplTabItem(); // Grid Smpl   
  tabPanel.add(grid); // Grid Smpl을 TabPanel에 추가   
  centerPanel.add(tabPanel);   
}  
6. Grid를 추가할 패널을 생성해보자
ContentPanel downGridPanel; // Grid를 추가할 패널    
  
public void prepareService(){ //메소드를 추가하고   
  downGridPanel = new ContentPanel();   
  downGridPanel.setHeading("관리자 현황");   
  downGridPanel.setWidth(800);   
  downGridPanel.setHeight(400);   
}  
7. 생성자에 위의 메소드가 실행될 수 있도록 추가하자
public GridSmplTabItem() {   
    // 현재생성한 TabItem의 표기이름 지정   
    setText("Grid List");   
    // ViewPort를 탑재할 Container   
    LayoutContainer lc = new LayoutContainer();   
    // 실제 화면  UI를 탑재할 VerticalPanel    
    VerticalPanel vp = new VerticalPanel();   
    vp.setSpacing(10); // Margin   
    prepareService(); // 추가.   
    lc.add(vp); // LayoutContainer에 VerticalPanel을 추가한다.   
    lc.setLayout(new FlowLayout(10)); // LayoutContainer의 Layout지정   
     add(lc); // LayoutContainer를 TabItem에 추가한다.   
  }  
8. Grid를 만들기 전에 Grid에서 사용할 Entity Class를 만들도록 하자. 이 클래스는 Grid를 생성할 때 하나의 로우에 삽입되는 객체라고 생각하면 되겠다. com.hansol.gxtsmpl.client.model패키지를 추가하고 LoginUsesrInfo.java를 생성한다. 우선 아래와 같이 코딩하도록 하자
package com.hansol.gxtsmpl.client.model;   
import java.io.Serializable;   
import java.util.Date;   
import com.extjs.gxt.ui.client.data.BaseTreeModel;   
public class LoginUserInfo  extends BaseTreeModel implements Serializable {   
  public LoginUserInfo() {   
    // TODO Auto-generated constructor stub   
  }   
  public void setUserName(String userName){   set("userName", userName);   }   
  public void setUserSabun(String userSabun){   set("userSabun", userSabun);  }   
  public void setUserOrgOid(String userOrgOid){  set("userOrgOid", userOrgOid);  }   
  public void setUserOrgName(String userOrgName){  set("userOrgName", userOrgName); }   
  public void setUserTeamName(String userTeamName){ set("userTeamName", userTeamName); }   
  public void setUpdateDate(Date arg){    set("updateDate", arg);    }   
  public void setGroupId(String arg){     set("groupId", arg);    }   
  public void setInputDate(Date arg){     set("inputDate", arg);    }   
  public void setConfirmYnTmp(String arg){   set("confirmYnTmp", arg);    }   
  public void setConfirmYnName(String arg){   set("confirmYnName", arg);    }   
  public void setConfirmYn(Code arg){     set("confirmYn", arg);    }   
  
  public String getUserName(){      return (String)get("userName"); }   
  public String getUserSabun(){      return (String)get("userSabun"); }   
  public String getUserOrgOid(){      return (String)get("userOrgOid"); }   
  public String getUserOrgName(){      return (String)get("userOrgName"); }   
  public String getUserTeamOid(){      return (String)get("userTeamOid"); }   
  public String getUserTeamName(){     return (String)get("userTeamName"); }   
  public String getGroupId(){       return (String)get("groupId");  }   
  public Date getInputDate(){       return (Date)get("inputDate");  }   
  public Date getUpdateDate(){      return (Date)get("updateDate");  }   
  public String getConfirmYnTmp(){     return get("confirmYnTmp"); }   
  public String getConfirmYnName(){     return get("confirmYnName"); }   
} 
10. 이제 Grid에서 사용할 Entity객체를 생성하였으니 Grid를 통해 서버쪽 데이터를 받아올 수 있도록 Service와 Service와
연결하여 데이터를 주고 받을 수 있는 관련 객체들을 만들어보자.

11. 우선 RpcProxy가 필요하다. RpcProxy의 Rpc는 Remote Procedure Call의 약자이다. Ajax가 서버와 통신할 때
사용하는 프로토콜이라고 볼수 있다. 이 RpcProxy를 생성할 때는 서버에서 데이터를 받아올 때 사용 할 리스트객체인
(LoadResult)와 위의 8에서 정의한 Entity객체를 같이 정의해줘야한다. 소스 상단에 아래와 같이 선언하자
private RpcProxy> proxy; 
12. 다음은 Loader객체와 Store객체를를 선언한다. Loader는 Proxy와 함께 서버와 통신할수 있도 록 도와준다.
Store객체는 Loader로 부터 전달 받은 데이터를 담는 역할을 한다.
private RpcProxy> proxy;   
private BaseListLoader> loader;   
private ListStore store;
13. prepareService메소드를 수정하여 위에서 선언한 클래스를 생성하도록 하자.
public void prepareService(){   
  downGridPanel = new ContentPanel();   
  downGridPanel.setHeading("관리자 현황");   
  downGridPanel.setWidth(800);   
  downGridPanel.setHeight(400);   
  // 서버와 통신해서 가져올 데이터를 위한 객체 생성   
  proxy = new RpcProxy>() {   
  @Override  
  public void load(Object loadConfig, AsyncCallback> callback) {   
    // 나중에 구현하자    
 }   
  };   
  loader = new BaseListLoader>(proxy);   
  loader.setRemoteSort(true);   
  store = new ListStore(loader);   
  store.setMonitorChanges(true);   
}  
14.이제 Grid를 만들어보자. 우선 Grid를 만들 메소드를 하나 정의하자. 이 메소드에 Grid에 관련된 코딩을 해주자.
public void createGrid(){   
  // Column정의    
  List columns = new ArrayList();   
  columns.add(new ColumnConfig("userSabun", "사번", 75));   
  columns.add(new ColumnConfig("userName", "성명", 65));   
  columns.add(new ColumnConfig("userOrgName", "회사명", 150));   
  ColumnConfig userOrgOid = new ColumnConfig("userOrgOid", "회사코드", 120);   
  userOrgOid.setHidden(true);   
  columns.add(userOrgOid);   
  columns.add(new ColumnConfig("userTeamName", "팀명", 80));   
  ColumnConfig inputDate = new ColumnConfig("inputDate", "입력일", 70);   
  inputDate.setDateTimeFormat(DateTimeFormat.getFormat("yyyy.MM.dd"));   
  columns.add(inputDate);   
     
  ColumnConfig updateDate = new ColumnConfig("updateDate", "수정일", 70);   
  updateDate.setDateTimeFormat(DateTimeFormat.getFormat("yyyy.MM.dd"));   
  columns.add(updateDate);   
    
  ColumnConfig confirmYn = new ColumnConfig("confirmYnName", "승인여부", 70);   
  confirmYn.setHidden(true);   
  columns.add(confirmYn);   
  // 정의된 컬럼을 이용해 컬럼모델을 생성한다.    
  ColumnModel cm = new ColumnModel(columns);   
  // Store객체와 컬럼모델을 통해 Grid를 생성한다.   
  Grid grid = new Grid(store, cm);   
  grid.setStateId("-");   
  grid.setStateful(true);   
  // Grid가 보여질때 이벤트 처리   
  grid.addListener(Events.Attach, new Listener>() {   
    public void handleEvent(GridEvent be) {   
 // Grid가 Attach될 때Loader를 통해 서버에서 데이터를 가져오도록 명령한다.    
     loader.load();   
    }   
  });   
  // 보여질 Grid의 로우를 하나를 선택할 것인지 복수개를 선택할 것인지 설정.   
  grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);   
  grid.setLoadMask(true);   
  grid.setBorders(true);   
  // 컬럼좌우폭에 대해 가변적으로 늘어나고 줄어들고 할 컬럼을 정해준다. 필수 사항암.   
  grid.setAutoExpandColumn("userTeamName");   
  grid.setStateful(false);   
  grid.setHeight(400); // Grid의 높이를 지정해준다.   
  // ContentPanel에 그리드를 추가한다.   
  downGridPanel.add(grid);   
}  
15. 생성자 GridSmplTabItem()에 위의 메소드가 실행될 수 있도록 수정하고 실행해보도록 하자.
public GridSmplTabItem() {   
  setText("Grid List");   
  LayoutContainer lc = new LayoutContainer();   
  VerticalPanel vp = new VerticalPanel();   
  vp.setSpacing(10);   
    
  prepareService();   
  // Grid관련 정의 메소드   
  createGrid();   
  vp.add(downGridPanel);   
    
  lc.add(vp);   
  lc.setLayout(new FlowLayout(10));   
  add(lc);   
}  
16. 이하 실행된 화면을 보자 아직 서버에서 데이터를 가져오지 않고 있다. 해서 Grid에 컬럼만 보이고 내역은 보이지 않고 있다.

17.  이제 데이터를 가져올수 있도록 코드를 변경해 보자.  일단 서버와 데이터를 주고 받으려면 Service가 있어야 한다.
      Service는 화면에서 보여지는 UI가 데이터를 표현하기 위해 서버와 통신하는 수단이라고 할 수 있다. Service를 하나
      생성 해 보자.  Service생성 시에는 모듈의 Client 패키지를 선택하고 생성해야 한다.
      아래의 그림과 같이 GWT remote service를 클릭 한다.
 

 18.  ServiceName을 지정할 때는 보통 모듈명+Service로 사용하거나 다른 이름으로 하더라도
        XXXService처럼 뒤에 Service를 붙여주자.
        아래 그림은 이미 Service를 GxtSmplService로 생성한 상태라 "~already exists"
        이미 존재한다는 메시지가 나오므로 참고하시고...


19. 생성된 Service를 확인해 보자.  우리는 GxtSmplService라는 이름으로 Remote Service라는 이름으로 Service를
     생성하였다. 이 Service는 com.hansol.gxtsmpl패키지내에서  com.hansol.gxtsmpl.client아래 GxtSmplService.java,
     GxtSmplServiceAsync.java가 생성되었다.
     이 2개의 클래스는 Interface로 이 Interface의 구현은 com.hansol.gxtsmpl.server아래의  GxtSmplServiceImpl.java에
     구현해야 한다. 즉 client에 Service를 생성하고 Service에 메소드를 정의하면 Server쪽 XXXImpl.java클래스에
     구현하도록 해야한다.


20. 이제 Service롤 생성하므로서 2개의 클래스가 생성되어 총 3개의 Service관련 Class가 생성된 것을 확인했다.
     Service가 생성됨과 동시에 변경되는 것이 하나 있다. 바로 web.xml파일이다. 이 파일은 프로젝트 Root밑에 war폴더내
      의 WEB-INF아래에  존재한다.  내용을 확인 해보도록 하자.
  
  
    
    GxtSmplService  
    com.hansol.gxtsmpl.server.GxtSmplServiceImpl  
    
    
    GxtSmplService  
      /com.hansol.gxtsmpl.GxtSmpl/GxtSmplService  
      
  
21.위의 web.xml파일을 잘 살펴보면 servlet과 servlet-mapping이 추가된 것을 볼수 있는데 우리가 생성한 service가
    Servlet기반이라는 것을 알수 있다. 우선 servlet을 보면 우리가 생성한 service이름으로 servlet-name이 지정되어 있고
    sevlet-class가 명시되어 있다. 이것은 서비스가 이름이 무엇이고 클래스는 어떤 것인지 명시한 것이다. 그럼 그 아래
    servlet-mapping을 보자 이 servlet-mapping은 위에서 정의된 서블릿을 어떤모듈에서 사용할 수 있는지 명시하였다.
    GxtSmplService서비스를 com.hansol.gxtsmpl.GxtSmpl모듈에서 사용한다는 뜻이다. 그런데 우리는 GxtSmpl모듈은
    프로그램만 제공할 것이므로 GxtApp에서 GxtSmplService를 사용해야만 하는 상황이다. 그러므로 web.xml파일을 약간 
   수정하도록 하자. 수정은 servlet-mapping을 GxtApp모듈에서 사용할 수 있도록 servlet-mapping을 하나더 추가하도록
   하자.
  
  
    
    GxtSmplService  
    com.hansol.gxtsmpl.server.GxtSmplServiceImpl  
    
    
    GxtSmplService  
      /com.hansol.gxtsmpl.GxtSmpl/GxtSmplService  
      
    
    
    GxtSmplService  
      /gxtapp/GxtSmplService  
      
  
22. 수정 된 web.xml파일을 보면 "/gxtapp/GxtSmplService"라는 부분을 주목하자. 이렇게 쓴 이유는 GxtSmpl모듈에
     생성한 Service를 war밑에 있는 gxtapp모듈에서 사용하겠다는 의미로 해석하면 된다. 서블릿을 사용 해본 사람 에게는
     익숙한 Syntax라고 생각된다. 다음 강좌에서는 ClientUi에서 Server쪽 클래스에게 요청을 보내고 서버쪽 에서 요청에
     대한 응답을 어떻게 전달하는지 알아보자

2011/01/11 - [Gxt , Ext Gwt강좌] - Ext Gwt[Gxt] 강좌08-Client클래스와 서버클래스간 데이터를 주고 받자.
Posted by 베니94