핀터레스트의 데이터 레이어 재설계에서 배우는 데이터 일관성 유지하기

rbw·2022년 12월 18일
0

TIL

목록 보기
55/98

참조

https://academy.realm.io/kr/posts/slug-wendy-lu-data-consistency/

위 게시글을 보고 정리한 글 자세한 내용은 위 링크 참조 바람당


변경 불가능한 모델

앱에서 동시성과 멀티 스레드 기능에 대한 요구가 증가할수록, 앱의 기본이 되는 모델 계층을 자 구성해야 합니다. 변경 가능한 시스템에서는 같은 값을 참조하고 있는 두 개의 뷰 컨트롤러가 있으면, 두 번째 뷰 컨트롤러가 이를 읽는 동안 첫 번째 뷰 컨트롤러가 이 값에 대해 쓰는 동작을 수행한다면, 두 번째 뷰 컨트롤러는 정확하지 않은 값을 읽어들일 가능성이 존재하며 이는 앱 크래쉬의 원인이 될 수도 있습니다.

모델 갱신하기

모델을 바꿀 수 없게 되었는데, 어떻게 모델을 갱신하거나 변경할 수 있을까요 ? 변경 불가능 시스템에서는 모델들은 한 번 생성되고 나면 변경할 수 없으며, 모델을 갱신할 수 있는 유일한 방법은 모델 객체의 새로운 인스턴스를 생성하는 방법밖에는 없습니다.

Builder 객체를 이용한 모델 갱신

모델을 업데이트 하는 또 다른 방법은 Builder객체를 이용하는 것입니다. 이는 모델 필드에 저장된 것을 모두 가지고 있는 모델을 변경 가능한 모델로 표현하는데 사용되는 일반적인 방식입니다.

let pin = Pin(builder: pinBuilder)

// Pin(Immutable)
imageURL = "https://www.123.com"
title = "The best pin in the world"
board = "Cute Cats"

// PinBuilder(Mutable)
imageURL = "https://www.123.com"
title = "Meow"
board = "Cute Cats"

Pin Bulider는 변경 가능하기 때문에 어떤 것이든 요구조건에 맞게 수정할 수 있습니다.

변경 사항 관찰(Observe)

이전 변경 가능한 시스템에서는 KVO를 사용했다고 함. 하지만 변경 불가능한 시스템에서는 사용이 x. 왜냐하면 변경 불가능한 시스템에서는 변하지 않는 모델 객체에 대한 1개의 인스턴스만 관찰할 수 있으며, 이 모델은 변하지 않기 때문이다.

핀터레스트에서 모델 변경 사항을 알리기 위해 선택한 것은 NSNotification기반 시스템이다.

NotificationManager라고 불리는 헬퍼 클래스를 통해 이러한 작업을 처리하고 있다. 이는 모델 갱신 여부를 관찰하기 위해 addObserverForUpdatedModel메서드를 제공하며, 이 메서드는 NotificationCenteraddObserver메서드를 호출하는 역할을 담당한다.

질의응답시간

나도 궁금했던 부분인데, RxSwift를 채택하지 않은 이유로 36명 이상으로 구성된 개발팀이 RxCocoa, RxSwift를 익히려면 상당한 시간이 소요될 것으로 판단했다고함. 언젠가는 이것을 사용할 수도 있을것이라고 하심. 지금은 사용하고 있을거같긴함

다른 질문으로 이런 변경 불가능 시스템 모델은 UI에 사용하고 있다고 함. 그리드에 있는 모든 Pin Cell의 경우, 셀을 구성할 수 있는 setPin이라는 메서드를 가지고 있다고 함. 어떤 곳에서는 뷰 모델을 사용하고 있지만, 대부분의 경우 모델을 직접 사용한다네요

profile
hi there 👋

0개의 댓글