Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MVC, MVP, MVVM 등 다른 아키텍처 패턴과 Clean Architecture를 비교했을 때, iOS 개발에 있어서 Clean Architecture의 독특한 장점은 무엇이라고 생각하시나요? #14

Open
hamfan524 opened this issue Jan 5, 2024 · 4 comments

Comments

@hamfan524
Copy link
Member

MVC, MVP, MVVM 등 다른 아키텍처 패턴과 Clean Architecture를 비교했을 때, iOS 개발에 있어서 Clean Architecture의 독특한 장점은 무엇이라고 생각하시나요?

@hamfan524
Copy link
Member Author

hamfan524 commented Jan 8, 2024

클린 아키텍처

image-2

image-1

  1. 관심사의 분리: 코드를 엔티티, 유스케이스, 인터페이스 어댑터, 프레임워크 및 드라이버 등의 레이어로 명확히 분리하여 각 레이어가 독립적인 책임을 갖습니다. 기본적으로는 아래의 세가지 레이어가 필요합니다.
    • Presentation layer
    • Business Logic layer
    • Data Access layer
  2. 테스트 용이성: 분리된 구조 덕분에 각 레이어, 특히 도메인과 유스케이스 레이어를 독립적으로 테스트하기 쉽습니다.
  3. 유지보수 및 확장성: 한 레이어의 변경이 다른 레이어에 영향을 미치지 않아 시스템이 더 유지보수하기 쉽고 확장성이 뛰어납니다.
  4. 프레임워크 독립성: 프레임워크에 크게 의존하지 않아 외부 라이브러리나 프레임워크의 변경에 강한 시스템을 만들 수 있습니다.
  5. 비즈니스 로직 중심: UI나 프레임워크보다 일반적으로 변동성이 적은 비즈니스 로직과 규칙에 중점을 두어 다른 레이어의 변경에도 견딜 수 있습니다.

MVC (모델-뷰-컨트롤러)

장점

  1. 간단함: 이해하기 쉽고 널리 알려진 패턴입니다.
  2. 프레임워크 지원: Apple이 UIKit에서 직접 지원하여 iOS 개발에 자연스러운 선택입니다.
  3. 관심사의 분리: 프레젠테이션, 비즈니스 로직, 데이터 액세스 레이어를 분리하지만, 실제로는 ViewController가 비대해지는 문제가 있습니다.

클린 아키텍처 대비 단점

  1. 테스트 용이성: MVC는 비즈니스 로직이 ViewController와 충분히 분리되지 않으면 단위 테스트가 어려울 수 있습니다.
  2. 레이어 결합: ViewController가 여러 관심사의 중심점이 되어 클린 아키텍처만큼 모듈화되지 않습니다.

MVP (모델-뷰-프레젠터)

장점

  1. MVC보다 나은 테스트 용이성: 프레젠터는 MVC의 ViewController보다 테스트하기 쉽습니다.
  2. 분리: 비즈니스 로직과 UI 코드를 MVC보다 잘 분리합니다.

클린 아키텍처 대비 단점

  1. 비대한 프레젠터: 관리가 잘 되지 않으면 큰 프레젠터가 생길 수 있습니다.
  2. 레이어 상호작용: 레이어 간 상호작용이 클린 아키텍처만큼 유연하지 않습니다.

MVVM (모델-뷰-뷰모델)

장점:

  1. 바인딩: MVVM은 데이터 바인딩에 강력한 기능을 제공합니다.
  2. UI와 비즈니스 로직 분리: 뷰모델이 많은 로직을 처리합니다.
  3. 테스트 용이성: 뷰모델은 MVC의 ViewController보다 테스트하기 쉽습니다.

클린 아키텍처 대비 단점

  1. 복잡성: MVVM은 상태 관리와 뷰와 뷰모델 간의 상호작용에서 복잡해질 수 있습니다.
  2. 뷰모델 비대화: 관리가 잘 되지 않으면 큰 뷰모델이 생길 수 있습니다.

결론

클린 아키텍처는 분리도, 테스트 용이성, 비즈니스 로직 중심성 등에서 강점을 가지며, 복잡한 iOS 애플리케이션에서 이러한 요소들이 중요할 때 효과적인 선택입니다. 그러나 간단한 애플리케이션의 경우 MVC, MVP, MVVM에 비해 더 복잡하고 오버헤드가 클 수 있습니다. 프로젝트의 특정 요구사항과 규모, 그리고 팀의 아키텍처에 대한 이해도에 따라 선택이 달라질 수 있습니다.

Reference

https://velog.io/@mmim/iOS-Clean-Architecture

@ha-nabi
Copy link
Member

ha-nabi commented Jan 8, 2024

좋은 글 잘 읽었습니다 언제 한번 꼭 다뤄볼 주제라고 생각했기에 개인적으로 찾아봤는데요, 궁금한게 있습니다

