NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브...
-
Upload
sungwoo-choo -
Category
Engineering
-
view
541 -
download
15
description
Transcript of NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브...
![Page 1: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/1.jpg)
오픈소스 라이브러리를 활용한네이티브 어플리케이션에서의데이터 저장과 통신
추승우네이버 PWE개발랩
![Page 3: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/3.jpg)
오늘 다루는 것
NATIVE
![Page 4: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/4.jpg)
언제 네이티브 앱을 만들어야 할까요?
VS
![Page 5: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/5.jpg)
언제 네이티브 앱을 만들어야 할까요?
VS
디바이스 제어 (카메라 등)가 필요하다
오프라인 사용이 필요하다
플랫폼별로 최적 UI를 만들고 싶다
애니메이션 사용량이 많다
포맷 변경이 갑자기/자주 일어나지 않는다
내용 포맷 변경이 자주 있다
다양한 플랫폼에서 사용하고 싶다
심사를 기다리지 않고 업데이트해야 한다
네이티브앱 하이브리드앱
![Page 6: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/6.jpg)
일부분만 웹뷰를 사용하여 만들기도 합니다
• 공지사항, 고객문의 등의 여러 앱에서 사용하는 공
통기능을 웹뷰로 만드는 경우
• 컨텐츠의 자유도가 너무 높아서 웹뷰를 사용하여
내용을 구현하는 경우 (E-book 등)
• 지불결제 서비스 등 타사 연동을 위한 경우
![Page 7: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/7.jpg)
비행기 안에서 스마트폰 써 보셨나요?
![Page 8: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/8.jpg)
많은 모바일 어플리케이션은
네트워크가 아주 불안정한 상황이거나
심지어 오프라인일때도
동작할 수 있도록 설계됩니다.
![Page 9: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/9.jpg)
![Page 10: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/10.jpg)
![Page 11: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/11.jpg)
네이버 메일
![Page 12: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/12.jpg)
잘못된 예
![Page 13: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/13.jpg)
개인화도구 (할일, 메일, 캘린더, 메모, 녹음기…)나
유틸리티, 게임류의 어플리케이션은
가급적 오프라인모드에서도 동작해야 합니다.
![Page 14: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/14.jpg)
Demo App “기획서”
…
영화목록 영화상세
여러분의 기획자가 이런걸 만들어달라고 합니다
• 최근 개봉한 순서대로 영화를 보여주세요.
• 영화 상세정보도 보여주세요.
• 오프라인 모드에서도 최근 데이터 기반으로 보여주세요.
• 앱 실행중 데이터에 번동이 있으면 바꿔 주세요.
• 데이터를 덜썼으면 좋겠어요
• 배터리 적게 썼으면 좋겠어요
• “ CGV앱”처럼 만들어주세요.
![Page 15: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/15.jpg)
일반적인 네이티브 앱
View LogicRequest
Response
SQLite
Event
3G/LTEWiFi
서버
화살표가 있는 구간에서 모두 해결해야 할 문제가 하나 이상씩 있습니다.
![Page 16: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/16.jpg)
모바일 네트워크
• 분당에서 대구까지 KTX를 타고 이동했다. 과연 IP가 바뀔까?
• 단말기 전원을 껐다 켰다. IP가 바뀔까?
• 미국에 도착하여 비행기에서 내리자마자 로밍을 켰다. 미국에 할당된 IP를 받아올까?
• 데이터통신중에 전화가 걸려오면 통신중인 세션이 끊어질까?
(3G Fallback)
No
Maybe
No
No
이런 질문 해 보셨나요?
![Page 17: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/17.jpg)
LTE 모바일 네트워크
단말기 기지국 패킷게이트웨이
터널관리
인증
핸드오버앵커PPP Tunnel
UE : User EquipmenteNodeB : Evolved Node BS-GW : Servicing Gateway
PDN-GW : Packet Data Network GWMME : Mobile Management EntityHSS : Home Subscriber Server
PCRF : Policy and Charging Rule FunctionePDG : Evolved Packet Data Gateway
![Page 18: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/18.jpg)
바퀴를 새로 발명할 필요는 없습니다.
오픈소스 라이브러리를 최대한 활용하면
안정적이면서도 빠른 네이티브 앱 개발이 가능합니다.
![Page 19: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/19.jpg)
View LogicRequest
Response
SQLite
Event
3G/LTEWiFi
서버
HTTP 통신 구간
서버로 향하는 통신을 수행하고,그 결과를 사용하여 자바 객체를 생성하는 부분필요시 이미지 다운로드
![Page 20: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/20.jpg)
한국 무선 통계
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망을 사용 중”
![Page 21: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/21.jpg)
믿을만하지 못한 무선 네트워크 환경 + 믿을만하지 못한 HTTP 라이브러리 = ?!
안드로이드는 기본적으로 두 가지의 HTTP 클라이언트를 제공합니다.
Apache HTTP Client HttpURLConnection
• 아파치에서 만든 HTTP 클라이언트.
• 최신 버전으로 제공은 안됨.
• 사용하기 복잡하고 무거움.
• 안드로이드 버전별로 약간씩 다른 행동.
• 버그가 많음.
둘다 Deserialization을 안해주므로, 좀 더 쓰기 편리한써드파티 오픈소스 라이브러리도 많이 있습니다.
Volley OkHttp+Retrofit
• 이미지 처리에 특히 장점을 가지고 있음
• Google IO 에서 발표되었으나, follow up이
원활하지 않음.
• NIO기반으로 비교적 빠른 성능
• SPDY 지원
• Google 공식 컨퍼런스 등에서 사용된
적이 없음.
주: 기타 많은 라이브러리가 있습니다. HelloWorld 블로그에 있는 비교 포스트도 참고하세요.
![Page 22: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/22.jpg)
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회
![Page 23: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/23.jpg)
서버를 확인하세요 : 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)
![Page 24: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/24.jpg)
서버를 확인하세요 : 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 수정 없이도 더 빨라집니다.
![Page 25: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/25.jpg)
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();
![Page 26: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/26.jpg)
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);
![Page 27: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/27.jpg)
View LogicRequest
Response
SQLite
Event
3G/LTEWiFi
서버
데이터 저장
받아온 데이터를 로컬에 저장하고필요시 다시 불러올 수 있는 로직
![Page 28: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/28.jpg)
난 데이터를 저장하고 불러들이고 싶었을 뿐인데…
android.database.sqlite.SQLiteException: database is lockedandroid.database.sqlite.SQLiteException: unable to open database file...
SQLite를 잘 사용하는 것은 절대 쉽지 않습니다.
대부분의 모바일 앱에서 필요한 것은 복잡한 SQL이 아니라,인스턴스를 저장했다 불러내는 기능입니다…
![Page 29: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/29.jpg)
GreenDAO
TestDaoGenerator.javapublic 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.gradleapply 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 description
1
2
3
http://greendao-orm.com
![Page 30: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/30.jpg)
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);
![Page 31: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/31.jpg)
SQLite Tip
WAL 사용SQLiteDatabase db = SQLiteDatabase.openDatabase(“db", cursorFactory,SQLiteDatabase.CREATE_IF_NECESSARY, myDatabaseErrorHandler);db.enableWriteAheadLogging();
• API 16 부터 지원
• 쓰기를 모아서 수행하여 Lock 시간을 감소
• E_SQLITE_LOCKED 볼 일을 줄여줍니다!
![Page 32: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/32.jpg)
View LogicRequest
Response
SQLite
Event
3G/LTEWiFi
서버
이벤트 처리
언제 완료될 지 모르는 작업들이 끝났을 때어느 쓰레드에서 무엇을 갱신해줘야 할까?
![Page 33: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/33.jpg)
Event Bus의 활용
목록View
상세정보View
Logic
• 비동기로 완료된 작업이 어디로 값을 돌려줘야 할까?
• 데이터가 갱신되었는데 callback을 빼먹어서 버그 발생?
Event bus
Internet
새로운 데이터데이터 갱신 요청
“비동기적으로 연속적으로 처리되어야 할 작업들을
‘이벤트’로 정의하여 보다 부드럽게 구현”
![Page 34: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/34.jpg)
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"));
![Page 35: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/35.jpg)
예제 앱 오픈소스 스택
View LogicRequest
Response
SQLite
Event
3G/LTEWiFi
서버
Android SDK
RetroFit
OkHttpOttoGreenDAO
SQLite
User View Logic
Otto
GreenDAO
RetroFit
![Page 36: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/36.jpg)
One more thing : iOS
iOS용 라이브러리 몇 가지를 소개합니다
HTTP 통신
• AFNetworking (OkHttp + Picasso + Retrofit)
• FastImageCache (Picasso)
Event Delivery
• NSNotification
• Tolo (otto)
DB Storage
• Core Data
• 암호화가 필요한 경우 : SQLCipher
![Page 37: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/37.jpg)
DEMO
![Page 38: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/38.jpg)
Q&A
![Page 39: NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신](https://reader031.fdocuments.net/reader031/viewer/2022020101/556a8440d8b42a7c758b535b/html5/thumbnails/39.jpg)
감사합니다