Swift Architecture , MVC 개념 정리

아키텍처(Architectuer)

애플리케이션을 설계하고 구축하는데 사용되는 구조와 패턴을 나타낸다.

모델의 구성과 동작 원리, 구성요소 간의 관계 및 시스템 외부 환경과 관계 등 포괄하여 설명하는 설계도 같은 것

 

MVC (Model-View-Controller)

  • 애플리캐이션의 구성 요소를 모델(Model) , 뷰(View), 컨트롤러(Controller)로 분리하는 패턴이다.
  • 모델은 데이터 및 비즈니스 로직을 타나태며, 뷰는 사용자 인터페이스를 표시하고, 컨트롤러는 사용자 입력을 처리하고 모델 및 뷰 간의 상호 작용을 조정한다
  • Cocoa 및 Cocoa Touch 프레임워크는 MVC 아키텍처를 기반으로 구축되었다.

Model

  • 데이터 저장, 가공, 관리 등과 같은 역할을 담당
  • 사용자 정보, 애플리케이션 설정, 네트워크에서 가져온 데이터 등
  • 주로 클래스(class) 또는 구조체(struct)로 구현된다

View

  • 사용자에게 데이터를 시각적으로 표시하고 사용자의 입력을 받는 인터페이스 역할을 담당
  • 인터페이스의 구조, 레이아웃, 디자인 담당
  • 주로 UIKit 프레임워크에서 제공하는 UI 요소들로 구현된다.
  • 사용자에게 정보를 표시하거나, 사용자와 상호 작용하기 위한 기능을 포함한다.

Controller

  • 모델과 뷰 간의 상호 작용을 관리하고 중재하는 역할
  • 사용자 입력을 처리하고 그에 따른 모델의 변경을 조정, 변경된 데이터를 뷰에 반영한다.
  • 사용자 이벤트를 처리하고 모델 및 뷰를 업데이트 하는데 사용된다.
  • UIViewController 가 컨트롤러 역할을 담당
// 모델: 할 일을 나타내는 구조체
struct TodoItem {
    let title: String
    var completed: Bool
}
// 뷰: 할 일 목록을 표시하는 UITableView를 사용한 뷰 컨트롤러
class TodoListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet weak var tableView: UITableView!
    
    var todoItems: [TodoItem] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
    }
    
    // UITableViewDataSource 프로토콜 메서드
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return todoItems.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TodoCell", for: indexPath)
        let todoItem = todoItems[indexPath.row]
        cell.textLabel?.text = todoItem.title
        cell.accessoryType = todoItem.completed ? .checkmark : .none
        return cell
    }
    
    // UITableViewDelegate 프로토콜 메서드
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        todoItems[indexPath.row].completed.toggle()
        tableView.reloadRows(at: [indexPath], with: .automatic)
    }
}
// 컨트롤러: 사용자 입력을 받아 모델을 업데이트하고 뷰를 갱신하는 역할
class TodoListController {
    
    let viewController: TodoListViewController
    
    init(viewController: TodoListViewController) {
        self.viewController = viewController
    }
    
    // 사용자 입력에 따라 모델을 업데이트하고 뷰를 갱신
    func addNewTodoItem(_ title: String) {
        let newItem = TodoItem(title: title, completed: false)
        viewController.todoItems.append(newItem)
        viewController.tableView.reloadData()
    }
}