Google App Engine(GAE)을 정리 한다.
com.google.apphosting.api.ApiProxy$FeatureNotEnabledException:
The Blobstore API will be enabled for this application once billing has been enabled in the admin console.
2008년 4월 GAE의 개발 환경을 Python 개발자에게도 공개, 현재 Python 2.5 지원
package com.jopenbusiness.gae.sample;
import java.util.HashMap;
import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheFactory;
import javax.cache.CacheManager;
public class Memcache {
private static Cache cache = null;
@SuppressWarnings("unchecked")
public Memcache() {
CacheFactory factory = null;
try {
factory = CacheManager.getInstance().getCacheFactory();
cache = factory.createCache(new HashMap());
cache.put("name", "value");
cache.get("name");
} catch (CacheException e) {
e.printStackTrace();
}
}
}
com.google.apphosting.api.ApiProxy$FeatureNotEnabledException:
The Blobstore API will be enabled for this application once billing has been enabled in the admin console.
GAE for Java는 데이터 관리를 위해 JDO(Java Data Objects)와 JPA(Java Persistence API)를 지원한다. User 데이터 관리를 예제로 하여 이를 확인해 보자.
User.java
package com.jopenbusiness.gae.client;
import java.io.Serializable;
import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey;
'''@PersistenceCapable(identityType = IdentityType.APPLICATION)''' public class User implements Serializable { private static final long serialVersionUID = 3438684493254005858L;
'''@PrimaryKey''' '''@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)''' private long id = 0l; '''@Persistent''' private String name = null; '''@Persistent''' private String username = null; '''@Persistent''' private String password = null; '''@Persistent''' private String email = null;
public long getId() {
return id;
} public void setId(long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} } ```
UserDAO.java
package com.jopenbusiness.gae.server;
import java.util.ArrayList;
import com.jopenbusiness.gae.client.User;
public interface UserDAO {
void insertUser(User user);
void updateUser(User user);
void deleteUser(User user);
ArrayList selectUsers();
}
UserDAOJdo.java
package com.jopenbusiness.gae.server;
import java.util.ArrayList;
import javax.jdo.PersistenceManager;
import com.jopenbusiness.gae.client.User; import com.jopenbusiness.gae.server.PMF;
public class UserDAOJdo implements UserDAO { @Override public void insertUser(User user) {
PersistenceManager pm = null;
try {
pm = PMF.getPersistenceManager();
pm.makePersistent(user);
} finally {
pm.close();
}
}
@Override public void updateUser(User user) {
PersistenceManager pm = null;
User tmpUser = null;
try {
pm = PMF.getPersistenceManager();
pm.currentTransaction().begin();
tmpUser = pm.getObjectById(User.class, user.getId());
tmpUser.setName(user.getName());
tmpUser.setUsername(user.getUsername());
tmpUser.setPassword(user.getPassword());
tmpUser.setEmail(user.getEmail());
pm.makePersistent(tmpUser);
pm.currentTransaction().commit();
} catch (Exception ex) {
pm.currentTransaction().rollback();
throw new RuntimeException(ex);
} finally {
pm.close();
}
}
@Override public void deleteUser(User user) {
PersistenceManager pm = null;
try {
pm = PMF.getPersistenceManager();
pm.currentTransaction().begin();
user = pm.getObjectById(User.class, user.getId());
pm.deletePersistent(user);
pm.currentTransaction().commit();
} catch (Exception ex) {
pm.currentTransaction().rollback();
throw new RuntimeException(ex);
} finally {
pm.close();
}
}
@Override
@SuppressWarnings("unchecked")
public ArrayList
PersistenceManager pm = null;
String query = null;
pm = PMF.getPersistenceManager();
query = "select from " + User.class.getName();
return (ArrayList) pm.newQuery(query).execute();
} } ```
PMF.java
package com.jopenbusiness.gae.server;
import javax.jdo.JDOHelper; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory;
public class PMF { private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PMF() { }
public static PersistenceManagerFactory get() {
return pmfInstance;
}
public static PersistenceManager getPersistenceManager() {
return pmfInstance.getPersistenceManager();
} } ```
/src/META-INF/jdoconfig.xml
persistence-manager-factory를 정의 한다.
import java.util.logging.Level;
import java.util.logging.Logger;
private final static Logger log = Logger.getLogger(Memcache.class.getName());
log.log(Level.WARNING, "Start Memcache");
사용자가 접속할 때 보여줄 첫 화면
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" language="java"%>
<%@ page import="com.google.appengine.api.users.User" %>
<%@ page import="com.google.appengine.api.users.UserService" %>
<%@ page import="com.google.appengine.api.users.UserServiceFactory" %>
<%
UserService userService = null;
User user = null;
String domain = "jopenbusiness.co.kr";
String service = "http://www.jopenbusiness.co.kr/";
userService = UserServiceFactory.getUserService(); if (!userService.isUserLoggedIn()) {
out.print("");
return;
}user = userService.getCurrentUser();
//user = (User) request.getAttribute("user");
if ((user == null) || (!user.getAuthDomain().equals(domain))) {
out.print("<script type="text/javascript">");
out.print("window.document.location.href = "" + userService.createLoginURL(request.getRequestURI()) + "";");
out.print("");
return;
}
out.print("<script type="text/javascript">");
out.print("window.document.location.href = "" + service + "";");
out.print("");
%>
```
로그인된 사용자의 정보를 반환하는 화면
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" language="java"%>
<%@ page import="com.google.appengine.api.users.User" %>
<%@ page import="com.google.appengine.api.users.UserService" %>
<%@ page import="com.google.appengine.api.users.UserServiceFactory" %>
<%
UserService userService = null;
User user = null;
String domain = "jopenbusiness.co.kr";
String service = "http://www.jopenbusiness.co.kr/";
String loginURL = "http://www.jopenbusiness.co.kr/index.jsp";
userService = UserServiceFactory.getUserService(); if (!userService.isUserLoggedIn()) { out.print("{"); out.print("errorCode:"-1","); out.print("errorMessage:"Error: not login.""); out.print("}"); return; }
user = userService.getCurrentUser(); //user = (User) request.getAttribute("user"); if ((user == null) || (!user.getAuthDomain().equals(domain))) { out.print("{"); out.print("errorCode:"-2","); out.print("errorMessage:"Error: authDomain not match.""); out.print("}"); return; }
out.print("{"); out.print("errorCode:"0","); out.print("errorMessage:"OK","); out.print("authDomain:"" + user.getAuthDomain() + "","); out.print("email:"" + user.getEmail() + "","); out.print("userId:"" + user.getUserId() + "","); out.print("nickname:"" + user.getNickname() + "","); out.print("loginURL:"" + userService.createLoginURL(loginURL) + "","); out.print("logoutURL:"" + userService.createLogoutURL(loginURL) + """); out.print("}"); %>
GWT는 Java를 JavaScript로 컴파일 하여 브라우저에서 실행(AJAX Application)할 수 있도록 하는 도구로 성능적인 부분에서 최적화되어 있다.