올해 초에 우리는 속도, 명확한 경험, 그리고 미국 바깥의 우리 앱을 사용하는 피너(pinner)들을 위해 우리 앱의 새 구조를 짜게 되었다. 앱의 새로운 구조 조정 목표중 하나는 우리 앱을 완전히 불변 모델(Immutable model)로 바꾸는 것이었다. 이 포스팅에서는 이런 것에 대한 동기에대해 이야기하고, 우리의 새 시스템이 어떻게 모델 갱신을 다루는지 탐구해보며, API로부터 새로운 정보를 어떻게 불러오는지, 데이터 일관성에대해 이야기해 볼 것이다.

왜 불변 모델인가?
"불변  모델"이라는 말은 많은 앱들이 불변하게 바뀌면서부터 많이 들어본 용어이다. 불변성은 한번 초기화 되고 나면 더이상 수정되지 않음을 의미한다. 왜 우리는 이것을 선택하게 되었을까? 음, 가변성에서의 주된 문제는 공유된 상태에 있다.

이런식으로 생각해보자: 가변 모델 시스템에서 A와 B 둘 다 C를 참조하고 있는다.



만일 A가 C를 수정하면 A와 B 둘 다 바뀐 값을 보게 될 것이다. 여기까지는 괜찮지만 만일 B가 이러한 것을 예상하지 못하고 있다면 의도치 않은 일이 일어날 수 있다.

예를들어 내가 두명의 사용자와 함께  메시지 스레드에 있다. 나는 '사용자' 프로퍼티와 함께 메시지 오브젝트를 가지고 있다.

내가 이 화면에 있을 동안 앱의 다른 부분에서 Devin 대화를 제거하기로 했다(아마 바뀐 서버 응답을 받고 모델을 변경할 것이다). 이제 두번째 사람을 탭할때, 나는 두번째 오브젝트를 찾기 위해 message.users 배열을 확인해 볼것이다. 그러면 Devin 대신 Stephanie를 반환하고 잘못된 사람을 보게 된다.

불변 모델은 태생적으로 스레드 세이프하다. 이전에는 다른 곳에서 그것을 읽고 있는 동안 한 스레드가 그 모델에 쓰기라도 하는 것을 항상 신경써야했다. 우리 새로운 시스템에서는 오브젝트가 한번 초기화되고나면 더이상 수정될 수 없으며, 따라서 언세이프한 값을 읽는 것을 걱정없이 다중 스레드로 동시에 읽을 수 있게 되었다. 이것이 우리 iOS 앱을 더 동시적이고 다중스레드에 강하게 해줌으로서 쉽게 작업할 수 있게 해주었다.

모델 갱신하기
생성된 후에는 우리 모델이 완전히 불변하므로, 모델을 갱신/변경하는 유일한 방법은 새로운 오브젝트를 생성하는 방법 뿐이다. 이것을 위해 두가지 방법이 있다.
  • (보통 JSON 응답으로부터) 딕셔너리를 사용하여 모델을 초기화한다.
  • "builder" 오브젝트를 사용하는데, 이것은 그냥 모든 프로퍼티를 받아다가 필요한것만 변경하는 방식이다. 기존에 만들어놓은 모델로부터 빌더를 만든 뒤, 우리가 필요한 프로퍼티만 변경하고, initwithBuilder를 호출하여 새로운 모델을 받는다. (이것에 대해서는 나중에 새 포스팅에서 설명하겠다)

 API 데이터를 불러오고 캐싱하기
우리 API는 서버로부터 모델 필드의 부분집합과 함께 부분적인 JSON 모델을 요청할 수 있게 해두었다. 예를들어 핀 피드 화면에서 이미지 URL과 설명과 같은 필드가  필요하지만, 모든 정보가 필요하지는 않았다. 요리법 요소에서 사용자가 그 핀 화면에 들어가기 전까지 말이다. 이러한 방식은 우리가 보내는 엄청난 양의 데이터를 자르는데 도움을 주고, 게다가 백엔드에서 처리 시간도 단축된다.

우리는 PINCache로 만든 주요한 모델 캐시를 가지고 있는데, 이 오브젝트 캐시는 iOS를 위해 오픈소스로 만들었다. 이 캐시의 핵심은 유일함인데, 모델의 서버 쪽 ID이다. 우리가 새로운 서버 응답을 받을 때 현재 모델의 캐시를 확인한다. 만일 현재 모델이 발견되면 현재 모델의 프로퍼티들과 서버 응답의 필드들을 합쳐서 새로운 모델을 만든다. 이 새로운 모델은 캐시에 저장되있던 것과 대체된다. 이렇게 하면 캐싱된 모델은 항상 우리가 받은 가장 최신의 필드를 유지할 수 있다.



데이터 일관성
모델이 수정된 후(새로운 모델이 생성되고나면), 그 수정은 모델을 보여주는 그 화면에 반영된다. 이전에는 Key-Value Observing를 사용하였지만 KVO는 오직 한 모델 인스턴스의 변화만을 관찰하기 때문에 불변 오브젝트에는 적용되지 않았다. 이제 우리는 NSNotificationCenter-기반 시스템으로 그 변화를 알리고 있다.

변화를 관찰하기
뷰나 뷰컨트롤러는 모델에 갱신 알림을 등록해 놓을 수 있다. 이 예제에서는 MessageViewController가 그 메시지 모델의 갱신을 등록한다. 새로운 모델에 프로퍼티 갱신이 일어날 수 있기 때문에 새 메시지 모델이 생성되면 알림을 받고 싶다.


