Posts 내 맘대로 용어사전 🥸
Post
Cancel

내 맘대로 용어사전 🥸

분야를 막론하고 모든 용어를 습득한 순서대로 적습니다. 내 맘대로. 🙄

SRP

single-responsibility-principle: 하나의 클래스는 프로그램의 하나의 기능에 대한 책임만을 가지게 하는 설계 원칙

Cocoa MVC

Model-View-Controller

애플 UIKit의 MVC 패턴. View, Controller가 결합도가 너무 높음. Massive View Controllers 문제가 생김. 왜? Controller 역할이 너무 많음. 뷰마다 controller 하나씩 필요함

MVP

Model-View-Presenter

Cocoa MVC의 View와 View Contorller가 너무 붙어있으니 Presenter라는 View와 연관이 1도 없는 중간자를 만들어서 진짜 MVC를 구현

MVVM

Model-View-ViewModel

ViewModel이 Presenter처럼 Model을 소유하고 업데이트 하는 것은 변함이 없으나 View와 Data Binding이 이루어져 있다. 여기서 RxSwift, RxCocoa 등장! Binding 제공해줌. SwiftUI에서는 외부 라이브러리 없이 Binding 사용 가능

VIPER

View-Interactor-Presenter-Entity-Router

  • View: UIView, UIViewController
  • Interactor: 비즈니스 로직 중 데이터, 네트워킹과 같은 로직을 담당.
  • Presenter: 비즈니스 로직 중 UI관련 로직 담당
  • Entity: 데이타 객체 그 자체
  • Router: view navigation 로직 담당

RIBs

Router-Interactor-Builder-Component-Presenter-View (이 왜 s??? RIB가 중요하기 때문)

비즈니스 로직 중심의 앱 흐름을 만들기 위해 Router를 View 로직 중심이 아닌 비즈니스 로직 중심으로 설계한 것이 VIPER와의 차이점.

View, Presenter는 view Logic 을 담당하고 Optional 하다. 핵심은 RIB! (Router-Interactor-Builder)

  • Interactor: 비즈니스 로직 담당. Rx 구독, state변경, 데이터 저장 위치 선택, 다른 RIBs 가 하위에 붙을 지 결정 등의 일을 함. 모든 작업은 스스로의 lifecycle 내에 끝나야 함.
  • Router: Interactor의 output을 보고 하위 RIB들을 붙이고 떼는 작업으로 변환해줌. Interactor 사이의 추상화된 레이어. RIB간의 결합도 낮춰줌. Interactor 내의 반복되는 routing logic을 Router에 빼기 때문에 Interactor는 더욱 비즈니스 로직에만 집중 가능
  • Builder: RIB을 구성하는 모든 class 들을 인스턴스화 하고 하위 RIB들의 Builder들도 인스턴스화 함. Builder만이 DI system에 대해서 알고 담당해야함.
  • Presenter: stateless한 class. 비즈니스 Model을 View Model로 바꿔주고 그 반대로도 바꿔줌. View Model 변환을 쉽게 만들어주는 역할 딱 그정도만 담당해야함. 이 변환이 너무 명확하면 불필요. 이 때 변환하는 역할은 View 혹은 Interactor가 담당
  • View: UI 만들고 업데이트. 최대한 멍청하게 유지
  • Component: RIB의 의존성 관리를 위해 사용. 외부 의존성에 대한 접근 제공. 보통 부모 RIB의 Component는 자식 RIB의 Builder에 주입됨.

+ State Management

앱 state는 RIB tree에 붙어있는 RIBs로 관리. 각 RIB은 자신의 바로 한단계 하위 state 변경만 결정할 수 있음.

그렇다면 RIB의 변경과 관련이 없는 state들은? ex) 유저 프로파일 세팅 변경

답 ) immutable models stream에 저장함. 예를들어 유저 이름은 LoggedIn RIB 내의 ProfileDataStream에 저장될 수 있음

This post is licensed under CC BY 4.0 by the author.