파크히어 realm 사용 사례

59
파크히어 Realm 사용 사례 2016. 03. 31 이선협 / ParkingSquare

Upload: -

Post on 16-Apr-2017

1.802 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: 파크히어 Realm 사용 사례

파크히어 Realm 사용 사례

2016.�03.�31�이선협�/�ParkingSquare

Page 2: 파크히어 Realm 사용 사례

발표자�소개

- 이선협�/�KC�

- NHN�NEXT�

- 파킹스퀘어에서�iOS�개발�담당�

- 산업기능요원으로�복무�중�

- https://github.com/kciter�

- https://medium.com/@kciter

Page 3: 파크히어 Realm 사용 사례

파크히어�소개

- 주차�예약�서비스�

- 합리적인�가격으로�내�주차�자리를�보장�

- iOS,�안드로이드,�모바일웹,�PC웹�

- http://www.parkhere.co.kr/

Page 4: 파크히어 Realm 사용 사례

목차

- Why�Realm?�

- 어떻게해야�Realm을�잘썼다고�소문이�날까?�

- 기존�파크히어�로직의�문제점�

- 리팩토링�

- 하나씩�살펴보기�

- 네트워크�로직�

- 오브젝트�맵핑�

- MVVM�

- 결론�

- Q�&�A

Page 5: 파크히어 Realm 사용 사례

목차

- Why�Realm?�

- 어떻게해야�Realm을�잘썼다고�소문이�날까?�

- 기존�파크히어�로직의�문제점�

- 리팩토링�

- 하나씩�살펴보기�

- 네트워크�서비스�

- 오브젝트�맵핑�

- MVVM�

- 결론�

- Q�&�A

- iOS�앱�개발을�처음�접할�때�알았으면�좋았을�내용iOS�앱�개발을�처음�접할�때�알았으면�좋았을�내용!!!�을�위주로�담았습니다

Page 6: 파크히어 Realm 사용 사례

PARK�HERE는�왜�Realm을�사용했을까요?

Page 7: 파크히어 Realm 사용 사례

Why�Realm?1.�좋은�성능

- SQLite,�Core�Data보다�좋은�성능을�보여줌

Page 8: 파크히어 Realm 사용 사례

Why�Realm?2.�편리한�사용성

- 설치와�사용이�쉬움�

- 쉽게�데이터�모델�정의�가능�

- 간단하게�관계�설정�가능�

- 0.96�업데이트로�NULL�속성도�지원�

- Core�Data보다�러닝커브가�적고�사용하기�쉬움

Page 9: 파크히어 Realm 사용 사례

Why�Realm?3.�오픈소스

- 계속해서�발전하는�오픈소스�

- 꾸준히�새로운�기능�추가�중

Page 10: 파크히어 Realm 사용 사례

Why�Realm?4.�Core�Data는�불편해보였다…

- 데이터�모델�파일을�따로�만들어야함

Page 11: 파크히어 Realm 사용 사례

Why�Realm?4.�Core�Data는�불편해보였다…

- 데이터�모델�파일을�따로�만들어야함�

- 사용법이�Realm에�비해�복잡하다

Core Data Realm

데이터 불러오는 코드

Page 12: 파크히어 Realm 사용 사례

Why�Realm?4.�Core�Data는�불편해보였다…

- 데이터�모델�파일을�따로�만들어야함�

- 사용법이�Realm에�비해�복잡하다�

- Learning�Curve가�크다

Page 13: 파크히어 Realm 사용 사례

Why�Realm?4.�Core�Data는�불편해보였다…

- 데이터�모델�파일을�따로�만들어야함�

- 사용법이�Realm에�비해�복잡하다�

- Learning�Curve가�크다�

- 별도로�구현해야할�기능들이�Realm에�구현되어�있다(Notification,�Realm().add(_:update:)�등)

Page 14: 파크히어 Realm 사용 사례

Why�Realm?4.�Core�Data는�불편해보였다…

- 데이터�모델�파일을�따로�만들어야함�

- 사용법이�Realm에�비해�복잡하다�

- Learning�Curve가�크다�

- 별도로�구현해야할�기능들은�Realm에�있다�(Notification,�Realm().add(_:update:)�등)

객체화하여�사용하거나�MagicalRecord같은�라이브러리를�이용해도�좋지만�이미�필요한�기능이�구현되어있고�성능도�더�좋은�Realm을�사용하기로�결정했습

니다.

Page 15: 파크히어 Realm 사용 사례

어떻게�Realm을�써야�잘썼다고�소문이날까?

Page 16: 파크히어 Realm 사용 사례

기존�파크히어�로직

뷰�진입서버에�

데이터�요청JSON�Parse UI�적용

Realm�적용�전

Page 17: 파크히어 Realm 사용 사례

기존�파크히어�로직Realm�적용�전

뷰�진입서버에�

데이터�요청JSON�Parse UI�적용

AFNetworking SwiftyJSON Callback

- 첫�iOS�앱�제작�경험�

- AFNetworking�사용�

- SwiftyJSON�라이브러리로�일일이�JSON�Parsing�

- 데이터�반환을�Callback을�이용함�

- MVC�Architecture

Page 18: 파크히어 Realm 사용 사례

기존�파크히어�로직Realm�적용�전

뷰�진입서버에�

데이터�요청JSON�Parse UI�적용

AFNetworking SwiftyJSON Callback

- 첫�iOS�앱�제작�경험�(경험�미숙으로�잘못된�구조�작성)�

- AFNetworking�사용�(Swift와�어울리지�않음)�

- SwiftyJSON�라이브러리로�일일이�JSON�Parsing�(단순�반복�작업,�중복�코드)�

- 데이터�반환을�Callback을�이용함�(중복�코드,�클래스간�의존성)�

- MVC�Architecture�(Massive�View�Controller�문제)

Page 19: 파크히어 Realm 사용 사례

기존�파크히어�로직Realm�적용�전

뷰�진입서버에�

데이터�요청JSON�Parse UI�적용

AFNetworking SwiftyJSON Callback

- 첫�iOS�앱�제작�경험�

- AFNetworking�사용�(Swift와�어울리지�않음)�

- SwiftyJSON�라이브러리로�일일이�JSON�Parsing�(단순�반복�작업,�중복�코드)�

- 데이터�반환을�Callback을�이용함�(중복�코드,�클래스간�의존성)�

- MVC�Architecture�(Massive�View�Controller�문제)

Page 20: 파크히어 Realm 사용 사례

Realm을�잘�활용할�수�있도록�리팩토링하자!

Page 21: 파크히어 Realm 사용 사례

뷰�진입서버에�

데이터�요청JSON�Parse Realm�쓰기

Realm�읽기 UI�적용

목표

- 클래스간�의존도�낮춤�

- 중복�코드를�제거�

- 불필요한�노가다성�코드�제거

Page 22: 파크히어 Realm 사용 사례

리팩토링

- 바퀴를�다시�발명하지�말자�(라이브러리�적극�이용)�

- MVVM�아키텍처�사용�

- AFNetworking대신�Swift와�어울리는�Alamofire�사용�

- Model�데이터를�Mapping해주는�라이브러리�사용�(ObjectMapper)�

- Reactive�프로그래밍

Page 23: 파크히어 Realm 사용 사례

MVVM

- [Model�-�View�-�ViewModel]로�구성됨�

- Massive�View�Controller�문제�해결�

- View에�ViewModel를�바인딩하여�사용�(KVO)

Page 24: 파크히어 Realm 사용 사례

Alamofire

- https://github.com/Alamofire/Alamofire�

- HTTP�라이브러리�

- Custom�Response�Serializer�작성�가능

Page 25: 파크히어 Realm 사용 사례

ObjectMapper

- https://github.com/Hearst-DD/ObjectMapper�

- JSON�데이터를�Object에�맵핑해주는�라이브러리�

- Transform을�이용하여�다양한�데이터�타입�대응가능�

- Enum�값�처리�가능�(Raw�Value)�

- Realm�Object에도�사용�가능

Page 26: 파크히어 Realm 사용 사례

AlamofireObjectMapper

- https://github.com/tristanhimmelman/AlamofireObjectMapper�

- Alamofire의�Custom�Response�Serializer를�통해�구현됨�

- Response�Data를�바로�Object에�바인딩

Page 27: 파크히어 Realm 사용 사례

Step�By�Step으로�하나씩�적용해보겠습니다

Page 28: 파크히어 Realm 사용 사례

뷰�진입서버에�

데이터�요청JSON�Parse Realm�쓰기

Realm�읽기 UI�적용

Page 29: 파크히어 Realm 사용 사례

사용법은�매우�간단합니다

Page 30: 파크히어 Realm 사용 사례

사용법은�매우�간단합니다

받아온�데이터를�Realm에�Write

Page 31: 파크히어 Realm 사용 사례

사용법은�매우�간단합니다

ObjectMapper를�통해�간단하게�줄일�수�있다

Page 32: 파크히어 Realm 사용 사례

뷰�진입서버에�

데이터�요청JSON�Parse Realm�쓰기

Realm�읽기 UI�적용

Page 33: 파크히어 Realm 사용 사례

기존�코드 ObjectMapper�적용�코드

Page 34: 파크히어 Realm 사용 사례

기존�코드 ObjectMapper�적용�코드

추가된�코드

Page 35: 파크히어 Realm 사용 사례

기존�코드 ObjectMapper�적용�코드

추가된�코드

JSON의�Key값

Page 36: 파크히어 Realm 사용 사례

기존�코드 ObjectMapper�적용�코드

Page 37: 파크히어 Realm 사용 사례

기존�코드 ObjectMapper�적용�코드

AlamofireObjectMapper�라이브러리를�이용하여�Response를�받음과�동시에�오브젝트를�받을�수�있습니다

Page 38: 파크히어 Realm 사용 사례

JSON�객체�대신�Object,�Object�Array값을�받을�수�있습니다

Page 39: 파크히어 Realm 사용 사례

뷰�진입서버에�

데이터�요청JSON�Parse Realm�쓰기

Realm�읽기 UI�적용

Page 40: 파크히어 Realm 사용 사례

View�Controller�

View

View�Model

Model

MVVM

Update

Notify

User�Event

Update

Page 41: 파크히어 Realm 사용 사례

View�Controller�

View

View�Model

Model

MVVM

Update

Notify

User�Event

Update

Page 42: 파크히어 Realm 사용 사례

각각의�View마다�분리하여�사용

View�Controller�

View

View�Model

Model

MVVM

Update

Notify

User�Event

Update

Page 43: 파크히어 Realm 사용 사례

재사용이�가능합니다

View�Controller�

View

View�Model

Model

MVVM

Update

Notify

User�Event

Update

Page 44: 파크히어 Realm 사용 사례
Page 45: 파크히어 Realm 사용 사례

View�/�View�Controller

Page 46: 파크히어 Realm 사용 사례

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Page 47: 파크히어 Realm 사용 사례

View�Model

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Page 48: 파크히어 Realm 사용 사례

View�Model

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Init과�동시에�Area�정보를�Realm에서�가져옴

Page 49: 파크히어 Realm 사용 사례

View�Model

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Init과�동시에�Area�정보를�Realm에서�가져옴

Page 50: 파크히어 Realm 사용 사례

View�Model

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Init과�동시에�Area�정보를�Realm에서�가져옴

AreaService를�통해�Area�데이터�요청

Page 51: 파크히어 Realm 사용 사례

View�Model

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Init과�동시에�Area�정보를�Realm에서�가져옴

AreaService를�통해�Area�데이터�요청

Page 52: 파크히어 Realm 사용 사례

View�Model

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Init과�동시에�Area�정보를�Realm에서�가져옴

AreaService를�통해�Area�데이터�요청

Realm에�Response�Object를�Write

Page 53: 파크히어 Realm 사용 사례

View�Model

View�/�View�Controller

KVO를�통해�Model과�View를�바인딩

Init과�동시에�Area�정보를�Realm에서�가져옴

AreaService를�통해�Area�데이터�요청

Realm에�Response�Object를�Write

Notify

Realm�알림�기능을�통해�데이터�업데이트

Page 54: 파크히어 Realm 사용 사례

뷰�진입서버에�

데이터�요청JSON�Parse Realm�쓰기

Realm�읽기 UI�적용

Page 55: 파크히어 Realm 사용 사례

뷰�진입서버에�

데이터�요청JSON�Parse Realm�쓰기

Realm�읽기 UI�적용

Alamofire ObjectMapper

AlamofireObjectMapper

Realm�Notification

KVO

Page 56: 파크히어 Realm 사용 사례

뷰�진입서버에�

데이터�요청JSON�Parse Realm�쓰기

Realm�읽기 UI�적용

Alamofire ObjectMapper

AlamofireObjectMapper

Realm�Notification

KVO

원하던�흐름이�깔끔하게�구현되었습니다

Page 57: 파크히어 Realm 사용 사례

결론

- 이것저것�문제가�있던�소스를�Realm�적용과�함께�리팩토링�

- 여러�라이브러리를�이용하여�Realm을�쉽게�사용�

- Realm을�사용하여�UX적인�개선이�이루어짐�

- iOS�앱�개발을�처음�접할�때�알았으면�좋았을�내용

Page 58: 파크히어 Realm 사용 사례
Page 59: 파크히어 Realm 사용 사례

감사합니다

2016.�03.�31�이선협�/�ParkingSquare