[Architecture] RIBs

E_H·2021년 11월 4일

Ribs란

Ribs는 우버에서 만든 croess-platform 아키텍처 프레임워크입니다.
Ribs 아키텍처는 다음과 같은 이점을 제공합니다.

  • iOS 및 안드로이드의 아키텍처 공유
    iOS와 안드로이드 팀이 비즈니스 논리 코드를 교차 검토할 수 있습니다.

  • 테스트 가능성 및 분리
    Class는 Unit Test가 쉬워야합니다.
    개별 RIB클래스에는 별도의 책임이 있는데
    routing, business, view logic, creation 등이 있습니다.
    대부분의 RIB로직은 자식 RIB 로직과 분리되어(decoupled) 있습니다.
    따라서 RIB 클래스는 독립적으로 테스트하고 추론하기 쉽습니다.

  • 개발 생산성을 위한 툴링
    RIB는 코드 생성, 메모리 누수 감지, 정적 분석 및 런타임 통합과 관련된 IDE 툴링과 함께 제공됩니다.

  • 확장 가능한 아키텍처
    동일한 코드베이스와 RIB를 사용하는 애플리케이션에서 수백 명의 엔지니어와 협업이 가능하다는 것이 입증되었습니다.

Ribs 구조, 개념

  • (Required)
    • Router: RIB이 어떻게 attach, detach될 것인지 (animation)
    • Interactor: 비즈니스 로직 관리, 어떤 RIB들을 attach, detach 할지 명령
    • Builder: RIB 생성 (Mock에 유리)
  • (Optional)
    • View: layout, animation
    • Presenter: translation logic(Interactor <-> View)View로직이 필요할 때만 추가되는 컴포넌트

Interactor

  • 비즈니스 로직 담당
    Rx subscriptions, 상태 변경을 결정하고, 데이터를 저장할 위치와
    다른 Rib을 자식으로 붙일지 결정합니다.

인터랙터가 수행하는 모든 작업은 라이프사이클에 국한되어야 합니다.
인터랙터가 활성화된 경우에만 비즈니스 로직을 실행할 수 있도록 구축되었기에
인터랙터가 비활성화되면 구독이 계속 실행되어 비즈니스 논리 또는 UI 상태가 원치 않는 업데이트되는 시나리오를 방지할 수 있습니다.

Router

Router는 Interactor를 수신, 출력을
하위 RIB를 부착(attaching) 및 분리(detaching)하는 것으로 변환합니다.
Router는 세 가지 이유로 존재합니다.

  • Humble Objects 로서 하위 Interactor를 mock하거나
    그 존재에 대해 신경 쓸 필요없이 복잡한 Interactor 로직을 쉽게 테스트 할 수 있습니다.

  • 상위 Interactor와 하위 Interactor 사이에 추가 추상화 계층을 생성합니다.

  • Router에는 interactor가 구현할 수 있는 단순하고 반복적인 라우팅 로직이 포함되어 있습니다.

Builder

Builder의 책임은 RIB의 각 클래스 구성요소
각 Ribs children의 Builder를 인스턴스화 하는 것입니다.
Builder는 프로젝트에서 사용된 DI 시스템을 인식해야하는 RIB의 유일한 부분입니다.
다른 Builder를 구현하면 다른 DI 메커니즘을 사용하여 프로젝트에서 나머지 RIB코드를 재사용 할 수 있습니다.

Presenter

비즈니스 모델을 ViewModel 또는 그 반대로 변환합니다.
ViewModel의 테스트를 용이하게 만들 수 있습니다.
Presenter가 생략되면 ViewModel변환은 View(Controller) 또는 Interactor의 책임이 됩니다.

View(Controller)

View는 UI를 빌드하고 업데이트합니다.
여기에는 UI component 인스턴스화 및 배치, 사용자 상호 작용 처리, UI components 채우기 및 애니메이션이 포함됩니다.
View는 단지 정보를 표시할 뿐입니다.
일반적으로 Unit Test가 필요한 코드는 포함되어 있지 않습니다.

Component

Component는 RIB dependency를 관리하는데 사용됩니다.
RIB을 구성하는 다른 Unit을 인스턴스화하여 Builder를 지원합니다.

  • RIB을 구축하는데 필요한 외부 종속성에 대한 액세스를 제공
  • RIB자체에서 생성된 종속성을 소유
  • 다른 RIB에서 위에 대한 액세스 제어

참고

https://github.com/uber/RIBs
https://zeddios.tistory.com/937

0개의 댓글