Model-View-Controller (1)

sewoong·2022년 11월 28일
0
post-thumbnail
👨‍💻 애플 공식문서를 통해 MVC 대해 정리합니다.

MVC(Model-View-Controller) 디자인 패턴은 모델, 뷰, 컨트롤러 세 가지 역할들을 각각 객체에 할당한다. 모델, 뷰, 컨트롤러 각각의 객체는 추상적 경계에 의해 다른 객체와 분리되며 이러한 경계를 넘나들며 다른 객체와 통신한다. 애플리케이션에서 특정 MVC 타입의 객체 모음을 계층(layer)이라고도 한다.

이 패턴을 채택하면 다음과 같은 이점이 있다.

  • MVC 패턴으로 디자인된 애플리케이션에서의 개체는 재사용 가능성이 높다.
  • 애플리케이션의 인터페이스가 더 명확하게 정의된다.
  • MVC 디자인을 가진 애플리케이션은 그렇지 않은 애플리케이션보다 확장성이 좋다.
  • 많은 Cocoa 기술과 아키텍처는 MVC를 기반으로 하며 사용자 지정 개체가 MVC 역할 중 하나를 수행하도록 요구한다.

Model

Model은 애플리케이션에서 데이터를 담당한다. 필요한 데이터를 불러오고 해당 데이터를 조작하고 처리하는 논리 및 계산을 담당한다. 애플리케이션의 대부분의 데이터는 데이터가 애플리케이션에 로드된 후 Model 객체에 상주해야 한다. 이러한 캡슐화를 통해 Model 밖의 영역(View, Controller)에서는 Model 객체와의 상호작용을 통해 데이터를 사용하게 된다.

Model은 데이터를 조작하고 처리하는 특정한 역할을 담당하므로 유사한 영역에서 재사용할 수 있다. 이를 통해 얻는 장점 중 하나는 테스트의 용이함으로, 데이터와 관련된 로직을 Model로 분리하였기 때문에 실제 Model과 Mock을 간단하게 교체하여 테스트를 진행하기 수월하다.

이상적으로 User-Interface 및 Presentation과 전혀 관련이 없어야 한다. Model은 데이터를 표시하고 사용자가 해당 데이터를 편집할 수 있도록 하는 View와 직접적으로 연결되지 않는 것이 좋다. Model은 애플리케이션에서 데이터 사용할 수 있도록 이를 적절한 형태로 저장하는 것이 중요하지 UI적으로 어떻게 보여질 것인지에 대해서는 신경쓰지 않는 것이 좋다. 이것은 View가 전적으로 해야 할 일이다.

View

View는 사용자에게 보여지는 요소들을 가리킨다. View의 역할 중 하나는 사용자에게 Model의 데이터를 보여주는 것으로 데이터를 화면에서 어떻게 구성할 것인지 설명하는 코드들이 포함되어 있다.

당연하게도 사용자의 작업에 응답하는 것 또한 View의 역할로 사용자에게 Model 객체의 데이터를 보여주고 이를 편집하는 기능을 제공한다. 그럼에도 불구하고 MVC 애플리케이션에서 View 객체는 Model과 분리되어야 한다.

일반적으로 View에 대해서 항상 같이 오는 말이 재사용과 재구성이다. 이런 기능을 통해 애플리케이션에 대한 일관성을 제공하기도 한다.

Controller

Controller 객체는 View와 Model 사이에서 중개자 역할을 한다. Model의 변경에 대해서 View는 Controller를 통해 알게 되고, 변경된 값을 출력하고 색상을 변경하는 등 이에 맞는 작업들을 수행한다. 반대의 경우로 View로부터 사용자의 작업이 입력된 경우, Controller는 Model에게 이를 알리고 Model의 내부 로직을 통해 변화가 일어나면 Controller는 다시 View에게 알려 화면을 갱신한다.

Controller는 애플리케이션에 대한 설정 및 조정 작업을 수행하고, 다른 객체들의 수명 주기를 관리하기도 한다.

Communication:

데이터를 생성하거나 수정하는 뷰 계층에서의 사용자 작업은 컨트롤러 객체를 통해 전달되며 모델 객체의 생성 또는 업데이트로 이어진다.
(사용자 작업 -> View -> Controller -> Model)

네트워크 통신을 통해 새로운 데이터가 수신된다던지 모델 객체가 변경되면, 해당 뷰 객체를 업데이트하는 컨트롤러 객체에 모델 객체의 변화를 알린다.
(데이터의 변화 -> Model -> Controller -> View)

두 계층이 완전히 분리되어 있다고 가정했을 때, Model과 View 간의 소통은 모두 Controller를 통해서 일어난다. Controller의 경우 Model과 View에 어렵지 않게 접근할 수 있다. 그러나 반대로 Model과 View에서 Controller로 데이터를 전달해야 하는 경우에는 어떨까.

우선 View -> Controller를 살펴보면, 사용자 작업(버튼 터치, 텍스트 변경 등)을 전달하는 상황일 것이다. 사용자 작업을 Controller에 인지시키기 위해 흔히 Delegation 방식을 사용한다. 동작 원리는 View의 대리자를 Controller로 설정해놓고, View에서 어떤 이벤트가 발생하면 그 이벤트의 처리를 Controller에게 위임하는 방식이다.

Model -> Controller도 알아보면, Model 영역의 데이터가 변화했다는 사실을 전달하는 내용일 것이다. iOS는 KVO(Key-Value-Observing)와 Notification을 사용한다. 해당 프로퍼티의 변화를 감지하거나, 특정 name의 Notification을 수신하고 이를 통해 최신의 Model 데이터를 가져올 수 있다.

References

profile
iOS Developer

0개의 댓글