-
[Google App Engine] 주요 기능 및 서비스case Computer : 2011. 4. 8. 10:55
요즘 조금 씩 정리한걸 또 올립니다..
이제 벌써 봄이네요!
개나리도 피었고 이름모르는 꽃들도 피었고..
이제 내 인생만 피면 되는건가?? ;;
아무튼;;
앱 엔진에서 많이 사용하는 기능 혹은 API 들입니다.
주요 기능 및 서비스
데이타 저장
소개
앱 엔진에서 데이터를 저장하는 방법을 3가지를 지원한다.
DataStore, JDO, JPA
구글 튜토리얼에서는 JPA의 보다 JDO와 DataStore의 비중이 매우 크게 되어있다.
DataStore
Entities
특수한 자료형으로 하나의 Key와 하나 이상의 property (속성)를 가진다.
같은 Key를 가진 Entity가 종복으로 사용되면 마지막으로 저장된 Key의 값이 저장된다.
자료형으로 boolean, String, Date, email, User, number (integer, float)
-
DatastoreService dataStore = DatastoreSeriviceFactory.getDataStore();
Entity person1 = new Entity(“Person”, “tom”);
person1.setProperty(“height”, 170);
person1.setProperty(“age”, “25”);
dataStore.put(person1);
Entity person2 = new Entity(“Person”, “chung”);
person2.setProperty(“height”, 165);
person2.setProperty(“age”, “20”);
dataStore.put(person2);
Queries
저장된 정보를 불러오기 위한 클래스
addFilter 는 sql 에서 where 와 비슷한 의미로 속성값의 대한 비교한다.
AddSort 는 SQL에서 order by 와 같은 의미로 결과 값을 특정 속성값을 기준으로 정열하여 준다.
-
DatastoreService dataStore = DatastoreSeriviceFactory.getDataStore();
Query query = new Query(“Person”);
query.addFilter(“height”, Query.filterOperator.GREATER_THAN_OR_EQUAL, 160);
query.addSort(“height”, SortDirection.DESCENDING);
PreparedQuery pq = dataStore.prepare(query);
for(Entity result : pq.asIterable())
System.out.println(result.getProperty(“age”))
Transactions
Transaction Processing은 분할할 수 없는 연산, 개별로 나뉜 정보를 처리한다. 이것을 Transactions 이라 부른다. 각각의 Transaction은 완전한 단위로 성공 혹은 실패 한다.그리고 이 단위 수행 중간에 끼어들수 없다.
일련의 작업을 완수하기 위해 하나의 기본 단위를 Transactions이라한다. 이 기본 단위가 수행중인 중간의 데이터베이스를 쓰는 작업이 있더라도 기본 단위가 완수(성공/실패)된 후에 다른 작업을 할수 있다.
Transaction 이 성립하기 위해서는 ACID(Atomicity, Consistency, Isolation, Durability) 의 4가지 사항을 모두 만족해야 한다.
-
DatastoreService dataStore = DatastoreSeriviceFactory.getDataStore();
Transaction txn = dataStore.beginTransaction();
try{
Key personKey = KeyFactory.createKey(“Person”, “tom”);
Entity person = dataStore.get(personKey);
person.setProperty(“hight”, 155);
dataStore.put(person);
txn.commit();
}finally{
if(txn.isActive())
txn.rollback();
}
JDO
소개
JDO는 Java ORM 기술중의 하나로 RDBMS, 파일, 엑셀, Bigtable, Hbase, LDAP 등을 대상 저장소로 사용한다.
Java Data Objects 로 데이터 저장 객체 표준이다.
Class 내에 Annotation 통하여 저장할 데이터베이스와 컬럼을 지정한다.
PersistenceManger를 통하여 데이터를 저장한다.
ORM(Object-Relational Mapping)
ORM은 Object-Oriented Programming Language 에서 호환되지 않은 두 시스템 간의 데이터 변환을 위한 프로그래밍 기술이다.
Google App engine 에서는 Bigtable 을 채택하여 사용하고 있다.
Bigtable은 Google File System에 내장된 구글의 데이터베이스 시스템으로 간결할고 높은 성능을 보인다.
Bigtable은 현재 구글 리더, 구글맵, 구글어스, 구글메일, 유투브 등 사용중이다.
Annotation
Annotation은 주로 데이터를 문서화하거나, 컴파일 타밍이나 런타임시에 원하는 동작을 수행할 수 있도록 하는데 사용된다.
DataStore에서는 데이터가 저장될 데이터베이스의 이름과 필드값을 설정할때 사용된다.
@persistenceCapable
DB Name의 해당된다.
@PrimaryKey
DB에서 PrimaryKey와 같은 역할을 한다.
동일안 Key가 중복될수 없다.
@persistent
데이터베이스 컬럼 정보에 대상이다.
-
…
@PersistenceCapable
Public class Data{
@PrimaryKey
@persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
Key key;
@persistent
private String title
@persistent
private String content;
@persistent
private Date date;
…
}
JPA
Java Persistence API 는 Java 플랫폼을 사용하는 어플리케이션의 관계형 데이터를 관리하기 위한 Java 프로그래밍 언어 프레임워크 이다.
Java ORM 기술중 하나로 RDBMS를 대상 저장소로 한다.
관계형 데이터베이스에 데이터를 포함하는 객체를 저장하기 위한 표준 인터페이스이다.
구글 튜토리얼에 JPA에 관하여 깊이 있게 다루지 않으며 상용방법도 JDO 비슷하여 개요만 소개하고 있다.
PersistenceManager
해당 application 의 DB 관리를 관리할수 있다.
쿼리 스트링 규칙
select from db_name : * 문자를 넣지 않는다.
== : “=” 대신 “==” 을 상용한다.
GQL에서 사용한 내부함수를 사용할수 없다.(ex:DATE())
public class PMF {
private static final PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("transactions-optional");
public PMF(){}
public static PersistenceManagerFactory getPMF(){
return pmf;
}
}
public class SimpleServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
PersistenceManager pm = PMF.getPMF().getPersistenceManager();
Data data1 = new Data("chung", "ipad", new Date());
pm.makePersistent(data1);
String query = "select from " + Data.class.getName();
List<Data> result= (List<Data>) pm.newQuery(query).execute();
resp.getWriter().println("result : " + result.get(0).getContent());
pm.close();
}
}
서비스/기능
Blobstore
큰 용량은 data를 저장하기위한 데이타 객체로 HTTP Request를 통해 데이타를 업로드 한다.(최대 2GB)
최대 2 GB까지 저장 가능하며, 최소 1MB 이상이 되야 읽어 드릴수 있다.
이미지, 비디오, 음악 파일등 크기가 데이타를 주로 저장할 때 사용한다.
Blobstore는 과금을 할 경우에만 사용가능
(과금없이 test한 경우에 다음과 같은 에러 메시지를 띄운다
- The Blobstore API will be enabled for this application once billing has been enabled in the admin console.)
Capabilities
어플리케이션이 동작중인 서버의 상태를 체크하는 API
확인 사능한 기능
Blobstore, Datastore, Image, Mail, Memcashe, URL Fetch, XMPP, Task Queue
CapabilitiesService cs = CapabilitiesServiceFactory.getCapabilitiesService();
CapabilityStatus status = cs.getStatus(Capability.DATASTORE).getStatus();
resp.getWriter().println("Datastore"+status.toString());
Memcache
일반적으로 동적 데이타베이스 기반 웹사이트의 속도를 높이기 위하여 사용된다.
사용하려는 data가 이미 캐싱 되어 있는지 확인후 되어 있다면 바로 Data를 사용한다.
캐싱되어 있지 않다면 필요한 데이터를 데이터베이스에서 가져와 RAM에 객체의 맴핑시키고 캐시의 추가 한다.
DataStore는 매번 요청이 있을때 마다 DB에서 읽어오는 반면에 MemCache는 필요한 정보를 메모리 캐시로 읽어 들인후에 메모리 캐시로 부터 데이터를 읽어온다.
오래걸리는 데이터베이스로의 직접적인 쿼리가 줄어들기때문에 상대적으로 Memcache의 처리 속도가 훨씬 빠르다. 그렇지만 메모리 상에 data가 존재 하기 때문에 휘발되는 경우를 생각해야된다.
Cache cache = null;
Map props = new HashMap();
props.put(GCacheFactory.EXPIRATION_DELTA, 3600);
props.put(MemcacheService.SetPolicy.ADD_ONLY_IF_NOT_PRESENT, true);
try{
CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
cache = cacheFactory.createCache(props);
}catch(CacheException e){
e.printStackTrace();
}
CacheStatistics stats = cache.getCacheStatistics();
String key = "keyName";
String value = "vauleString";
cache.put(key, value);
resp.getWriter().println("vaule = "+cache.get(key) +"<br>");
int hits= stats.getCacheHits();
int misses = stats.getCacheMisses();
resp.getWriter().println("hits : " + hits);
resp.getWriter().println("miss : " + misses);
URL Fetch
다른 호스트와 통신을 할 수 있는 서비스이다.
통신 방법은 HTTP/HTTPS 두가지 이다.
앱엔진의 특성중 하나도 특정 소켓을 열어 통신하는 방법을 차단했기 때문에 다른 호스트와 통신할 때에는 URL Fetch 를 사용해야한다
URL url = new URL("http://visu4l.tistory.com/rss/xml");
BufferedReader buf = new BufferedReader(new InputStreamReader(url.openStream()));
String reader = null;
while((reader = buf.readLine()) != null){
resp.getWriter().println(reader);
}
Users
Google 계정 정보 가져와 사용할수 있는 서비스이다.
사용자 ID/ 메일 주소/닉네임 등의 정보를 가져와 사용가능 하다.
사용자의 로그인 유무, 구글의 로그인/로그아웃 서비스를 사용할 수 있다.
UserService userService = UserServiceFactory.getUserService();
if( userService.isUserLoggedIn())
User user = userService.getCurrentUser();
else
return ;
if(user == null)
resp.sendRedirect(userService.createLoginURL(GWT.getModuleBaseURL());)else
resp.getWriter().println(“Hello, “ + user.getUserId);
XMPP
XMPP 메시지를 보내거나 받을수 있는 서비스이다.
XMPP는 XML을 기반의 표준 communications protocol이다.
현재 Google Talk으로만 서비스되고 있다.
단문 메시지 보내기
메시지를 보내기 위해서는 Google Talk에 해당 어플리케이션이 등록 되어있어야 한다.
application_name@appspot.com 형태로 계정을 등록한다.
단, 로컬에서 테스트하는 경우는 전송될수 없다. 반드시 delpoy한후에 사용해야한다.
public class XMPPServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException {
XMPPService xmppService = XMPPServiceFactory.getXMPPService();
JID id = new JID("chkim@otuls.com");
if(xmppService.getPresence(id).isAvailable()){
xmppService.sendMessage(new MessageBuilder()
.withRecipientJids(id)
.withBody("hello xmpp test")
.build());
}else{
res.getWriter().println("not available");
}
}
반응형'case Computer :' 카테고리의 다른 글
Google Code Jam 2011 개최 (1) 2011.04.15 [Google App Engine] Google Web Toolkit (0) 2011.04.13 Google App Engine 을 아시나요? (1) 2011.03.29 VMware에서 Port forwarding 방법 (0) 2011.01.10 ubuntu에 APM (0) 2011.01.10