-
ios 개발 아키텍쳐 MVC, MVVMSwift/아키텍쳐 2019. 11. 20. 15:14
아주 예전 처음 시작할때 적었던 패턴 공부... 추후 다시 올려보겠습니다.
처음 어플리케이션은 MVC 구조, 그 다음 애플리케이션은 MVVM으로 결정해 아키텍쳐를 구성했습니다.
이에 대해 말하기 전에, swift의 경우 헷갈릴 수도 있는 부분이 있습니다.
꼭 이해가 필요한 점은 UIViewController 와 UIView가 뷰로 분류된다는 점입니다. 뷰 라이프 사이클과 강력하게 연결되어 있으므로 UIViewController는 뷰 계층으로 분류합니다.
처음 MVC 구조를 선택하게 된 이유
- RxSwift를 사용하고 있지 않았다. (이때 Swift, 데이터 바인딩 관점에서 Rx처럼 효과적으로 바인딩하기 어렵다고 생각했다)
- 기존에 리팩토링 기반이 되는 앱이 아키텍쳐가 없었다. (아키텍쳐를 도입하는것 부터 중요했음)
정말 정확하게 위의 그림을 토대로 설계했었다.
++
1. 공용화 부분을 고려한다.
공통적으로 ScrollView를 포함한 모든 화면은 BaseScrollView를 상속받는다 던지,
NavigationController를 Custom해서 사용하는점. 모든 화면의 스택관리를 어떤식으로 진행할지 정하고 시작하였습니다.
2. 공통 Component는 모두 Custom한다.
버튼, 라벨등 대부분의 컴포넌트를 모두 커스텀해서 가지고 있는것이 좋습니다. (처음부터 상속받고 사용하도록 약속)
하다못해 Toolbar도 키보드, PickerView모두 사용하기 때문에 공통적인 모습으로 앱을 구성하고 싶다면 모두 하나로 만들어 둔 뒤, 상속받아 사용하는것이 좋았던 이유는 요건이 변경될때를 고려했기 때문이다.
예를 들어 갑작스레 텍스트 크기를 전체적으로 바꿀 수 있게 해달라는 요건(큰글씨 작은글씨를 앱내에서 제공하는등 - 이때 UILabel을 커스텀한 MYLabel을 모두 상속 받고있었고 해당 클래스에서 컨트롤 할 수 있게 했다.)
예시: 프로젝트명을 따 KKTextField 라는 class를 만들어 구성한다. 항상 leading point 를 12로 set 하는 등의 로직을 구현
3. 자주 사용하는 공통함수를 구현해둡니다.
하다못해 이름 앞뒤로 space를 제거하는 것 부터 int to string까지 함수로 구현. (함수로 분리하게 되는 연습도 포함)
그 다음 MVVM 구조를 선택하게 된 이유
- 뷰모델을 테스트 할 수 있다!
뷰 모델에는 UIKit과 관련된 코드가 없는 것이죠. 따라서, 뷰 모델은 뷰 컨트롤러와 의존성이 없으므로 뷰 모델을 이용해 비즈니스 로직을 테스트할 수 있습니다.
mvvm에서 중요한건 viewModel이 view를 모른다는것이다.
- 따라서 TDD기반으로 설계가 가능했다.
- 꼭 RxSwift가 아니여도 데이터 바인딩을 구현할 수 있는 방법을 알았다.
++ MVVM 구조 설명
- ViewModel 은 Model 을 알지만, View 는 모름
- View 는 ViewModel 를 알지만, Model 은 모름
- View 는 ViewModel 을 옵저빙(관찰) 하고 있다가, 상태 변화가 전달되면 화면 갱신
++
model / view / presenter 였고, presenter가 model의 데이터를 가공해서 view로 넘겨준다는 개념이었다.
여기서는 model이 독립적이고 각각은 presenter에 의존도가 있다.
아래는 mvvm이 mvp와 차이점이다.
- View와 ViewModel은 MVP와는 다르게 1:n의 관계를 가질 수 있으며 여러 개의 Fragment가 하나의 ViewModel을 가질 수 있음.
728x90'Swift > 아키텍쳐' 카테고리의 다른 글
Ribs 예제 도입기 - Ribs 설치 편 (0) 2021.10.15 Ribs 에 대해서... (0) 2021.09.30 Clean Architecture (0) 2021.06.18 ReactorKit (0) 2021.06.18 Clean Swift (0) 2021.03.14