앱 엔진에서 많이 사용하는 기능 혹은 API 들입니다.




    1. 주요 기능 및 서비스

      1. 데이타 저장

        1. 소개

    • 앱 엔진에서 데이터를 저장하는 방법을 3가지를 지원한다.

    • DataStore, JDO, JPA

    • 구글 튜토리얼에서는 JPA의 보다 JDO와 DataStore의 비중이 매우 크게 되어있다.



      1. DataStore

        1. 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);



      1. 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”))



      1. 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();

}




      1. JDO

        1. 소개

    • JDO는 Java ORM 기술중의 하나로 RDBMS, 파일엑셀Bigtable, Hbase, LDAP 등을 대상 저장소로 사용한다.

    • Java Data Objects 로 데이터 저장 객체 표준이다.

    • Class 내에 Annotation 통하여 저장할 데이터베이스와 컬럼을 지정한다.

    • PersistenceManger를 통하여 데이터를 저장한다.

      1. ORM(Object-Relational Mapping)

    • ORM은 Object-Oriented Programming Language 에서 호환되지 않은 두 시스템 간의 데이터 변환을 위한 프로그래밍 기술이다.

    • Google App engine 에서는 Bigtable 을 채택하여 사용하고 있다.

    • Bigtable은 Google File System에 내장된 구글의 데이터베이스 시스템으로 간결할고 높은 성능을 보인다.

    • Bigtable은 현재 구글 리더구글맵구글어스구글메일유투브 등 사용중이다.


      1. 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;


}



      1. JPA

    • Java Persistence API 는 Java 플랫폼을 사용하는 어플리케이션의 관계형 데이터를 관리하기 위한 Java 프로그래밍 언어 프레임워크 이다.

    • Java ORM 기술중 하나로 RDBMS를 대상 저장소로 한다.

    • 관계형 데이터베이스에 데이터를 포함하는 객체를 저장하기 위한 표준 인터페이스이다.

    • 구글 튜토리얼에 JPA에 관하여 깊이 있게 다루지 않으며 상용방법도 JDO 비슷하여 개요만 소개하고 있다.

      1. 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();

}

}




    1. 서비스/기능

      1. 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.)

      1. 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());




      1. 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_PRESENTtrue);


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




      1. 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);

}



      1. 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);



      1. 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");

}

}


출처 : http://visu4l.tistory.com/374

+ Recent posts