프레임워크는 정해진 틀에 코드를 넣으면 시스템이 약속된 기능을 작동시켜주는건데, 이 개념에 맞는지는 좀 더 살펴봐야겠습니다.
RIB을 작성하는 템플릿이 있지만 프로그래머가 직접 관계를 지정해줘야하는 면에서 라이브러리라고 볼 수 있는건 아닐까? 하는 생각은 들었습니다.
우버를 위해 이 프레임워크를 디자인 했을때, 다음 원칙을 고수함:
크로스 플랫폼 협력을 독려함
iOS와 Android 앱에서 대부분의 복잡한 부분은 비슷함
RIB는 iOS와 Android에 비슷한 개발 패턴을 제공함
의문점
아키텍처가 통일된다고 해서 서로의 코드를 공유하는 일이 있을까? 하는 의문이 들기는 합니다.
아키텍처가 달라서 문제가 되는 부분이 있을지 의문도 들었습니다.
모바일 팀 매니저 입장에서는 관리하기 편하겠다는 생각도 듭니다.
여러 플랫폼에서 동일한 아키텍처를 적용하는 시도를 아직 못해봤는데, 일단 한번 경험해보고 싶다는 생각이 들었습니다.
전역 상태와 결정을 최소화
전역 상태를 변경하시는 것은 예측하지 못한 행동을 불러일으킬 수 있음
계층화된 RIB들에 상태값을 캡슐화 하도록 함
테스트 및 격리
클래스는 유닛 테스트 하기 쉬워야 함
클랫스는 독립적으로 추론 가능해야 함
독립된 RIB는 고유한 책임을 가짐
부모 RIB 로직은 하위 RIB 로직으로 부터 대부분 분리됨
대부분? 예외로 안되는 경우도 있나보다
개발자 생산성을 위한 도구 제공
코드 생성
정적 분석
런타임 통합
이건 뭐지?
개방 폐쇄 원칙
개발자가 기존 코드 수정 없이 새로운 기능을 추가할 수 있어야 한다
부모 RIB에 의존성이 필요한 child RIB을 코드 변경 없이 attach 또는 build 할 수 있다
비즈니스 로직을 중심으로 구조화
비즈니스 로직이 UI 구조를 반영할 필요는 없음
애니메이션 & View 퍼포먼스를 높이기 위해서 View 구조는 RIB 구조보다 얕은 계층 구조로 만들 수 있음
또는 하나의 RIB이 다른 여러 UI를 컨트롤 할 수 도 있음
의문점
View에 비즈니스 로직을 가두는 구조가 아닌건 흥미로움
그러나 이런 케이스가 얼마나 있을까 하는 의구심도 생김
구체적인 예를 볼 수 있으면 좋겠습니다.
명시적 계약(Contracts)
요구사항들은 컴파일 타임 계약으로 명시되어야 함
클래스와 순서에 대한 의존성이 만족되지 않으면 클래스는 컴파일 되지 않아야 함
순서에 대한 의존성은 무엇일까? Ordering dependencies
순서 의존성(ordering dependency)을 표현하기 위해 ReactiveX를 사용함
이 부분 무슨말인지 하나도 모르겠음... 나중에 다시 읽어볼 것We use ReactiveX to represent ordering dependencies, type safe dependency injection (DI) systems to represent class dependencies and many DI scopes to encourage the creation of data invariants.
RIB 구성 요소
VIPER 아키텍처를 사용하고 있었다면 RIB의 클래스들이 익숙할 것임
Interactor
비즈니스 로직이 담겨짐
Rx subscription을 수행하는 곳
이건 뭔지 잘 모르겠음
상태 변경을 결정함
어떤 데이터를 어디에 저장할지 결정함
어떤 child RIB이 attach 되어야할지 결정함
Router
Router는 Interactor의 Output을 듣고 자식 RIB을 attach 또는 detach 하는 것으로 변환 시켜줌
아래 3가지 이유로 존재함
1. Router는 Humble Object로 기능한다. Child interactor를 mock 하거나 신경쓰지 않고서, 복잡한 Interactor 로직을 테스트하기 편하게 하기 위한 역할.