Your SlideShare is downloading. ×
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

[D2 오픈세미나]4.네이티브앱저장통신

5,569

Published on

[D2 오픈세미나]4.네이티브앱저장통신

[D2 오픈세미나]4.네이티브앱저장통신

Published in: Technology
0 Comments
17 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,569
On Slideshare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
57
Comments
0
Likes
17
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 오픈소스 라이브러리를 활용한 네이티브 어플리케이션에서의 데이터 저장과 통신 추승우 네이버 PWE개발랩
  • 2. Hello • 추승우 • 네이버 PWE개발랩 • 네이버메일앱 개발 • E-Mail : sungwoo.choo@navercorp.com kswchoo@gmail.com
  • 3. 오늘 다루는 것 NATIVE
  • 4. 언제 네이티브 앱을 만들어야 할까요? VS
  • 5. 언제 네이티브 앱을 만들어야 할까요? VS 디바이스 제어 (카메라 등)가 필요하다 오프라인 사용이 필요하다 플랫폼별로 최적 UI를 만들고 싶다 애니메이션 사용량이 많다 포맷 변경이 갑자기/자주 일어나지 않는다 내용 포맷 변경이 자주 있다 다양한 플랫폼에서 사용하고 싶다 심사를 기다리지 않고 업데이트해야 한다 네이티브앱 하이브리드앱
  • 6. 일부분만 웹뷰를 사용하여 만들기도 합니다 • 공지사항, 고객문의 등의 여러 앱에서 사용하는 공 통기능을 웹뷰로 만드는 경우 • 컨텐츠의 자유도가 너무 높아서 웹뷰를 사용하여 내용을 구현하는 경우 (E-book 등) • 지불결제 서비스 등 타사 연동을 위한 경우
  • 7. 비행기 안에서 스마트폰 써 보셨나요?
  • 8. 많은 모바일 어플리케이션은 네트워크가 아주 불안정한 상황이거나 심지어 오프라인일때도 동작할 수 있도록 설계됩니다.
  • 9. Facebook
  • 10. Twitter
  • 11. 네이버 메일
  • 12. 잘못된 예
  • 13. 개인화도구 (할일, 메일, 캘린더, 메모, 녹음기…)나 유틸리티, 게임류의 어플리케이션은 가급적 오프라인모드에서도 동작해야 합니다.
  • 14. Demo App “기획서” … 영화목록 영화상세 여러분의 기획자가 이런걸 만들어달라고 합니다 • 최근 개봉한 순서대로 영화를 보여주세요. • 영화 상세정보도 보여주세요. • 오프라인 모드에서도 최근 데이터 기반으로 보여주세요. • 앱 실행중 데이터에 번동이 있으면 바꿔 주세요. • 데이터를 덜썼으면 좋겠어요 • 배터리 적게 썼으면 좋겠어요 • “ CGV앱”처럼 만들어주세요.
  • 15. 일반적인 네이티브 앱 View Logic Request Response SQLite Event 3G/LTE WiFi 서버 화살표가 있는 구간에서 모두 해결해야 할 문제가 하나 이상씩 있습니다.
  • 16. 모바일 네트워크 • 분당에서 대구까지 KTX를 타고 이동했다. 과연 IP가 바뀔까? • 단말기 전원을 껐다 켰다. IP가 바뀔까? • 미국에 도착하여 비행기에서 내리자마자 로밍을 켰다. 미국에 할당된 IP를 받아올까? • 데이터통신중에 전화가 걸려오면 통신중인 세션이 끊어질까? (3G Fallback) No Maybe No No 이런 질문 해 보셨나요?
  • 17. LTE 모바일 네트워크 단말기 기지국 패킷 게이트웨이 터널관리 인증 핸드오버 앵커PPP Tunnel UE : User Equipment eNodeB : Evolved Node B S-GW : Servicing Gateway PDN-GW : Packet Data Network GW MME : Mobile Management Entity HSS : Home Subscriber Server PCRF : Policy and Charging Rule Function ePDG : Evolved Packet Data Gateway
  • 18. 바퀴를 새로 발명할 필요는 없습니다. 오픈소스 라이브러리를 최대한 활용하면 안정적이면서도 빠른 네이티브 앱 개발이 가능합니다.
  • 19. View Logic Request Response SQLite Event 3G/LTE WiFi 서버 HTTP 통신 구간 서버로 향하는 통신을 수행하고, 그 결과를 사용하여 자바 객체를 생성하는 부분 필요시 이미지 다운로드
  • 20. 한국 무선 통계 0 50 100 150 LTE 3G WIFI 0 10 20 30 40 50 LTE 3G WIFI DN (Mbps) UP (Mbps) 자료: 벤치비, 미래창조과학부 ms Mbps 지연시간 (Latency) 전송속도 0 10 20 30 40 50 60 CDMA 3G LTE WIBRO 백만명 국내 무선통신 사용자 현황 “30%의 사용자는 아직도 3G망을 사용 중”
  • 21. 믿을만하지 못한 무선 네트워크 환경 + 믿을만하지 못한 HTTP 라이브러리 = ?! 안드로이드는 기본적으로 두 가지의 HTTP 클라이언트를 제공합니다. Apache HTTP Client HttpURLConnection • 아파치에서 만든 HTTP 클라이언트. • 최신 버전으로 제공은 안됨. • 사용하기 복잡하고 무거움. • 안드로이드 버전별로 약간씩 다른 행동. • 버그가 많음. 둘다 Deserialization을 안해주므로, 좀 더 쓰기 편리한 써드파티 오픈소스 라이브러리도 많이 있습니다. Volley OkHttp+Retrofit • 이미지 처리에 특히 장점을 가지고 있음 • Google IO 에서 발표되었으나, follow up이 원활하지 않음. • NIO기반으로 비교적 빠른 성능 • SPDY 지원 • Google 공식 컨퍼런스 등에서 사용된 적이 없음. 주: 기타 많은 라이브러리가 있습니다. HelloWorld 블로그에 있는 비교 포스트도 참고하세요.
  • 22. HTTP 라이브러리 3G 성능측정 0 2 4 6 8 10 12 14 16 시나리오 1 시나리오 2 시나리오 3 AsyncTask Volley Retrofit + OkHttp (초) KT 3G / LG Nexus 5 / HTTP+SSL 시나리오 1 : 목록 API 5회 시나리오 2 : 목록 API 5회 + 상세 API 30회 시나리오 3 : 목록 API 30회 + 상세 API 100회
  • 23. 서버를 확인하세요 : Gzip, TCP slow start (keepalive) 0 100 200 300 400 500 600 700 800 900 Non-gzip Gzip kb API 응답 크기 TCP 성능 (Slow start, congestion avoidance)
  • 24. 서버를 확인하세요 : SPDY 자료: SIGCOMM 2013, “Towards a SPDY’ier Mobile Web?” • Nginx : http://nginx.org/en/docs/http/ngx_http_spdy_module.html • Apache : https://code.google.com/p/mod-spdy/ SPDY는 보다 적은 수의 컨넥션을 활용하여 더 많은 데이터를 처리합니다. 다량의 API 콜이 발생하는 경우, API 수정 없이도 더 빨라집니다.
  • 25. Retrofit http://square.github.io/retrofit/ 서비스 선언 Public interface MovieListService { @GET(“/movielist”) List<MovieList> movieList(); @GET(“/moviedetail/{id}”) MovieDetail movieDetail(@Path("id") int id); } RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint( "https://.../movielistdemo") .build(); MovieListService service = restAdapter.create(MovieListService.class); 서비스 호출 List<MovieList> movieList = service.movieList(); 서비스 호출 (비동기) public interface MovieListService { ... @GET(“/moviedetail/{id}”) void movieDetail(@Path("id") int id, Callback<MovieDetail> callback); } service.movieDetail();
  • 26. Picasso http://square.github.io/picasso/ Picasso.with(context) .load(url) .resize(50, 50) // 메모리 사용 절약을 위해 리사이즈 .centerCrop() // 가운데로 크롭 .setIndicatorsEnabled(true) // 캐시 모드 표시 .placeholder(R.drawable.image_placeholder) // 다운받아지기 전에 보여줄 리소스 .error(R.drawable.image_error) // 오류발생시 보여줄 리소스 .into(view);
  • 27. View Logic Request Response SQLite Event 3G/LTE WiFi 서버 데이터 저장 받아온 데이터를 로컬에 저장하고 필요시 다시 불러올 수 있는 로직
  • 28. 난 데이터를 저장하고 불러들이고 싶었을 뿐인데… android.database.sqlite.SQLiteException: database is locked android.database.sqlite.SQLiteException: unable to open database file ... SQLite를 잘 사용하는 것은 절대 쉽지 않습니다. 대부분의 모바일 앱에서 필요한 것은 복잡한 SQL이 아니라, 인스턴스를 저장했다 불러내는 기능입니다…
  • 29. GreenDAO TestDaoGenerator.java public static void main(String args[]) throws Exception { Schema schema = new Schema(3, "me.sungwoo.listdemo.dao"); Entity movieList = schema.addEntity(“MovieList"); movieList.addIdProperty(); movieList.addStringProperty("title"); movieList.addStringProperty("description"); new DaoGenerator().generateAll(schema, args[0]); } Generator 프로젝트를 만들어 준다. build.gradle apply plugin: 'application' apply plugin: 'java' mainClassName = 'me.sungwoo.listdemo.daogenerator.TestDaoGenerator' outputDir = '../app/src/main/java-gen' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'de.greenrobot:DaoGenerator:1.3.0' } task createDocs { def docs = file(outputDir) docs.mkdirs() } run { args outputDir } id title descrip tion 1 2 3 http://greendao-orm.com
  • 30. GreenDAO DaoSession 생성 DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, “moviedb", null); SQLiteDatabase db = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); 그냥 사용하면 끝! 자료 조회 (Select) MovieListDao movieListDao = daoSession.getMovieListDao(); MovieList movies = listDao.queryBuilder() .where(MovieListDao.Properties.Id.eq(id)) .orderDesc(MovieListDao.Properties.Id) .list(); 자료 삽입 (Insert) MovieList item = new MovieList(null, "은하수를 여행하는 히치하이커", “42"); movieListDao.insert(movieList); 자료 삭제 (Delete) movieListDao.deleteByKey(id);
  • 31. SQLite Tip WAL 사용 SQLiteDatabase db = SQLiteDatabase.openDatabase(“db", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY, myDatabaseErrorHandler); db.enableWriteAheadLogging(); • API 16 부터 지원 • 쓰기를 모아서 수행하여 Lock 시간을 감소 • E_SQLITE_LOCKED 볼 일을 줄여줍니다!
  • 32. View Logic Request Response SQLite Event 3G/LTE WiFi 서버 이벤트 처리 언제 완료될 지 모르는 작업들이 끝났을 때 어느 쓰레드에서 무엇을 갱신해줘야 할까?
  • 33. Event Bus의 활용 목록 View 상세정보 View Logic • 비동기로 완료된 작업이 어디로 값을 돌려줘야 할까? • 데이터가 갱신되었는데 callback을 빼먹어서 버그 발생? Event bus Internet 새로운 데이터데이터 갱신 요청 “비동기적으로 연속적으로 처리되어야 할 작업들을 ‘이벤트’로 정의하여 보다 부드럽게 구현”
  • 34. Otto http://square.github.io/otto/ 공용 이벤트 버스 생성 bus = new Bus(); // 일반 이벤트 버스 mainBus = new Bus(ThreadEnforcer.MAIN); // Main thread로 불러지는 버스 이벤트 수신자 (Subscriber) @Subscribe public void updateMovieList(MovieList list) { // Do something } bus.register(this); 이벤트 던지기 bus.post(new MovieList(1, "Hi", "There"));
  • 35. 예제 앱 오픈소스 스택 View Logic Request Response SQLite Event 3G/LTE WiFi 서버 Android SDK RetroFit OkHttp OttoGreenDAO SQLite User View Logic Otto GreenDAO RetroFit
  • 36. One more thing : iOS iOS용 라이브러리 몇 가지를 소개합니다 HTTP 통신 • AFNetworking (OkHttp + Picasso + Retrofit) • FastImageCache (Picasso) Event Delivery • NSNotification • Tolo (otto) DB Storage • Core Data • 암호화가 필요한 경우 : SQLCipher
  • 37. DEMO
  • 38. Q&A
  • 39. 감사합니다

×