ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Google App Engine] 주요 기능 및 서비스
    case Computer : 2011. 4. 8. 10:55

    요즘 조금 씩 정리한걸 또 올립니다..

    이제 벌써 봄이네요!
    개나리도 피었고 이름모르는 꽃들도 피었고..
    이제 내 인생만 피면 되는건가?? ;;


    아무튼;; 

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



      1. 주요 기능 및 서비스

        1. 데이타 저장

          1. 소개

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

          • DataStore, JDO, JPA

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



          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. 소개

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

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

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

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

            1. ORM(Object-Relational Mapping)

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

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

            • BigtableGoogle 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_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);




          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 메시지를 보내거나 받을수 있는 서비스이다.

          • XMPPXML을 기반의 표준 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

    댓글

Designed by Tistory.