Skip to main content

MVC



MVC란?

MVC, 즉 Model-View-Controller는 애플리케이션의 구조를 세 부분으로 나누는 소프트웨어 아키텍처 패턴입니다. 각 부분은 애플리케이션의 다른 측면을 담당하며, 이를 통해 코드의 관리가 용이해지고, 유지보수와 확장성이 향상됩니다.

Model은 애플리케이션에서 사용되는 데이터와 그 데이터를 처리하는 비즈니스 로직을 정의합니다. 모델은 앱의 데이터 구조를 정의하고, 이 데이터가 사용자 인터페이스(UI)와는 독립적으로 존재함을 보장합니다. 모델은 UI의 관리 변수를 포함하지 않으며, 이는 대신 ViewController가 담당합니다. 따라서 모델은 순수하게 데이터와 그 데이터의 처리를 담당하는 로직만을 포함합니다.

View는 사용자에게 보여지는 요소입니다. 이는 애플리케이션의 사용자 인터페이스를 구성하며, 단순한 뷰와 더 복잡한 커스텀 뷰를 제공할 수 있습니다. 뷰는 위치 정보나 표시할 데이터를 파라미터로 받아서 생성되며, 스토리보드 파일 등의 리소스를 포함할 수 있습니다. 뷰는 오직 사용자에게 정보를 표시하는 역할만을 담당하며, 그 자체로는 어떤 로직도 처리하지 않습니다.

Controller는 모델과 뷰 사이의 중재자 역할을 하며, 두 컴포넌트의 연결 다리 역할을 합니다. 컨트롤러는 모델로부터 데이터를 받아, 그 데이터를 뷰에 적절히 표시하도록 합니다. 또한 사용자의 입력을 처리하고, 그 결과를 모델에 반영하여 앱의 상태를 업데이트 합니다. 컨트롤러는 API 호출, 버튼 이벤트 처리 및 레이아웃 관리와 같은 다양한 기능을 총괄합니다. 만약 MVC 패턴에서 컨트롤러가 없다면, 모델과 뷰는 서로의 존재나 상태를 직접적으로 인식하거나 갱신할 수 없습니다.


서로의 관계

Model, View, 그리고 Controller 간의 관계는 MVC 아키텍처의 핵심이며, 각 구성 요소는 명확히 정의된 역할과 상호작용 방식을 가지고 있습니다.

Model과 Controller 간의 관계는 상당히 긴밀합니다. Controller는 Model에 직접 접근할 수 있는 권한을 가지고 있어, 데이터를 읽거나 수정할 수 있습니다. 이를 통해 사용자의 입력에 기반한 데이터 처리가 가능해집니다. 반면, Model은 Controller에 직접적으로 접근하는 대신, 변화가 있을 때마다 Notification이나 Key-Value Observing(KVO) 방식을 통해 이러한 변화를 Controller에게 알립니다. 이런 방식은 Model의 독립성을 유지하면서도 필요한 정보를 Controller에게 효과적으로 전달할 수 있게 합니다.

Model과 View 간의 관계는 완전히 독립적입니다. Model은 UI와 무관하게 데이터와 비즈니스 로직에만 집중하며, View의 존재나 상태를 알지 못합니다. 마찬가지로 View도 Model의 구체적인 구현이나 상태 변화에 대해 직접적인 정보를 가지지 않습니다. 이러한 분리는 View가 단순히 데이터를 표현하는 역할에만 집중할 수 있게 하며, 디자인 변경이나 UI 수정이 Model이나 Controller에 영향을 미치지 않도록 합니다.

View와 Controller 간의 관계는 매우 상호작용적입니다. Controller는 View의 다양한 요소들에 대한 참조를 가지고 있으며(outlet을 통해), 이를 통해 View의 상태를 업데이트하거나 UI 요소를 제어할 수 있습니다. View는 사용자의 입력과 행동을 Controller에게 전달하는 역할을 합니다. 이는 주로 delegate 패턴, data source 메커니즘, 그리고 action-target 구조를 통해 이루어집니다. 사용자가 UI에서 특정 행위를 할 때, View는 이를 감지하고 해당 정보를 Controller에게 전달하여 적절한 반응이나 데이터 갱신이 이루어지도록 합니다.

이러한 구조적인 분리와 상호작용은 각 컴포넌트가 서로의 역할을 명확히 이해하고, 그에 맞게 최적화된 방식으로 동작할 수 있게 해줍니다. MVC는 이런 방식으로 애플리케이션의 유지보수성을 높이고, 확장성을 개선하는 데 크게 기여합니다.


장점

소규모 프로젝트의 경우, MVC 패턴은 빠른 반복과 수정을 가능하게 하여, 아이디어를 신속하게 구현하고 시장에 출시하는 데 큰 도움을 줍니다. 이는 스타트업이나 소규모 팀에게 특히 유리하며, 초기 개발 단계에서 빠른 피드백과 개선을 통해 제품을 성공적으로 론칭할 수 있는 기반을 마련합니다.