아래는 메시지 모델의 이름+고유id로 갱신된 모델을 듣고 있는(listen) 옵저버를 만드는 코드이다. 메소드는 block-기반 NotificationCenter API를 사용함으로서 옵저버 라이프타임 관리를 더 잘 할 수 있었다.
notificationManager는 등록된 옵저버들을 강타입으로 붙잡아 둔 NSObject이다. 뷰컨트롤러 프로퍼티여서 뷰컨트롤러의 소멸자(dealloc)가 호출되고 나서 그것을 소멸시키는데 모든 옵저버의 등록을 해지시킨다.

변화들을 보내기
메시지 모델이 갱신될 때, 갱신 알림이 보내진다.
postModelUpdatedNotificationWithObject:는 같은 클래스+서버id의 가장 최신 모델을 위해 모델 캐시를 확인하고, 캐시되어있는 모델 인스턴스를 보낸다.

UI 갱신 만들기
알림이 발생하면 NSNotification의 "object" 필드로 새로 모델을 보낸다. 그러면 뷰컨트롤러는 갱신된 모델을 사용해 그것을 갱신시킨다.

마지막으로
규모가 있는 앱의 전반적인 모델을 바꾸는 것이 쉬운 작업은 아니었다. 그리고 우리는 이러한 방법을 도와줄 좋은 도구를 만들어냈다. 다음 포스팅에서 우리가 어떤 방식으로 모델 클래스와 그 이상을 자동 생성했는지 설명할 것이다.

감사: 이 새로운 모델을 사용해주고 피드백을 준 모든 iOS 개발자에게 감사의 말을 전하면서, 특히 내 팀의 Rahul Malik, Chris Danford, Garrett Moon, Ricky Cancro, Scott Goodson, 그리고 Bella You, Rocir Santiago, Andrew Chun에게 고맙다. 




WRITTEN BY
tucan.dev
개인 iOS 개발, tucan9389

받은 트랙백이 없고 , 댓글이 없습니다.
secret

안녕하세요. 아이폰 앱 개발자 카나피오입니다. 저는 지난 3년간 아이폰 앱 개발을 하면서 모았던 유용한 링크를 공유합니다. 대부분 실제로 사용하고 있는 링크를 선별했고, 필요 없는 링크는 제외했습니다. 또한 최대한 자료를 무료로 제공받을 수 있는 링크만 뽑아보았습니다. 혹시 좋은 링크가 있다면 댓글에 달아주세요! 서로 공유하면 좋으니까요.


디자인 참고
Dailygood Design
디자인 관련 링크 모음 사이트. 유명한 디자인 사이트를 모아놓은게 아니라 필수적인 디자인 사이트를 모아놓았다. 디자인 사이트를 모아놓은 사이트조차 예쁘다. 나는 즐겨찾기 해놓고 종종 들어간다.

Dribbble
앱이나 웹의 UI를 참고할 수 있는 디자인 웹 커뮤니티 사이트. 내가 가장 애용하는 디자인 참고 사이트이기도 하다. 보통 앱 개발을 시작할 때 이 사이트를 켬으로써 화면 기획을 시작하기도 한다. UX보다는 UI 디자인이 많다. 예쁘다.

Pinterest
영감을 얻기 위한 사이트. 앱, 웹, 제품 등등 온갖 디자인들이 있다. 더 나아가 영감을 얻을 수 있는 다양한 작품들도 있다. 카테고리도 다양하게 있어서 자신의 취향에 맞게 팔로우하여 볼 수 있고 자신이 저작권에 상관없이 자료들을 모을 수도 있다.

Behance
어도비사가 만든 디자인 커뮤니티 사이트. 어도비의 지원을 빵빵하게 받는 만큼 자료가 많다. (근데 웹사이트가 좀 느리다ㅠ)

Vimeo
영상 디자인 참고 사이트. 작품성 있는 영상 자료들이 많이 올라가있다. 유튜브와 비슷하지만 용도는 조금 다르다. 훨씬 질 좋은 영상 자료들이 올라가있고 고품질을 지향한다. 나는 앱개발 영상을 제작할 때 주로 사용하며, 앱개발시 모션 그래픽을 참고하기도 한다.


디자인 리소스
Noun Project
아이콘 모음 사이트. 온갖 아이콘이 많이 있다. 하악하악


개발
Google Play Console
구글 개발자 페이지.

iTunes Connect
애플 개발자 페이지.


통계
App Annie
개발자 계정을 연결하여 자신의 앱(또는 다른 앱)의 실시간(1시간 정도의 시간차가 있습니다.) 순위권이나 다운로드 수, 수익, 사용자 리뷰, 앱스토어 피쳐드 등등의 퍼블리싱 정보를 얻을 수 있다.

구글 어널리틱스
구글에서 제공하는 서비스 분석기. 자신의 앱에 코드를 심어 놓으면 실시간 사용자나 누적 사용자, 활성 사용자 등 다양한 사용자 정보의 통계를 확인 할 수 있다. 화면 전환이나 이벤트 등을 등록해놓고 사용자가 얼만큼의 빈도로 이벤트를 발생시키는지 알 수 있다.


참고
아이콘 메이커
1024*1024 크기의 아이콘을 넣으면 개발에 쓰이는 아이콘 크기별로 뽑아준다. 이게 겁나 편하다. 안드로이드, 아이폰, 아이패드, 애플워치 등등 해당 디바이스의 아이콘을 다 뽑아준다.

iOS 폰트 리스트

애플 앱스토어 리뷰 시간
http://appreviewtimes.com/
애플 앱스토어의 앱 리뷰 대기 시간을 평균 내어주는 사이트.


추가
유용한 사이트 모음
https://github.com/etdot/bookmark
좀 더 다양한 사이트 모음. 



WRITTEN BY
tucan.dev
개인 iOS 개발, tucan9389

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. '유용한 사이트 모음' 주소가 바뀌었습니다~!
    https://github.com/5pid/bookmark
secret