Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
Computer Science

디자인 패턴 (MVC, MVP, MVVM)

by Toughie 2023. 3. 27.

SwiftUI 공부 하면서 MVVM 패턴을 접했는데, 여전히 정리가 잘 되지 않아서 간략하게나마

디자인 패턴, 특히 MVC, MVP, MVVM을 정리해 보고자 한다.

 

디자인 패턴이 뭔데?

프로그램을 설계하면서 발생했던 다양한 문제점들을 방지하고, 해결하기 위한

객체 간의 관계를 활용하는 등의 "약속" 을 의미한다.

(코드를 더 잘 관리할 수 있다.)

 

* MVVM이 최신 디자인 패턴이라고 제일 좋은 것은 아니다! 상황에 따라 적절히 사용해야 한다.

 

싱글톤 패턴, 옵저버 패턴 등 다양한 디자인 패턴이 있지만, 이번에는 MVC, MVP, MVVM을 더 보고자 한다.

기본적으로 중간 매개체(컨트롤러 등)가 담당하던 수많은 역할을 점차 각자에게 나누는 과정으로 이해하고 있다.

 

MVC 패턴

Model, View, Controller로 이루어진 디자인 패턴

 

- 어플리케이션(앱)의 구성요소를 세 가지 역할로 구분.

- 각각 요소를 나눠 개발 가능

- 재사용성, 확장성 👍🏻

- 앱이 복잡해 질수록 뷰컨트롤러 비대해지는 단점(모델과 뷰 관계 복잡해짐)

 

모델(Model)

"데이터" - DB,변수,상수 등..

뷰에서 데이터 생성/수정이 일어나면 '뷰컨트롤러를 거쳐서' 모델을 생성/갱신

 

뷰(View)

사용자 인터페이스 요소. 즉 모델의 데이터를 기반으로 유저가 보는 화면

뷰에서 데이터를 직접 저장하는 것이 아님.

다만 버튼, 텍스트필드 등 화면에 표시하는 정보만 가지고 있음(안에 내용물은 모델에서)

뷰에서 변화가 일어나면(User Action_터치, 스크롤 등) 컨트롤러에 전달

 

컨트롤러(Controller)

모델과 뷰를 이어주는 중간 다리.

이벤트 처리 등 메인 로직 담당. 

모델/뷰 Life Cycle도 관리

모델이나 뷰의 변경사항이 있으면 해당 내용을 바탕으로 모델과 뷰를 업데이트

(사실 얘가 일 거의 다함)

 

MVP 패턴

MVC 패턴에서 파생된 패턴.

기존 컨트롤러가 Presenter로 교체되었음. 

다만 MVC 패턴에서는 유저 인풋을 받고 처리도 컨트롤러가 담당했는데,

MVP에서는 인풋을 뷰에서 받음.

 

또한 뷰와 프레젠터는 1 : 1 관계로 MVC 패턴(뷰 - 뷰컨트롤러)에 비해 결합성이 더 강함.

MVC 패턴에서는 (뷰 <-> 뷰컨트롤러  다 : 1 관계_ 뷰컨트롤러 1개가 모든 뷰 담당)

(뷰마다 프레젠터가 필요함)

 

MVVM 패턴

먼저 기존 패턴들과의 차이점을 보자.

MVC 패턴에서는 뷰컨트롤러가 모든 뷰드를 가리키고 담당했고,

MVP 패턴에서는 뷰와 프레젠터가 1:1 관계였고

MVVM에서는 오히려 모든 뷰들이 뷰 모델을 바라보고(구독,관찰) 있다.(뷰모델은 뷰에게 뭐라 하지 않는다!)

(@ObservableObject, @ObservedObject, @Published.. 등 프로퍼티 래퍼들을 떠올려 보자)

 

뷰와 뷰모델 사이 양방향 데이터 바인딩 지원

뷰가 똑 떨어져 있기 때문에(가장 독립적) UI의 재사용성이 높고 Unit Test가 용이함

 

MVVM의 특징 - 커맨드/ 데이터 바인딩

 

커맨드

여러 요소에 대한 처리를 하나의 액션으로 처리 가능하게 하는 기법.

 

데이터 바인딩

뷰모델에 변경사항이 생기면 뷰가 알아서 변경됨 

 

 

더 깊은 내용과 정확한 개념 이해는 프로젝트에 직접 적용해 보면서 익혀나가야 하는 부분도 있어 보인다.

 

하지만 MVC - MVP - MVVM으로 거쳐 가면서

디자인 패턴 적용의 목적이 코드의 재사용성과 확장성, 그리고 테스트의 용이성을 개선임은 분명해 보인다.

 

MVVM 이후 새로운 패턴이 등장하겠지만,

결국 뷰, 모델, 컨트롤러 세 요소를 최대한 분리하고자 하는 노력이 깃들어 있을 것임은 분명하다.

 

SwiftUI를 접하며 MVVM을 정말 간단하게 적용해 봤지만,

사실 정확하게 요소별로 구분지어 나누는 것이 굉장히 어렵게 느껴졌다.

(정말 간단한 프로젝트에는 과투자 일수도 있다는 얘기)

 

MVVM 패턴으로 앱을 만들었다고 엄청 설계가 잘 되었다?는 단언할 수 없을 것 같다.

 

디자인 패턴이 뭔지, 디자인 패턴을 왜 적용하는지, 각 패턴별 뚜렷한 차이점은 무엇인지 우선 알고 넘어가는 시간을 가졌다 :)