iOS 개발에 있어서는 Apple의 강력한 지원 덕분에 MVC 패턴을 사용하는 것이 더욱 유리합니다. 개발자는 Apple의 광범위한 문서와 커뮤니티 리소스를 활용하여 빠르게 기술을 습득하고 문제를 해결할 수 있습니다. 이러한 지원은 개발자가 더 안정적이고 성능이 우수한 애플리케이션을 구축할 수 있도록 도와줍니다.

또한, MVC 패턴은 개발자 커뮤니티 내에서도 널리 받아들여져 있어, 새로운 개발자가 프로젝트 팀에 합류할 때의 학습 부담을 줄여줍니다. 프로젝트에 참여하는 모든 이가 공통된 아키텍처를 이해하고 있기 때문에, 팀 내 커뮤니케이션이 원활해지고, 결과적으로 프로젝트의 전반적인 진행 속도가 빨라집니다.

결국, MVC 패턴은 그 구조의 간결함과 효율성 덕분에 다양한 프로젝트와 환경에서 지속적으로 선호되는 설계 방식입니다. 복잡한 아키텍처를 요구하지 않는 프로젝트나 규모가 작은 프로젝트에 특히 적합하며, 개발 속도와 유지보수의 용이성을 통해 검증된 선택으로 자리 매김하고 있습니다.


단점

가장 두드러지는 문제 중 하나는 View와 Controller가 지나치게 밀접하게 연결되어 있다는 점입니다. 이로 인해 View의 라이프사이클을 Controller가 관리하게 되며, 이 둘을 분리하기가 상당히 어려워집니다. 결과적으로, 이 구조는 두 컴포넌트 간의 의존성을 높이며 재사용성을 크게 저하시킵니다.

또한, 이러한 밀접한 연결은 유닛 테스트의 진행을 어렵게 만듭니다. Controller 내에 다양한 로직이 집중되어 있기 때문에, 간단한 유닛 테스트조차도 복잡해질 수 있습니다. 예를 들어, 네트워크 호출, 사용자 인터페이스의 업데이트, 데이터 처리 등 다양한 작업이 Controller에서 이루어지면, 이를 분리하여 테스트하기가 매우 번거로워집니다.

Controller에 코드가 과도하게 집중되는 현상은 가독성과 내부 구조의 복잡성을 증가시키는 주요 요인이기도 합니다. 많은 코드가 Controller에 모이게 되면, 이는 결국 delegate, dataSource 관리, 네트워크 요청 처리 등 다양한 기능의 구현을 어렵게 만들며, 코드의 가독성을 크게 저하시킵니다. 이러한 문제는 "Massive View Controller"라는 용어가 생겨나는 원인이 되었으며, 많은 개발자들이 이를 비판적으로 지적하고 있습니다.

프로젝트의 규모가 커질수록 이러한 문제들은 더욱 심화됩니다. 복잡해진 코드를 유지보수하는 일은 점점 더 힘들어지며, 초기에 간과된 설계 문제들이 시간이 지날수록 더욱 큰 비용으로 돌아올 수 있습니다. 이러한 단점들은 MVC 패턴의 선택을 재고할 때 중요한 고려사항이 되어야 합니다.


MVC 아키텍처는 아키텍처로 사용하기 적절할까?

Distribution 측면에서 보면, MVC는 View와 Model을 분리하여 설계하긴 하지만, View와 Controller 사이에는 강한 의존성이 존재합니다. 이로 인해 View와 Controller가 밀접하게 연결되어, 분리를 통한 유연한 개발이 어렵습니다. 이러한 구조는 컴포넌트 간의 독립적인 운용을 제한하고, 변경 사항이 한 부분에만 국한되지 않고 다른 부분에도 영향을 미칠 수 있습니다.

Testability의 관점에서는, MVC의 구조가 테스트의 범위에 제한을 주기도 합니다. 특히, View와 Controller가 밀접하게 연결되어 있어서 이 두 컴포넌트의 독립적인 테스트가 어렵습니다. 결과적으로, 대부분 Model의 로직만이 테스트 가능한 상황이 발생할 수 있으며, 이는 전체적인 테스트 커버리지에 영향을 미칩니다.

Easy of Use에 있어서는 MVC가 매우 효율적입니다. 이 아키텍처는 비교적 적은 양의 코드로 구현이 가능하며, 경험이 적은 개발자도 쉽게 접근하고 유지보수할 수 있는 구조를 제공합니다. 이는 학습 곡선을 낮추고, 작은 규모의 프로젝트나 간단한 애플리케이션 개발에 이점을 제공합니다.

그러나 프로젝트의 규모가 커지고 기능이 복잡해질수록, 그리고 네트워크를 통해 다루어야 하는 데이터가 많아질수록 MVC 구조는 점점 그 한계를 드러냅니다. 컨트롤러가 방대해지면서 유지보수가 어려워지고, 이로 인해 유지보수 비용도 증가하게 됩니다. 이는 결국 프로젝트의 확장성과 유지보수성을 저해할 수 있으며, 보다 복잡한 아키텍처 패턴으로의 전환이 고려될 수 있습니다.