티스토리 뷰


이번에는 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;
    }
}


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);
}


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;
}


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;
    }
}


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>


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
               
            }
           
        });


RPC 호출하기 끝.

각 클래스의 용도를 설명하자면,

UserServiceAsync : 클라이언트에서 사용하는 RPC 인터페이스, 서버측 함수를 호출하고 Callback 함수로 응답을 받는다.
UserService : 서버측 RPC 인터페이스. UserServiceAsync는 이 클래스를 바탕으로 생성된다.
UserServiceImpl : 서버측 RPC 실질적인 클래스. 이 클래스의 소스는 서버쪽에서 실행이 된다.

다음에는 서버측에서 JDO를 이용해서 Datastore에 저장하는 방법을 알아보자.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함