Model-View-Controller (2)

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

역할 결합과 View Controller

MVC에서 둘 이상을 병합하여 요구되는 역할을 모두 수행하도록 만들 수 있다. 예를 들어 View Controller는 View와 Controller의 결합으로 View와 Controller의 역할을 모두 수행한다. 마찬가지로 Model Controller는 Model과 Controller의 결합으로 Model과 Controller의 역할을 모두 담당한다.

View Controller

View Controller는 View계층과 관련된 Controller로, 인터페이스 즉 View를 소유한다. View Controller의 주요 책임은 View를 관리하고 화면에 표시되는 View의 동기화 작업을 하는 것 등의 작업 메서드들은 이곳에서 구현된다. 또한 Model과 통신을 담당한다.

Model Controller

Model Controller는 Model계층과 관련된 Controller로, Model 객체를 소유하여 Model을 관리하고 View와 통신하는 역할을 맡는다. Model에 적용되는 작업 메서드의 경우 Controller에서 구현된다.

Cocoa Controller 객체의 타입

Cocoa에서는 두 가지 종류의 Controller 객체가 있다. 바로 Mediating ControllerCoordinating Controller이다. 둘은 각각 다른 클래스들과 연결되며 다른 범위의 동작을 제공한다.

(1) Coordinating Controller

NSWindowController 혹은 NSDocumentController의 서브클래스로, 혹은 직접 구현한 NSObject의 서브 클래스로, 애플리케이션에서 일부 기능을 감독하거나 조정하는 역할을 한다. Coordinating Controller가 제공하는 기능은 다음과 같다.

  • Delegation 메시지 응답 및 Notification 관찰
  • 메시지에 대한 응답
  • 소유한 객체의 Life Cycle 관리(예: 적절한 시간에 해제)
  • 객체 간 연결 설정 및 기타 설정 작업 수행

(2) Mediating Controller

Mediating Controller는 일반적으로 NSController에서 상속되는 객체로, View와 Model 사이의 데이터 흐름을 중재하는 역할을 한다. 이는 macOS 전용으로, iOS에서는 View Controller가 대신한다.

View Controller

View Controller는 앱 내부 구조의 기초로, 사용자 인터페이스(View)의 일부와 View와 데이터 간의 상호 작용을 관리한다. View Controller의 역할은 크게 네 가지라고 볼 수 있다.

  • Label의 Text와 같이 View를 구성하는 데이터의 변경에 대하여 View를 업데이트한다.
  • View와 사용자의 상호 작용에 응답한다.
  • View의 크기 조정을 포함한 전반적인 인터페이스 레이아웃을 관리한다.
  • 다른 View Controller를 포함하여 앱 내에서 다른 객체와의 조정(Coordinating)을 담당한다.

View Controller를 역할로 구분하자면 크게 두 종류로 구분할 수 있다.

Content View Controller

Content View Controller는 화면에 데이터를 표시하기 위한 View Controller의 역할을 한다. 사용자가 주로 만드는 View를 관리하기 위한 View Controller가 여기에 포함되며 모든 앱은 하나 이상의 커스텀 View Controller를 포함하고 있다.

Container View Controller

다음은 여러 요소들을 단일 인터페이스로 결합하는 Container View Controller이다. 자신이 소유한 요소들의 콘텐츠 표시들을 관리하며 Container View Controller의 예로는 UINavigationController, UITabBarController, UISplitViewController가 있다.

View Controller가 하는 일

1. View Management

View Controller는 View를 관리하고 있으므로 View와 Model간의 상호작용에서 정확하게 이어주기 위해 View의 계층 구조를 관리하는 것이 중요하다. View Controller에는 모든 컨텐츠를 포함하는 root View가 있으며 이 root View에 필요한 View들을 추가한다. View Controller와 root View, 그리고 각 View와 하위 View들 사이에는 강한 참조로 연결되어 있다.

Content View Controller는 모든 View들을 관리한다. Container View Controller는 자체 View와 하나 이상의 자식 View Controller의 root View를 관리한다. Container View Controller는 자식 컨텐츠를 관리하지 않는다.
위의 그림을 보면 알 수 있는데 Container View Controller에 해당하는 UISplitViewController는 root View를 관리하여 전체 크기와 위치를 관리하고, 실제 콘텐츠인 A와 B는 하위 View Controller들을 통해 관리된다.

2. Data Marshaling

View Controller는 관리하는 View와 애플리케이션의 데이터(Model) 사이의 중개자 역할을 한다. UIViewController 클래스의 메서드와 프로퍼티를 사용하면 애플리케이션의 presentation을 관리할 수 있다.

View Controller를 구현하면서 데이터를 관리하는 데 필요한 프로퍼티를 추가하여 다음 그림과 같이 View Controller는 데이터에 대한 참조와 데이터를 표시하기 위한 View에 대한 참조 모두를 가질 수 있다.

주의할 점은, View Controller와 데이터 사이에서 항상 책임을 명확하게 분리해야 한다. 데이터 구조의 무결성을 보장하기 위한 대부분의 논리는 데이터 자체에 속해야 한다. View Controller가 모든 로직을 갖고 View에서 오는 입력의 유효성을 검사한 다음 해당 입력을 데이터에 필요한 형식으로 변환까지 처리할 수 있지만 실제 데이터를 관리하는 부분에 대한 View Controller의 역할을 최소화해야 한다.

3. User Interactions

View Controller는 Responder Chain에서 내려오는 이벤트를 수신하고 처리할 수 있는 Responder이다. 그러나 일반적으로 터치와 같은 이벤트를 View Controller가 직접 처리하는 경우는 드물다. 보통 View가 자체적으로 이벤트를 처리하고 View Controller를 Delegation으로 연결하여 결과를 Delegate Method 또는 Action Method에 전달한다. 따라서 View Controller에서는 이 메서드에 의해 이벤트가 처리된다.

4. Resource Management

View Controller는 View를 포함하여 모든 하위 객체들에 대한 책임을 진다. 즉 객체들의 생명 주기를 관리하며 더 이상 필요하지 않은 경우 자원 확보를 위해 해제할 수도 있다. View Controller는 이러한 것들을 모두 자동으로 수행한다.

사용 가능한 여유 메모리가 부족할 경우, UIKit은 더 이상 필요하지 않은 리소스를 해제하도록 앱에 요청한다. View Controller는 didReceiveMemoryWarning() 메서드를 호출하여 더 이상 필요하지 않거나 또는 나중에 쉽게 다시 만들 수 있는 객체에 대한 참조를 제거하여 메모리를 확보한다.

5. Adaptivity(적응성)

View Controller는 View를 표시하고 조정하는 역할을 한다. 모든 iOS 앱은 iPad 및 다양한 화면 크기의 iPhone에서 실행될 수 있어야 한다. 당연하게도 각 장치에 따른 View Controller를 만드는 대신 View를 조정하는 단일 View Controller를 사용하는 것이 더 낫다.

View Controller는 Device의 상태가 가로 혹은 세로로 변경될 때마다 표시 가능한 영역의 크기가 달라지므로 View의 배치 방법을 변경시킬 수 있다. 허용된 크기 내에서, Auto Layout을 사용하여 UIKit이 자동으로 View의 크기와 위치를 조정하여 적절하게 맞추거나 혹은 추가적인 조정을 할 수 있다.

References

profile
iOS Developer

0개의 댓글