반응형
MVVM
: MVC와 마찬가지로 애플리케이션 개발에 주로 사용되는 디자인 패턴
Model - View - ViewModel
💡 MVC와 MVVM 단순차이
- Controller가 아닌 ViewModel 계층을 가지고 있음
- ViewModel 또한 Controller처럼 View와 Model의 중간 계층 역할을 함
1. Model
: 데이터와 관련된 코드를 담고 있는 계층 (MVC의 Model과 마찬가지)
- 데이터를 담아두기 위한 구조체들(struct)
- 네트워크 로직
- JSON 파싱 코드
- 등 ...
struct Person { // Person에 대한 데이터 담은 구조체
let name: String
var age: Int
init(json: JSON) { // JSON 파싱
name = json["name"].stringValue
age = json["age"].intValue
}
}
반응형
2. View
: 앱의 UI에 대한 코드를 담고 있는 계층
- 각 컴포넌트에 대한 정보
- 배치 정보
- 재사용성이 강조됨
3. ViewModel
: 앱의 핵심적인 비즈니스 로직을 담고 있는 계층
- view와 model 사이에서 view의 요청에 따라 로직을 실행하고, model의 변화에 따라 view refresh 등..
💡MVC → MVVM 넘어가는 이유 ?
- 기존에 많이 사용한 UIKit 프레임워크는 MVC 패턴을 기반으로 만들어졌음
- 최근에 나온 SwiftUI는 MVVM 패턴을 기반으로 함
- UIKit에선 ViewController가, SwiftUI에선 View가 주인공
UIKit
- UIKit의 MVC에선 ViewController가 거의 모든 역할을 했음. ViewController는 View와 Model 계층을 모두 소유
- ViewController단위로 한 화면이 구성됨 → Controller는 View와 Model을 모두 알고있어야 함
- ViewController는 비즈니스로직 외에도 View에 대한 설정, 수정 등의 코드를 포함 → View와 Controller 계층을 제대로 분리X → ViewController의 코드가 길어질 수 밖에
SwiftUI
- View가 ViewModel 소유, ViewModel이 Model을 소유하는 방식
- 화면을 주도하는 것은 View → ViewModel은 Model만 알면됨 (View 알 필요X)
- ViewModel은 비즈니스로직만 가지도록 깔끔하게 분리되어있음 → 코드 길이 짧음! 🙂
- 각 계층이 더욱 모듈화되어있음 → 테스트하기 용이
🔎 User 상호작용이 일어났을때.. (예: 버튼 누름)
- MVC : user 상호작용이 일어났음을 View → Controller로 알림 & 그에 따라 어떤 행동을 할지는 Controller가 정함
- MVVM : 어떤 행동을 할지는 View가 정함. ViewModel은 로직만 가지고 있음
🔎 데이터가 변경되었을때.. (예: 버튼 누름)
- MVC : 데이터의 변경이 일어났음을 Model → Controller로 알림 & 그에 따라 View를 다시 어떻게 그릴지는 Controller가 정함
- MVVM : 데이터의 변경이 일어났음을 Model → ViewModel로 알림 & ViewModel은 변경사항을 바로 View에게 전달하는 역할만 하고, View가 알아서 다시 그림
728x90
반응형
'Computer Science > swift 뽀개기 - 참고 사이트 저장소' 카테고리의 다른 글
[swift] Xcode가 내 기기를 못 찾을 때 해결방법 (18) | 2024.09.27 |
---|---|
[xcode] Info.plist 파일의 정체 알아보기 (0) | 2022.07.31 |
[Pod error] sudo gem install cocoapods 실행 시 에러 (해결법 포함) (0) | 2022.06.24 |
[xcode] xcode에 audio asset 추가 (local말고..!) (0) | 2022.01.28 |
[xcode] xcode빌드시 컴퓨터 죽음/xcode 메모리 누수현상/xcode memory leak (해결방법O) (0) | 2022.01.09 |
[swift] Alamofire란? Alamofire 사용법 뽀개기 (0) | 2022.01.02 |
[swift] Metal vs OpenGL (0) | 2021.12.27 |
[swift] swiftui zindex 숫자 (0) | 2021.11.19 |