티스토리 뷰
Programming Tips/JAVA
[GWT / GAE] Google Web Toolkit 와 Google App Engine 연동하기, RPC 호출하기
Unikys 2012. 3. 13. 11:14이번에는 GWT와 GAE를 연동시키면서 RPC로 구글 서버에 있는 함수에 접근하는 방법을 알아보자.
1. GWT와 GAE를 연동시켜놓기
[GWT / GAE] Google Web Toolkit 와 Google App Engine 연동하기, 구글 서버에 올리기
2. 주고받을 유저 클래스를 만든다.
* Serializable을 상속받아야한다.
public class WGLM_User implements java.io.Serializable{
/**
*
*/
private static final long serialVersionUID = -2003200417167457992L;
public static final ProvidesKey<WGLM_User> KEY_PROVIDER = new ProvidesKey<WGLM_User>() {
@Override
public Object getKey(WGLM_User user) {
// Always do a null check.
return (user == null) ? null : user.getId();
}
};
private List<WGLM_ShoppingList> shoppingLists;
private static int nextId = 0;
private int id;
private String name;
public static int getNextId() {
return nextId;
}
public static void setNextId(int nextId) {
WGLM_User.nextId = nextId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public WGLM_User()
{
}
public WGLM_User(String name) {
this.name = name;
nextId++;
this.id = nextId;
}
public void addShoppingList(WGLM_ShoppingList shoppingList)
{
this.shoppingLists.add(shoppingList);
}
public List<WGLM_ShoppingList> getShoppingLists() {
return shoppingLists;
}
public void setShoppingLists(List<WGLM_ShoppingList> shoppingLists) {
this.shoppingLists = shoppingLists;
}
}
/**
*
*/
private static final long serialVersionUID = -2003200417167457992L;
public static final ProvidesKey<WGLM_User> KEY_PROVIDER = new ProvidesKey<WGLM_User>() {
@Override
public Object getKey(WGLM_User user) {
// Always do a null check.
return (user == null) ? null : user.getId();
}
};
private List<WGLM_ShoppingList> shoppingLists;
private static int nextId = 0;
private int id;
private String name;
public static int getNextId() {
return nextId;
}
public static void setNextId(int nextId) {
WGLM_User.nextId = nextId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public WGLM_User()
{
}
public WGLM_User(String name) {
this.name = name;
nextId++;
this.id = nextId;
}
public void addShoppingList(WGLM_ShoppingList shoppingList)
{
this.shoppingLists.add(shoppingList);
}
public List<WGLM_ShoppingList> getShoppingLists() {
return shoppingLists;
}
public void setShoppingLists(List<WGLM_ShoppingList> shoppingLists) {
this.shoppingLists = shoppingLists;
}
}
3. RPC에서 사용할 UserService 인터페이스를 만든다.
* WGLM_User를 Serializable로 해야 RPC에서 리턴으로 사용할 수 있다.
* RemoteServiceRelativePath("web.xml에서 설정한 경로"); 를 해줘야한다.
@RemoteServiceRelativePath("user")
public interface UserService extends RemoteService {
WGLM_User getUser(int key);
String saveUser(WGLM_User user);
String editUser(WGLM_User user);
WGLM_User deleteUser(int key);
List<WGLM_User> getUserList(int key);
}
public interface UserService extends RemoteService {
WGLM_User getUser(int key);
String saveUser(WGLM_User user);
String editUser(WGLM_User user);
WGLM_User deleteUser(int key);
List<WGLM_User> getUserList(int key);
}
4. UserServiceAsync 인터페이스를 만든다.
* UserService 클래스 + AsyncCallback<리턴형> 을 함수로 똑같이 만들어줘야한다. 이클립스에서는 google plugin을 깔았으면 자동으로 에러로 잡아준다.
public interface UserServiceAsync {
void getUser(int key, AsyncCallback<WGLM_User> callback)
throws IllegalArgumentException;
void getUserList(int key, AsyncCallback<List<WGLM_User>> callback)
throws IllegalArgumentException;
void saveUser(WGLM_User user, AsyncCallback<String> callback)
throws IllegalArgumentException;
void editUser(WGLM_User user, AsyncCallback<String> callback)
throws IllegalArgumentException;
void deleteUser(int key, AsyncCallback<WGLM_User> callback)
throws IllegalArgumentException;
}
void getUser(int key, AsyncCallback<WGLM_User> callback)
throws IllegalArgumentException;
void getUserList(int key, AsyncCallback<List<WGLM_User>> callback)
throws IllegalArgumentException;
void saveUser(WGLM_User user, AsyncCallback<String> callback)
throws IllegalArgumentException;
void editUser(WGLM_User user, AsyncCallback<String> callback)
throws IllegalArgumentException;
void deleteUser(int key, AsyncCallback<WGLM_User> callback)
throws IllegalArgumentException;
}
5. UserServiceImpl 클래스를 만든다.
* UserService 인터페이스를 구현해야한다.
(아래 내용은 아직 미구현)
public class UserServiceImpl extends RemoteServiceServlet implements UserService {
@Override
public WGLM_User getUser(int key) {
// TODO Auto-generated method stub
return null;
}
@Override
public String saveUser(WGLM_User user) {
// TODO Auto-generated method stub
return null;
}
@Override
public String editUser(WGLM_User user) {
// TODO Auto-generated method stub
return null;
}
@Override
public WGLM_User deleteUser(int key) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<WGLM_User> getUserList(int key) {
// TODO Auto-generated method stub
return null;
}
}
@Override
public WGLM_User getUser(int key) {
// TODO Auto-generated method stub
return null;
}
@Override
public String saveUser(WGLM_User user) {
// TODO Auto-generated method stub
return null;
}
@Override
public String editUser(WGLM_User user) {
// TODO Auto-generated method stub
return null;
}
@Override
public WGLM_User deleteUser(int key) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<WGLM_User> getUserList(int key) {
// TODO Auto-generated method stub
return null;
}
}
6. 다음과 같은 포맷으로 web.xml에 서블릿을 등록한다.
<servlet>
<servlet-name>서블릿명(같아야함)</servlet-name>
<servlet-class>사용하는패키지.UserServiceImpl</servlet-class> </servlet>
<servlet-mapping>
<servlet-name>서블릿명(같아야함)</servlet-name>
<url-pattern>/사용할매핑</url-pattern>
</servlet-mapping>
* 아래와 같이 설정하였다.
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>app.team10.wglm.server.UserServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/team10wglm/user</url-pattern>
</servlet-mapping>
<servlet-name>userServlet</servlet-name>
<servlet-class>app.team10.wglm.server.UserServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/team10wglm/user</url-pattern>
</servlet-mapping>
7. RPC 인터페이스를 만든다.
- RPC를 사용할 클래스 안에다가 선언하고 생성하자.
private final UserServiceAsync userService = GWT.create(UserService.class);
8. 생성한 RPC 인터페이스를 이용해서 서버 소스를 호출한다.
* 호출에 성공했을때 함수(onSuccess)와 실패했을때의 함수(onFailure)를 구현하면 된다.
userService.getUserList(-1, new AsyncCallback<List<WGLM_User>>(){
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(List<WGLM_User> result) {
// TODO Auto-generated method stub
}
});
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(List<WGLM_User> result) {
// TODO Auto-generated method stub
}
});
RPC 호출하기 끝.
각 클래스의 용도를 설명하자면,
UserServiceAsync : 클라이언트에서 사용하는 RPC 인터페이스, 서버측 함수를 호출하고 Callback 함수로 응답을 받는다.
UserService : 서버측 RPC 인터페이스. UserServiceAsync는 이 클래스를 바탕으로 생성된다.
UserServiceImpl : 서버측 RPC 실질적인 클래스. 이 클래스의 소스는 서버쪽에서 실행이 된다.
다음에는 서버측에서 JDO를 이용해서 Datastore에 저장하는 방법을 알아보자.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- TIP
- 샷
- 뽐뿌
- google app engine
- php
- gre
- HTML5
- 탐론 17-50
- 강좌
- c++
- mini project
- 안드로이드 앱 개발 기초
- Javascript
- ny-school
- 자바스크립트
- Python
- HTML5 튜토리얼
- Writing
- lecture
- gae
- 안드로이드
- java
- 팁
- 삼식이
- Android
- GX-10
- 속깊은 자바스크립트 강좌
- K100D
- 사진
- 서울
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함