본문 바로가기
TIL(Today I Learned)

2025.01.07 Today I Learned

by 승환파크 2025. 1. 7.

Swift의 MVVM 아키텍처

MVVM(Model-View-ViewModel) 아키텍처는 코드의 재사용성, 유지보수성, 테스트 용이성을 향상시키기 위해 널리 사용되는 디자인 패턴이다.

 

MVVM의 핵심 개념

MVVM 아키텍처는 세 가지 주요 구성 요소로 나뉜다.

1. Model

Model은 앱의 데이터와 비즈니스 로직을 나타낸다. Model은 ViewModel이나 View와 독립적이며, 주로 다음을 포함한다.

  • 데이터 구조 및 속성
  • 데이터 관리 및 네트워크 호출과 같은 비즈니스 로직
  • 데이터 저장소(예: Core Data, Realm, SQLite)

2. View

View는 사용자 인터페이스(UI)를 담당한다. View는 사용자와 상호작용하며, 데이터를 표시하고 입력을 처리한다. UIKit에서는 UIViewController 또는 UIView가 View 의 역할을 수행한다.

  • ViewModel의 상태를 관찰하고 업데이트 사항을 반영한다.
  • 사용자 이벤트를 ViewModel에 전달한다.

3. ViewModel

ViewModel은 View와 Model 사이의 중간 역할을 수행한다. ViewModel은 비즈니스 로직을 View에 제공하기 위해 데이터를 가공하고 상태를 관리한다.

  • Model로부터 데이터를 가져오고 가공하여 View에 제공한다.
  • View의 상태 변경을 Model에 전달한다.
  • 앱 상태를 관찰하고 업데이트를 알린다.

ViewModel은 View와 Model 간의 의존성을 제거하고, 데이터를 가공하는 로직을 분리하여 View의 복잡성을 줄인다.

 

MVVM의 장단점

장점

1. 모듈성 향상: ViewModel은 View와 Model의 의존성을 제거하여 독립적인 모듈을 만든다.

2. 테스트 용이성: ViewModel의 비즈니스 로직을 별도로 테스트할 수 있다.

3. 재사용성 증가: ViewModel은 다른 View에서 재사용이 가능하도록 설계될 수 있다.

4. UI 코드 간소화: View의 코드에서 복잡한 비즈니스 로직을 제거하여 UI 작업에만 집중할 수 있다.

단점

1. 초기 설정 복잡성: MVVM 아키텍처를 적용하려면 초기 설계와 설정이 복잡할 수 있다.

2. Overhead: 간단한 프로젝트에서는 불필요한 계층이 추가될 수 있다.

3. 데이터 바인딩 관리: RxSwift, Combine 같은 라이브러리를 사용하지 않으면 데이터 바인딩 구현이 복잡할 수 있다.

 

MVVM을 사용하는 팁

1. ViewModel에 비즈니스 로직을 집중: ViewModel은 데이터를 처리하고 변환하는 모든 책입을 가져야 한다.

2. 의존성 주입 사용: ViewModel과 Model 간의 강한 의존성을 제거하기 위해 DI(Dependency Injection)을 활용한다.

3. 테스트 작성: ViewModel은 독립적인 테스트 단위로 작성하며, Mock 데이터를 사용해 테스트를 수행한다.

4. 데이터 바인딩 라이브러리 선택: RxSwift, Combine 등 라이브러리를 적절히 사용하여 View 와 ViewModel 간의 데이터 바인딩을 간소화 시킨다.

5. 코드 일관성 유지: 프로젝트 내에서 MVVM 패턴을 일관되게 적용한다.

 

느낀점

실제로 진행했던 프로젝트에서  MVVM 디자인 패턴을 선택한 이후 프로젝트를 진행하였지만, MVVM 아키텍처에 이해도가 낮고 익숙하지 않아 MVVM 패턴을 활용은 했지만 View 와 ViewModel 간의 의존도가 너무 높고, 데이터 처리 로직 또한 View에 들어가 있는 경우가 많았다. 그래서 View와 ViewModel 간에 책임이 모호해지고 오류가 났을 때 어디서 고쳐야할 지 알지 못했다. 이번 MVVM 아키텍처를 공부하면서 프로젝트에 사용할 때 한번 더 생각해보며 코드를 작성하여 이런일이 없도록 해야겠다고 다짐했다.

'TIL(Today I Learned)' 카테고리의 다른 글

2025.01.16 Today I Learned  (1) 2025.01.16
2025.01.13 Today I Learned  (0) 2025.01.13
2025.01.06 Today I Learned  (1) 2025.01.06
2025.01.02 Today I Learned  (0) 2025.01.02
2025.01.01 Today I Learned  (0) 2025.01.01