MVVM은 MVC, MVP의 각각의 컨트롤러, 프레젠터가 감당할 수 없을 만큼 비대해져서 이걸 어떻게 해결할까 고민하다가
나온 패러다임중 하나라고 생각합니다

그러면 MVVM의 뷰모델이 너무 비대해져서 감당할 수 없을만큼의 코드량이 쌓이면 그 때는 어떤 아키텍쳐를 고민해야하는지 궁금합니다

@kmh5038
Copy link
Member

kmh5038 commented Jan 9, 2024

MVC -> MVP -> MVVM -> 클린아키텍쳐 순서별로 단점을 보완하고 심화되는 단계라 생각해도되나요?

@hamfan524
Copy link
Member Author

좋은 글 잘 읽었습니다 언제 한번 꼭 다뤄볼 주제라고 생각했기에 개인적으로 찾아봤는데요, 궁금한게 있습니다

MVVM은 MVC, MVP의 각각의 컨트롤러, 프레젠터가 감당할 수 없을 만큼 비대해져서 이걸 어떻게 해결할까 고민하다가 나온 패러다임중 하나라고 생각합니다

그러면 MVVM의 뷰모델이 너무 비대해져서 감당할 수 없을만큼의 코드량이 쌓이면 그 때는 어떤 아키텍쳐를 고민해야하는지 궁금합니다

ViewModel이 너무 많은 작업을 수행하는 경우 이를 여러 ViewModel로 분할해야 할 때일 수 있습니다. 각 ViewModel은 단일 책임을 갖고 UI의 일부만 관리해야 합니다. 이 접근 방식은 객체 지향 프로그래밍에서 큰 클래스를 분할하는 것과 유사합니다.

또는 코디네이터 패턴을 적용하는 방법도 있습니다. 코디네이터 패턴은 ViewModel과 별도로 탐색 및 애플리케이션 흐름을 관리하는 데 도움이 될 수 있습니다. 코디네이터는 복잡한 탐색 논리와 같이 ViewModel에 빽빽이 들어차 있을 수 있는 일부 책임을 맡을 수 있습니다.

하지만 SwiftUI는 선언적, 상태(State) 중심의 프레임워크이기 때문에 각 아키텍처의 표준 구현은 SwiftUI 앱에 적합하지 않습니다.

Clean Architecture, Viper 또는 패턴 조합과 같은 다른 패턴을 고려해보는게 좋습니다. 예를 들어 클린 아키텍처는 문제를 별개의 레이어로 분리하는 것을 강조하여 복잡성을 더 잘 관리하는 데 도움이 될 수 있습니다.

MVC -> MVP -> MVVM -> 클린아키텍쳐 순서별로 단점을 보완하고 심화되는 단계라 생각해도되나요?

맞습니다. 이들은 각각의 단점을 보완하고, 특정한 문제들을 해결하기 위해 개발되었으며, 일정한 방식으로 진화해왔다고 볼 수 있습니다.

  1. MVC (Model-View-Controller)

단점: 뷰와 모델이 강하게 연결되어 있어, UI와 비즈니스 로직의 분리가 쉽지 않습니다. 컨트롤러가 모델과 뷰 사이의 의존성으로 인해 복잡해질 수 있습니다.
보완점: MVP와 MVVM은 이러한 단점을 개선하기 위해 등장했습니다.

  1. MVP (Model-View-Presenter)

단점: 프레젠터가 뷰와 모델 사이에서 중개하는 역할을 하기 때문에, 프레젠터가 복잡해질 수 있습니다. 또한, 뷰와 프레젠터 간의 강한 결합이 문제가 될 수 있습니다.
보완점: MVVM은 이러한 결합을 느슨하게 하고, 데이터 바인딩을 통해 뷰의 로직을 줄이는 방향으로 발전했습니다.

  1. MVVM (Model-View-ViewModel)

단점: 복잡한 데이터 바인딩으로 인해 디버깅이 어려울 수 있습니다. 또한, 큰 프로젝트에서 ViewModel이 과도하게 복잡해질 수 있습니다.
보완점: 클린 아키텍처는 이러한 복잡성을 줄이고, 더 명확한 분리를 통해 유지 보수성을 향상시키려는 목적을 가지고 있습니다.

  1. 클린 아키텍처 (Clean Architecture)

특징: 각 계층의 명확한 분리를 통해 시스템의 유연성과 유지 보수성을 높입니다. 이는 MVVM과 같은 패턴을 포함하여 다양한 아키텍처와 결합될 수 있습니다.
보완점: 클린 아키텍처는 특정 아키텍처의 단점을 보완하기보다는, 소프트웨어 설계의 근본적인 원칙에 중점을 두고 있습니다.

종합적으로, 이러한 패턴들은 서로의 단점을 보완하며 발전해왔으며, 각각의 패턴은 특정한 상황과 요구 사항에 맞춰 선택되어 사용됩니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants