RSS

Google App Engine 사용 후기

13 4월

gae icon

구글 앱엔진으로 프로젝트 하나를 마쳤습니다.

간단한 이미지 콘텐츠 관리서버와 API를 앱엔진에서 구성하고, 아이폰에서 해당 API를 호출하여 이미지를 보여주는 형태의 서비스입니다.

처음으로 앱엔진을 이용해봤지만 간단한 후기를 적어 보고자 에어를 펼쳤습니다. 혹시 누군가에게 도움이 되길 바라며, 유리병에 넣고 바다에 던져보는 거지요. 🙂

처음 앱엔진을 접했던 것은 2008년 12월쯤 아이폰 앱스를 개발하면서 cocos2d라는 라이브러리를 이용할 때였습니다. 거기 글로벌 랭킹를 관리해주는 아이가 바로 앱엔진이었던 것이였죠. 벌써 2년이 훌쩍 넘었군요. 좀 더 호기심을 가지고 들여다 봤다면 클라우드를 먼저 접해볼 수 있었겠지만 그리 못했습니다. 아쉬움이 많이 남습니다.

2년사이에 간간히 앱엔진으로 뭔가를 해봐야겠다는 생각 뿐이었고 실행에 옮기지 못했습니다. 그 사이에 저는 전업 앱개발자가 되어가고 있었지요. 이전에 하던 서버쪽 개발은 별로 흥미를 끌지 못했던 시기였습니다. 전업 앱개발자로서 SNS를 개발해보고 나서 API서버의 역할과 앱과의 통신에 대해서 이해하게 되었지요.

그래서 개인 프로젝트에 적용해보기로 맘먹었고, 그래서 머리 속 기억 저편의 앱엔진을 다시 전두엽으로 불러냈습니다. 😉

2년이란 시간이 지나는 동안 앱엔진은 자바 런타임을 도입했다는 것 외에는 큰 변화가 없었습니다. 하지만 관련해서 사용자들의 리뷰는 넘쳐나고 있었지요. 이들의 리뷰와 간증 덕분에 쉽게 이것을 해보자는 결정과 함께 착수했습니다.

약 2달간의 짬짬이 공부가 시작된 셈입니다. 꾸준하진 못했지만 토요일마다 카페에서 앱엔진을 배우기 위해서 이런저런 코딩을 해보고 실제로 서비스를 구현해봤습니다.

결론적으로 서비스는 파이썬 기반의 앱엔진으로 구현이 되었습니다.

구현하기까지 삽질한 순서를 회고해보면,

1. 초기 샘플 코드 재구현해보기 (방명록 구현하기)
2. 사진 올리고 보여주기 구현
3. data model 구현
4. json출력하기 구현
5. 관리자 페이지 작성
6. API 페이지 작성
7. Memcache 적용

이렇게 꼽을 수 있겠네요.

이 정도로 앱엔진의 모든 기능을 써봤다고 말하기는 많이 부족하지만, 간단한 RESTful 웹서비스 구현은 할 수 있겠구나는 확신이 생기더군요. 각 단계에서 느꼈던 소회를 불어보려고 합니다.

1. 초기 샘플를 따라서 구현

앱엔진의 초기 화면에서 삐적 마른 아저씨가 보여주는 동영상을 몇 번 보면서 따라했습니다. 모방을 충분히 해보니까 이 동네가 어떻게 돌아가는 지 조금 알 거 같더군요. 이 방명록 샘플에 필요한 모든 게 다 들어있다고 해도 되겠습니다. webapp framework를 사용하여 request 처리하는 방법과 처리 결과를 django를 이용해서 response하는 방법 datastore Model를 만드는 방법 이것만으로도 기본적인 웹서비스를 만들기 위한 기초는 놓여졌다고 봐야겠더군요.

2. 사진 업로드하고 보여주기

사진데이터는 BLOB로 datastore에 저장됩니다. 마치 테이블의 한 필드에 저장되는 것 처럼 말이죠. BLOB처리도 매우 간단히 처리가 되더군요. 그런데 그 이미지를 보기 위한 핸들러가 필요했습니다. 각 이미지가 들어있는 row에 대해서 key값으로 blob데이터를 불러와서 이미지로 Content-Type를 이미지로 설정해서 뿌려주니 잘 되네요. 이것도 모두 앱엔진 문서화에 포함되어 있습니다.

3. Model 설계

데이터 모델을 서비스에 맞게 디자인하고 테이블을 설계하듯이 파이썬 클래스를 db.Model를 상속받아 만들면 모델이 만들어집니다. 그 모델을 get(), put(), delete()이런 메소드를 사용할 수 있게 됩니다.

4. json으로 출력하기

django.utils에 simplejson모듈을 그냥 가져와 쓰면 되더군요. 오히려 파이썬의 dictionary와 list에 대응하는 {}, [] 표기법이 익숙치가 않아서 조금 햇갈렸습니다만 곧 이해가 되었습니다. 아울러 json의 구조상 reculsion으로 구현해야하는 부분에서 살짝 고민스러웠는데 다른 사람들이 해놓은 패턴을 따라해서 곧 해결했습니다. 그럴듯한 json를 리턴해주는 API도 구현이 끝났습니다.

5. 관리자 페이지

사실 관리자 페이지에서 콘텐츠를 입력하기 때문에 초반부터 작업이 되었습니다만 효과적인 구현이 어려웠습니다. 관련해서 찾아보니 앱엔진의 Model을 기준으로 자동으로 admin페이지를 구성해주는 appengine-admin프로젝트가 있더군요. 그것을 이용하면 어땠을까 아쉬움이 남았습니다.

6. API 구현

이제 아이폰 앱스와 앱엔진 사이의 API를 구현했습니다. json으로 쉽게 만들 수 있어 쉽게 구현했습니다. 이때 Model사이의 join개념을 사용하기 위해서 ReferenceProperty를 사용하여 최종적으로는 tree형태의 자료구조가 json으로 출력되도록 했습니다. 뭔가 무거운 느낌이 들었지만 그냥 잘 작동 되는 것 같아(?) 넘어갔습니다.

7. Memcache 적용

API를 호출하면서 본격적인 테스트에 들어갔는데, 이상하게도 좀 무거운 API를 호출하면 앱엔진 어드민 콘솔에서 로그에 빨간색으로 경고가 떴습니다. cpu사용과 api호출이 과하다는 경고였습니다. 몇 번 사용하지 않았는데도 cpu가 쿼터의 90%에 육박하는 것이었죠. 실 서비스로 간다면 쿼터를 넘어서 서비스가 불가능했겠지요. 결국 같은 내용을 리턴해주는 쿼리를 매번 할 필요없이 특정 시간동안은 memcache에 저장한 다음 그것을 리턴해주는 방식으로 cpu와 api호출 과부하 문제를 해결했지요.

아직 앱 승인전이고 실 서비스가 진행됨에 따라 예기치 못한 문제가 발생할 수 있겠습니다. 그렇게 경험한 뒤에 그 경험을 나눌 것을 약속드립니다. 🙂

글을 마무리 하면서, 앱엔진은 독립 앱스 개발자들에게 날개를 달아주는 서비스라고 생각합니다. 클라우드 세상은 이미 도래했고 서로 나를 이용해달라고 아우성입니다. 앱엔진을 공부하는 동안 AWS(아마존 웹 서비스)에도 급 관심이 생기더군요. 특히 대용량 저장을 위한 S3는 먼저 써보고 싶어질 정도였죠. 앱스 개발자 여러분 클라우드에 도전해보십시오. 막연한 두려움 가질 필요가 없어요. 해보면 별거 없습니다.  주저하고 있다면 저질러보십시오. 이년전에 제가 주저하다가 말아버린 걸 후회하는 전철을 밟지 마시길 당부드립니다.

최피디 드림.

Advertisements
 

태그: , , , , , , ,

Google App Engine 사용 후기”에 대한 25개의 응답

  1. 현남

    2011년 5월 2일 at 7:57 오후

    저도 이미지 관리 및 제공 서버를 앱스를 통해 구축하려고 합니다. 좋은 인연 되었으면 하네여 반갑습니다

     
    • 최피디

      2011년 5월 2일 at 8:44 오후

      안녕하세요~! 앱스 정말 좋습니다. 이미지가 좀 커지면 무료트래픽 1기가는 쉽게 넘어간다는 점이 아쉬움이 남긴합니다. 😉

       
  2. 기환

    2011년 5월 10일 at 9:40 오후

    안녕하세요. 검색하다보니 어찌 찾아보게 되었습니다; 초면에 질문좀 드려도 될까요? 이미지 업로드의 경우는 blob만으로 하신건가요? Blobstore 말구요? blob이 파일당 1메가 한계가 맞는지요?

    이미지 업로드용은 아니고 파일업로드 기능을 파이썬 구글앱스로 구현중인데… api만 보다가 막혀버려서 ㅠㅜ 혹시 Blobstore로 구현할경우 따로 파일 저장시키는 부분도 만들어줘야 하는건가요? 아직 api문서만 따라해보고, 거기까진 됐는데 그전 생각하던, 다운로드 폴더 만들어지고 거기에 파일이 쌓이겠지.. 하고 생각했는데 안그렇더라구요.

    초면에 막 질문드려 죄송합니다만.. 막 지푸라기라도 잡아야 하는 상황이라서요 ㅠㅠ

     
    • 최피디

      2011년 5월 10일 at 9:52 오후

      안녕하세요~! blob로 올렸구요. 1메가 제한이 있는게 맞습니다. 이미지 업로드나 파일 업로드나 마찬가지로 blob형태로 datastore에 직접 저장됩니다. blobstore는 사용해본 적이 없어 잘 모르겠습니다.

      엡엔진에서는 file i/o를 api로 추상화시키고 있기 때문에 따로 file를 저장하는 게 아닌 것으로 알고 있습니다. api로 저장되고 읽고 하는 게 아닐까 추측(?) 해봅니다. 🙂

       
      • 기환

        2011년 5월 11일 at 1:52 오후

        아넵 답변 감사합니다~~ 계속 찾아보니깐 추측하신게 맞는거 같기도 합니다; 아직 좀 더 알아봐야 해서요. 감사합니다~

         
  3. kaojinz (@kaojinz)

    2011년 11월 2일 at 7:41 오후

    최피디님 앱엔진의 DataStore 에서 두개의 db class에서 쌍으로 연결하는 법을 아시나요?
    예를 들어 문서에 태그들이 있는데 태그 검색의 효율을 위해서 태그만 모여 있는 클래스를 만들어서 문서를 연결해 놓았다가 문서가 삭제 되면 태그의 문서 리스트에서 링크도 삭제 되도록 하고 싶어서요. (설명이 제대로 된건지 모르겠네요 ㅡㅡ; )

     
    • 최피디

      2011년 11월 3일 at 8:51 오전

      cascading deletion기능은 rdbms가 join기반으로 기능을 지원합니다. gae의 datastore는 key value 기반의 noSql방식입니다. 프로그래머가 필요시 직접 구현해줘야 합니다.

       
      • kaojinz (@kaojinz)

        2011년 11월 5일 at 1:54 오후

        그렇군요 답변 감사합니다. ^^

         
  4. Lee SeungWoo (@asbubam)

    2011년 11월 16일 at 6:16 오후

    누군가에게 도움이 되길 바라며, 유리병에 넣고 바다에 던져보는 거지요. -> 큰 도움이 되었습니다. C/자바 로 서버개발을 하다 염증을 느끼고, 파이썬, 아이폰 개발을 이제 막 공부하기 시작한 개발자입니다. 최피디님을 보고, 저도 새로운 꿈을 키워갑니다. 계속 알찬 블로깅 기대하겠습니다.

     
  5. 미니

    2012년 4월 24일 at 5:57 오후

    이제 구글 앱엔진을 자바버전으로 시작해 보려고 하는데요. 말씀해주신 내용이 도움이 많이 되겠네요. 감사합니다.

     
    • 최피디

      2012년 5월 1일 at 2:28 오전

      감사합니다. 건투를 빕니다. 🙂

       
  6. 一昊(일호) (@picopico0124)

    2013년 1월 11일 at 9:19 오전

    구글 앰 엔진이 무었인지 궁금했었는데… 아 이렇게 쓰는구나라는걸 알게 되었습니다. 유리병 감사합니다.

     
    • 최피디

      2013년 1월 12일 at 5:50 오후

      답이 늦었네요. 도움이 되셨다니 기쁩니다. ^^

       
  7. 로그(성배)

    2013년 4월 11일 at 10:42 오전

    감사합니다~ 저도 아이폰 앱개발중에 이미지 서버가 필요해서 호스팅 업체 알아보고
    있었는데 좋은 정보 알게되었네요~

     
    • 최피디

      2013년 4월 11일 at 10:45 오전

      요즘은 이렇게 하지 않고, mbaas라는 걸 이용하면 편하게 할 수 있습니다. 가령 https://baas.io 같은 서비스에 가입하시고, 파일을 올리고 내려받는 등의 작업을 손쉽게 할 수 있습니다. 지금 제가 동일한 프로젝트를 진행한다면 baas.io나 parse.com 등의 MBaaS를 이용할 것입니다. 🙂

       
  8. Tommy Lee

    2013년 4월 22일 at 10:28 오전

    어쩌다 내용 보고 글 남깁니다.
    해외 교포인데 유용한 글에 감사드립니다.
    궁금한게 있는데 저는 델파이로 PC 프로그램에서 구글 앱 엔진을 이용해서 서버에 이미지나 문자 등을 저장하려고 하는데 서버는 파이썬으로 하려고 하거든요.
    이게 가능은 한건지요 ?
    그리고 이미지가 많은 경우는 어떤 솔루션을 선택하는 것이 비용대비로 좋은 것인지 궁금합니다.
    그리고 아직 잘 몰라서 그러는데..
    xx.appspot.com 형태로 등록을 하게 하던데 그게 스마트폰이든 PC 프로그램이든 자료를 저장할 때 이용하는 서버 주소를 말하는건가요 ?
    아니면 웹 사이트 형태로 서비스를 할 수 있도록 해주는 건가요 ? 아니면 둘다인가요 ?

     
    • 최피디

      2013년 4월 22일 at 10:37 오전

      안녕하세요. 반갑습니다.
      1. 서버에 이미지나 문자 등을 저장하려고 한다면 앱엔진을 사용하는 것이 하나의 대안이 될 수 있겠습니다. 서버와 델파이 코드간의 통신은 http(s)로 하게 될테니 문제될 것은 없을 것입니다.
      2. 앱엔진 서버 비용과 아마존 스토리지(s3) 비용을 비교해볼 필요가 있겠습니다. 클라우드에 이미지를 저장할 경우 스토리지 사용량과 트래픽 두가지 요소로 과금하게 되니 참조하시면 좋겠습니다.
      3. xx.appspot.com 은 앱엔진에 앱을 배포할 때 외부에서 접속할 수 있는 도메인 이름입니다. 스마트폰, PC프로그램 모두 웹API 사용이 가능할 것입니다. 웹사이트를 구성(view)할 수도 있고, 단순히 API형태로 데이터를 관리하기 위한 용도로만 사용할 수 도 있습니다. 제 포스팅의 경우 모바일에서 접근하여 데이터와 파일을 읽어오는 목적으로 API만 제공했으며, 관리자 기능에서 뷰를 제공했습니다. 즉 둘다 지원합니다.

      최피디 올림

       
  9. 컴소 꼬꼬마

    2013년 4월 30일 at 5:48 오후

    안녕하세요 현재 소프트웨어공학을 전공하는 대학생입니다. 저도 클라우드 서비스에 관심이 있어서 구글 클라우드를 이용한 ios 어플리케이션 개발을 하려고 하는데 구글 문서를 봐도 도통 모르겠더라고요 ㅠㅠ 예제는 또 어디서 보는건지…. 최피디님께서 하신 예제나 가이드 같은걸 어디서 보고 하셨는지 알수 있을까요??

     
    • 최피디

      2014년 2월 11일 at 6:12 오후

      안녕하세요. 답이 너무 늦었네요. 예제나 가이드는 주로 구글링하는 과정에서 알게된 것들을 응용하게 되는 경우가 많았습니다. 감사합니다.

       
  10. 익명

    2013년 5월 4일 at 11:57 오전

    안녕하세요 좋은글 잘 보았습니다 🙂 개인적인 궁금증인데 Java가 아니라 Python으로 하신 특별한 이유가 있는가요?

     
    • 최피디

      2013년 5월 4일 at 12:39 오후

      개인적 선호로 했습니다. 앱엔진이 첨에 python으로 나왔기 때문에 당시 자바쪽 자료보다 파이썬이 더 찾기 쉬웠어요.그때나 지금이나 전 자바를 잘 모릅니다.

       
  11. 잉여개발자

    2013년 5월 29일 at 4:39 오후

    유리병 고맙습니다. 좋은 정보 얻어갑니다.

     
    • 최피디

      2013년 5월 29일 at 4:40 오후

      ^^ 별말씀을요. 오래된 글인데 도움이 되셨길 바랍니다. 😉

       
  12. totori

    2013년 9월 12일 at 12:57 오전

    최피디님. 잘 보았습니다.
    Apple의 iCloud가 아직 Storage서비스만을 지원하는걸로 아는데
    앞으로는 혹시 GAE와 같은 CloudAPI서비스도 지원하지 않을까 생각되는군요.
    많은 도움 바랍니다.

     
    • 최피디

      2013년 9월 12일 at 2:09 오전

      네에 하지만 애플은 좀 보수적일것 같아요. 요즘은 mbaas도 유행입니다. 국내에는 baas.io 외국에는 parse.com같은 것이죠.

       

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

 
%d 블로거가 이것을 좋아합니다: