MVC 패턴은 가장 대중적인 프로그래밍 패턴이라고 생각합니다 그만큼 개발자에게 편리함을 가져다주었던 좋은 패턴이었습니다.


하지만 기술이 진보하며 앱이 점점 커지고 복잡해져 30–40 개가 넘어가는 스크린을 MVC 패턴으로 관리하기에 한계가 느껴질 수 있습니다.

위의 이유로 Model . View. Controller (MVC) 가 아닌 Massive View Controller 라고 놀림 당하고 있습니다…

저도 앱을 개발하다보면 View controller가 뚱뚱해지는것은 부정할 순 없습니다.

위와 같은 이유로 오늘은 아직 대중적이지는 않지만 반응이 괜찮은 Clean Swift에 관하여 포스팅 하겠습니다.


Clean Swift?

Clean swift는 프레임워크가 아닌 템플릿으로 V.I.P 패턴을 쉽게 사용하게 만들어주는 템플릿입니다.

https://clean-swift.com/ 접속해보면 처음 보이는 페이지에서 아래와 같은 문제를 해결해 줄 수 있다고 하는 것 같습니다.


  1. ViewController가 방대해져 이해 및 버그 수정 그리고 새로운것을 추가하기 힘든 문제
  2. 1과 같은 문제로 Model 클래스로 비지니스 로직을 옮겼지만 , 모델 또한 뚱뚱해지는 문제
  3. 앱이 하나의 거대한 스토리보드를 사용하는 문제
  4. 버그가 생겨 재현하는데 4시간을, 그리고 그것을 고치는데 1주일을 낭비하느라 아무데도 가지 못하는 문제
  5. 코드에 무언가를 추가하기 위해서 처음부터 다시 리,리,리 팩토링 하는 문제
  6. TDD기법이 제대로 활용이 안되는 코드


각각 scene에 대하여 5가지 컴포넌트로 구성이 되며 컴포넌트각 상호작용이 프로토콜로 이루어집니다. (ViewController, Model, Interactor, Presenter, Router)



https://medium.com/swift2go/installing-the-clean-swift-template-in-xcode-6b4367006827 템플릿설치 방법이 설명되어있습니다.

File -> New File -> File 아래에 스크롤 하여 Clean Swift 영역에서 Scene 이용하여 파일을 생성하면 아래와 같이 5개의 파일이 자동으로 생성됩니다.





• Model.swift



Models - 컨트롤러와 관련된 모든 모델을 저장.


  • Requset -API request에 보내지는데 필요한 파라미터


  • Response -API로부터 response를 intercept 하고 데이터를 저장


  • ViewModel -UI에 관련된 모든것을 저장


• Worker.swift



Worker - API/CoreData 요청 및 응답을 관리한다. Interactor에게 줄 데이터를 준비한다


Interactor.swift



Interactor -Worker 와 Presneter 사이의 중개자이다.

VC -Model (request) -Interactor -Worker -Model (response) -interactor -presenter 와 같은 흐름이다.


• Presenter.swift



Presenter -Interactor로 부터 받은 데이터를 ViewModel에 맞게 정형화하고 뷰컨트롤러에 전송한다. 즉 사용자에게 데이터를 어떻게 보여질지 결정한다


• Router .swift



Router -뷰컨트롤러 사이에서 데이터 transition과 passing을 관리한다.


이렇게 구조에 대해서 설명해드렸습니다.


기본 템플릿으로 설명을하여 구조의 흐름이 잘 이해가 안가실수도 있습니다.


https://github.com/Clean-Swift/CleanStore 에서 예제 프로젝트를 다운 및 https://hackernoon.com/introducing-clean-swift-architecture-vip-770a639ad7bf 에서 더 자세한 설명을 보실 수 있습니다.


한 view당 5개의 컴포넌트로 구성되어 복잡하실 수도 있지만 코드에 break point 찍으면서 따라가시면 금방 구조를 이해하실 수 있습니다.

빠른 시일내에 직접 예제 프로젝트를 만들어 포스팅하도록 하겠습니다.


이상.