티스토리 뷰

iOS/iOS

[iOS] MVC, MVVM 패턴

HarryJeonn 2022. 4. 21. 22:44

MVC

Model, View, Controller 세 가지로 나뉘어 진다.

Model

데이터들을 정의한다.

// Model
struct Person {
	var name: String?
	var age: Int?
}

UI, 즉 View랑은 모르는사이이다.

Model에서 값이 변경되어도 View에게 알려주지도 않고 관심도 안준다.

View도 Model이 어떻게 되든 신경쓰지 않는다.

View

View는 Controller가 보여줘! 하면 보여주기만하는 말 그대로의 화면이고, 사용자랑 대화를 한다. 사용자의 이벤트를 받아오면 Controller에게 전해주고 Controller가 이벤트를 처리하고 다시 보여줘! 하면 보여준다.

Controller

Controller는 Model과 View사이에서 데이터를 어떻게 표시할 지 정한다.

// View + Controller

class ViewController: UIViewController {
	var person: Person!
	@IBOutlet weak var button: UIButton!
  @IBOutlet weak var label: UILabel!

	override func viewDidLoad() {
		super.viewDidLoad()
	}

	@IBAction func buttonClicked(_ sender: Any) {
		label.text = "Hello I'am \\(person.name), \\(person.age) years old"
		print("Button clicked")
  }
}

Model과 ViewController

Controller는 Model에 직접적으로 접근이 가능하지만 Model은 Controller에 직접적으로 변화를 알릴 수 없다.

Model과 View

위에서 설명했듯이 서로 관심없고 소통도 할 수 없다.

View와 Controller

Controller는 View에 직접적으로 접근이 가능하고, View 또한 Swift에서 정해진 방식(Action, target 등)으로 사용자의 이벤트를 전달할 수 있다.

MVVM

Model, View, ViewModel로 나누어진다.

Model

데이터 구조를 정의하고 ViewModel에게 결과를 알려준다.

// Model
struct Person {
	var name: String?
	var age: Int?
}

View

View는 사용자의 상호작용으로 이벤트가 일어나면 ViewModel에게 알린다.

ViewModel이 이벤트를 처리하고 View에게 전달해주면 다시 보여준다.

ViewModel

View에게서 이벤트를 받으면 그에맞는 처리를 한다.

Model의 수정을 담당한다.

사용

폴더 구조는 이렇게 잡았다.

Model

//
//  Person.swift
//  MVVMTest
//
//  Created by Harry on 2022/04/21.
//

import Foundation

struct Person {
    var name: String
    var birthday: Date
}

View

//
//  ContentView.swift
//  MVVMTest
//
//  Created by Harry on 2022/04/21.
//

import SwiftUI

struct ContentView: View {
    @StateObject var viewModel = ContentViewModel()
    
    var body: some View {
        VStack {
            Text(viewModel.name)
                .padding()
            Text(viewModel.age)
                .padding()
            Button("Change Name") {
                viewModel.changeName("Lily")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

ViewModel

//
//  ContentViewModel.swift
//  MVVMTest
//
//  Created by Harry on 2022/04/21.
//

import Foundation

class ContentViewModel: ObservableObject {
    @Published var person = Person(name: "Harry", birthday: Date())
    
    var name: String {
        person.name
    }
    
    var age: String {
        // Date to Age
        return "20"
    }
    
    func changeName(_ name: String) {
        person.name = name
    }
}

결과적으로 View에서는 ViewModel에 있는 함수만 호출한다. 직접 구현은 하지 않는다.

🤔

SwiftUI를 사용해보려고 MVC, MVVM패턴에 대해 간단히 알아보았다.

확실히 MVC패턴보다는 독립적으로 이루어져 있어 의존도가 낮고, 각각 테스트가 용이할 것 같다.

하지만 설계가 어렵고, ViewController가 거대해지는 것 처럼 ViewModel도 거대해 질 수 있다고 생각한다.

그래도 새로운 방식의 개발은 언제나 즐거우니 열심히 감을 잡으러 다녀야겠다.

 

 

참고사이트

https://seons-dev.tistory.com/84

 

SwiftUI : #2 MVVM의 간단한 예제

저번 게시글에서 MVVM 이 무엇이고 어디에 쓰는지 알아보았습니다. 이제 Xcode 에서 MVVM 을 어떻게 하용하는지 간단한 예제를 통해 알아보려고 합니다. MVVM의 간단한 예제 새로운 Xcode 프로젝트를

seons-dev.tistory.com

https://ios-development.tistory.com/75

 

[iOS - swift] MVC, MVP, MVVM 디자인 패턴

1. MVC 1) 개념 MVC는 Model, View, Controller 세 가지 중점  -> Controller에 많은 부하가 가게되어 해결할 방법 모색(MVP와 MVVM) ※주의할 점 : apple의 설명은 view와 controller는 밀접하게 붙어있는 개..

ios-development.tistory.com

https://42kchoi.tistory.com/292

 

swift MVVM 정리 및 예제

iOS/Swift:: MVVM 정리 및 예제 iOS/Swift에서 MVVM 이 뭔지 제대로 이해해보려고 조사한 것이 결국엔 RxSwift를 배우지 않은 것의 크기를 경험하게 만들었고, 결국 Udemy에서 강의까지 사게 만들었다. RxSwift

42kchoi.tistory.com

 

'iOS > iOS' 카테고리의 다른 글

[iOS] 다크모드 미 지원  (0) 2022.06.15
[WWDC2022] Platforms State of the Union  (0) 2022.06.09
[iOS] OCR(3) - Google MLKit  (0) 2022.05.22
[iOS] OCR(2) - SwiftOCR  (0) 2022.05.22
[iOS] OCR(1) - Tesseract  (0) 2022.05.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함