[TIL] MVC

Eden·2025년 6월 16일

MVC (Model-View-Controller) 는 iOS에서 가장 기본적으로 사용되는 아키텍처 패턴으로, 코드의 역할을 세 가지 컴포넌트로 나누어 책임을 분리하고, 유지보수성과 협업 효율을 높이는 데 목적이 있다.


🧠 왜 아키텍처가 필요한가?

  • 앱 규모가 커질수록 코드 간 의존성이 높아져 유지보수가 어려움
  • 역할 분리를 통해 코드의 명확성, 재사용성, 테스트 용이성 확보
  • 협업 시 각자의 역할을 명확하게 분담 가능

🔺 MVC의 구성요소

🔸 Model

  • 앱의 데이터 및 해당 데이터를 처리하는 비즈니스 로직을 담당
  • UI나 플랫폼에 독립적
  • 예: 사용자 정보, 서버 응답 파싱, 로컬 DB 접근 등
struct User {
    let id: Int
    let name: String
}

🔸 View

  • 사용자에게 보여지는 UI 요소 담당
  • 사용자 이벤트를 직접 처리하지 않음 (단순히 보여주기만 함)
  • 예: UILabel, UIButton, UITableView 등
let titleLabel = UILabel()
titleLabel.text = "Hello, MVC"

🔸 Controller

  • View와 Model 사이의 중재자 역할
  • 사용자의 입력을 받아 Model에 전달하고, Model의 데이터를 View에 전달하여 UI 업데이트
  • iOS에서는 주로 UIViewController가 Controller의 역할을 수행
class UserViewController: UIViewController {
    let userModel = User(id: 1, name: "Eden")

    override func viewDidLoad() {
        super.viewDidLoad()
        titleLabel.text = userModel.name
    }
}

🔁 동작 흐름 요약

  1. 사용자가 View에서 버튼 클릭 등의 입력
  2. Controller가 해당 입력을 받고, 필요한 데이터를 Model에 요청
  3. Model이 데이터를 가공하여 Controller에 결과 반환
  4. Controller는 View를 업데이트하여 사용자에게 결과 표시
[User Input] → View → Controller → Model
                                     ↓
                            Business Logic 처리
                                     ↓
                          Controller → View (Update)

✅ 장점

  • 책임 분리로 인한 코드 유지보수성 향상
  • UI 로직과 데이터 로직 분리 → 테스트 용이
  • 협업 시 명확한 역할 분담 가능
  • 재사용성 증가 (같은 Model을 다른 View에서 재사용 가능)

⚠️ 주의사항 및 한계

  • MVC에서 Controller는 View와 Model을 모두 알아야 하기 때문에 역할이 과도하게 집중되는 경향이 있음 → "Massive View Controller" 문제
  • 복잡한 앱에서는 MVVM, VIPER 등의 대체 아키텍처 고려 필요
  • View와 Controller의 결합도가 높은 편 → 테스트 어려움 발생 가능

🔚 결론

MVC는 iOS 개발의 기본이 되는 아키텍처로, 단순한 앱 구조에 매우 적합하다. 하지만 앱의 복잡도가 증가할수록 Controller의 비대화 문제가 발생하므로, 역할 분산 및 다른 아키텍처 패턴과의 조합을 고려하는 것이 바람직하다.

profile
iOS Dev

0개의 댓글