파크히어 realm 사용 사례
TRANSCRIPT
파크히어 Realm 사용 사례
2016.�03.�31�이선협�/�ParkingSquare
발표자�소개
- 이선협�/�KC�
- NHN�NEXT�
- 파킹스퀘어에서�iOS�개발�담당�
- 산업기능요원으로�복무�중�
- https://github.com/kciter�
- https://medium.com/@kciter
파크히어�소개
- 주차�예약�서비스�
- 합리적인�가격으로�내�주차�자리를�보장�
- iOS,�안드로이드,�모바일웹,�PC웹�
- http://www.parkhere.co.kr/
목차
- Why�Realm?�
- 어떻게해야�Realm을�잘썼다고�소문이�날까?�
- 기존�파크히어�로직의�문제점�
- 리팩토링�
- 하나씩�살펴보기�
- 네트워크�로직�
- 오브젝트�맵핑�
- MVVM�
- 결론�
- Q�&�A
목차
- Why�Realm?�
- 어떻게해야�Realm을�잘썼다고�소문이�날까?�
- 기존�파크히어�로직의�문제점�
- 리팩토링�
- 하나씩�살펴보기�
- 네트워크�서비스�
- 오브젝트�맵핑�
- MVVM�
- 결론�
- Q�&�A
- iOS�앱�개발을�처음�접할�때�알았으면�좋았을�내용iOS�앱�개발을�처음�접할�때�알았으면�좋았을�내용!!!�을�위주로�담았습니다
PARK�HERE는�왜�Realm을�사용했을까요?
Why�Realm?1.�좋은�성능
- SQLite,�Core�Data보다�좋은�성능을�보여줌
Why�Realm?2.�편리한�사용성
- 설치와�사용이�쉬움�
- 쉽게�데이터�모델�정의�가능�
- 간단하게�관계�설정�가능�
- 0.96�업데이트로�NULL�속성도�지원�
- Core�Data보다�러닝커브가�적고�사용하기�쉬움
Why�Realm?3.�오픈소스
- 계속해서�발전하는�오픈소스�
- 꾸준히�새로운�기능�추가�중
Why�Realm?4.�Core�Data는�불편해보였다…
- 데이터�모델�파일을�따로�만들어야함
Why�Realm?4.�Core�Data는�불편해보였다…
- 데이터�모델�파일을�따로�만들어야함�
- 사용법이�Realm에�비해�복잡하다
Core Data Realm
데이터 불러오는 코드
Why�Realm?4.�Core�Data는�불편해보였다…
- 데이터�모델�파일을�따로�만들어야함�
- 사용법이�Realm에�비해�복잡하다�
- Learning�Curve가�크다
Why�Realm?4.�Core�Data는�불편해보였다…
- 데이터�모델�파일을�따로�만들어야함�
- 사용법이�Realm에�비해�복잡하다�
- Learning�Curve가�크다�
- 별도로�구현해야할�기능들이�Realm에�구현되어�있다(Notification,�Realm().add(_:update:)�등)
Why�Realm?4.�Core�Data는�불편해보였다…
- 데이터�모델�파일을�따로�만들어야함�
- 사용법이�Realm에�비해�복잡하다�
- Learning�Curve가�크다�
- 별도로�구현해야할�기능들은�Realm에�있다�(Notification,�Realm().add(_:update:)�등)
객체화하여�사용하거나�MagicalRecord같은�라이브러리를�이용해도�좋지만�이미�필요한�기능이�구현되어있고�성능도�더�좋은�Realm을�사용하기로�결정했습
니다.
어떻게�Realm을�써야�잘썼다고�소문이날까?
기존�파크히어�로직
뷰�진입서버에�
데이터�요청JSON�Parse UI�적용
Realm�적용�전
기존�파크히어�로직Realm�적용�전
뷰�진입서버에�
데이터�요청JSON�Parse UI�적용
AFNetworking SwiftyJSON Callback
- 첫�iOS�앱�제작�경험�
- AFNetworking�사용�
- SwiftyJSON�라이브러리로�일일이�JSON�Parsing�
- 데이터�반환을�Callback을�이용함�
- MVC�Architecture
기존�파크히어�로직Realm�적용�전
뷰�진입서버에�
데이터�요청JSON�Parse UI�적용
AFNetworking SwiftyJSON Callback
- 첫�iOS�앱�제작�경험�(경험�미숙으로�잘못된�구조�작성)�
- AFNetworking�사용�(Swift와�어울리지�않음)�
- SwiftyJSON�라이브러리로�일일이�JSON�Parsing�(단순�반복�작업,�중복�코드)�
- 데이터�반환을�Callback을�이용함�(중복�코드,�클래스간�의존성)�
- MVC�Architecture�(Massive�View�Controller�문제)
기존�파크히어�로직Realm�적용�전
뷰�진입서버에�
데이터�요청JSON�Parse UI�적용
AFNetworking SwiftyJSON Callback
- 첫�iOS�앱�제작�경험�
- AFNetworking�사용�(Swift와�어울리지�않음)�
- SwiftyJSON�라이브러리로�일일이�JSON�Parsing�(단순�반복�작업,�중복�코드)�
- 데이터�반환을�Callback을�이용함�(중복�코드,�클래스간�의존성)�
- MVC�Architecture�(Massive�View�Controller�문제)
Realm을�잘�활용할�수�있도록�리팩토링하자!
뷰�진입서버에�
데이터�요청JSON�Parse Realm�쓰기
Realm�읽기 UI�적용
목표
- 클래스간�의존도�낮춤�
- 중복�코드를�제거�
- 불필요한�노가다성�코드�제거
리팩토링
- 바퀴를�다시�발명하지�말자�(라이브러리�적극�이용)�
- MVVM�아키텍처�사용�
- AFNetworking대신�Swift와�어울리는�Alamofire�사용�
- Model�데이터를�Mapping해주는�라이브러리�사용�(ObjectMapper)�
- Reactive�프로그래밍
MVVM
- [Model�-�View�-�ViewModel]로�구성됨�
- Massive�View�Controller�문제�해결�
- View에�ViewModel를�바인딩하여�사용�(KVO)
Alamofire
- https://github.com/Alamofire/Alamofire�
- HTTP�라이브러리�
- Custom�Response�Serializer�작성�가능
ObjectMapper
- https://github.com/Hearst-DD/ObjectMapper�
- JSON�데이터를�Object에�맵핑해주는�라이브러리�
- Transform을�이용하여�다양한�데이터�타입�대응가능�
- Enum�값�처리�가능�(Raw�Value)�
- Realm�Object에도�사용�가능
AlamofireObjectMapper
- https://github.com/tristanhimmelman/AlamofireObjectMapper�
- Alamofire의�Custom�Response�Serializer를�통해�구현됨�
- Response�Data를�바로�Object에�바인딩
Step�By�Step으로�하나씩�적용해보겠습니다
뷰�진입서버에�
데이터�요청JSON�Parse Realm�쓰기
Realm�읽기 UI�적용
사용법은�매우�간단합니다
사용법은�매우�간단합니다
받아온�데이터를�Realm에�Write
사용법은�매우�간단합니다
ObjectMapper를�통해�간단하게�줄일�수�있다
뷰�진입서버에�
데이터�요청JSON�Parse Realm�쓰기
Realm�읽기 UI�적용
기존�코드 ObjectMapper�적용�코드
기존�코드 ObjectMapper�적용�코드
추가된�코드
기존�코드 ObjectMapper�적용�코드
추가된�코드
JSON의�Key값
기존�코드 ObjectMapper�적용�코드
기존�코드 ObjectMapper�적용�코드
AlamofireObjectMapper�라이브러리를�이용하여�Response를�받음과�동시에�오브젝트를�받을�수�있습니다
JSON�객체�대신�Object,�Object�Array값을�받을�수�있습니다
뷰�진입서버에�
데이터�요청JSON�Parse Realm�쓰기
Realm�읽기 UI�적용
View�Controller�
View
View�Model
Model
MVVM
Update
Notify
User�Event
Update
View�Controller�
View
View�Model
Model
MVVM
Update
Notify
User�Event
Update
각각의�View마다�분리하여�사용
View�Controller�
View
View�Model
Model
MVVM
Update
Notify
User�Event
Update
재사용이�가능합니다
View�Controller�
View
View�Model
Model
MVVM
Update
Notify
User�Event
Update
View�/�View�Controller
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
View�Model
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
View�Model
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
Init과�동시에�Area�정보를�Realm에서�가져옴
View�Model
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
Init과�동시에�Area�정보를�Realm에서�가져옴
View�Model
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
Init과�동시에�Area�정보를�Realm에서�가져옴
AreaService를�통해�Area�데이터�요청
View�Model
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
Init과�동시에�Area�정보를�Realm에서�가져옴
AreaService를�통해�Area�데이터�요청
View�Model
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
Init과�동시에�Area�정보를�Realm에서�가져옴
AreaService를�통해�Area�데이터�요청
Realm에�Response�Object를�Write
View�Model
View�/�View�Controller
KVO를�통해�Model과�View를�바인딩
Init과�동시에�Area�정보를�Realm에서�가져옴
AreaService를�통해�Area�데이터�요청
Realm에�Response�Object를�Write
Notify
Realm�알림�기능을�통해�데이터�업데이트
뷰�진입서버에�
데이터�요청JSON�Parse Realm�쓰기
Realm�읽기 UI�적용
뷰�진입서버에�
데이터�요청JSON�Parse Realm�쓰기
Realm�읽기 UI�적용
Alamofire ObjectMapper
AlamofireObjectMapper
Realm�Notification
KVO
뷰�진입서버에�
데이터�요청JSON�Parse Realm�쓰기
Realm�읽기 UI�적용
Alamofire ObjectMapper
AlamofireObjectMapper
Realm�Notification
KVO
원하던�흐름이�깔끔하게�구현되었습니다
결론
- 이것저것�문제가�있던�소스를�Realm�적용과�함께�리팩토링�
- 여러�라이브러리를�이용하여�Realm을�쉽게�사용�
- Realm을�사용하여�UX적인�개선이�이루어짐�
- iOS�앱�개발을�처음�접할�때�알았으면�좋았을�내용
감사합니다
2016.�03.�31�이선협�/�ParkingSquare