[iOS] MVC 와 MVVM에 대한 고찰

devming
5 min readDec 8, 2020

--

작년 여름에 MVC와 MVVM이 무엇인지 깊게 고민했던 경험 2가지를 나누고자 글을 쓰게 되었습니다.

이번에 회사에서 진행할 프로젝트를 시작하기에 앞서 무엇을 해야할까를 고민하던 중, 아키텍쳐를 공부하면서 프로젝트에 제대로 적용해보기로 했습니다.

그리고 클린아키텍쳐에 대해 공부를 하던 중, 동료 서버 개발자로부터 한가지 질문을 받았습니다.

“ 매튜! 모바일에서 사용하는 MVVM에 대해 설명해주세요. “

….

너무 갑자기 받은 질문에 면접을 보는 기분이었는데요.

아무튼 마음을 가다듬고 차분히 설명해드렸어요.

“간단히 말해 ViewModel을 통해 비즈니스 로직을 처리하고 Model과 View간에 의존성이 생기지 않도록한다. 정도로 볼 수 있겠네요.”

“ 그러면 MVC하고는 뭐가 다르죠? “

“기존 MVC에서 컨트롤러는 개발하다 보면 비즈니스 로직을 컨트롤러 안에서 모두 포함하게 되는 경우가 많았기 때문에, 이를 ViewModel로 분리하여 컨트롤러를 더 가볍게 만들어 주는 효과도 있습니다.”

사실 이 때 말하고 나서도 이게 맞나 싶어서 찾아보고 공부하면서
MVVM을 왜 쓰는 건지 진짜 의미를 처음 알게되었습니다.

사실 제가 MVVM에 대해 아는 지식이 딱 저게 끝이었습니다.

제게 MVVM을 쓰는 이유는 단지 ViewController가 무거워져서 ViewModel로 나누어서 클래스를 분할 하려고 사용했던 것이었습니다…🙄

지금 생각해보면 저렇게 썼을 경우에는 당연히 ViewModel을 사용하는 MVVM의 필요성을 느끼지 못하는게 당연한 것 같습니다.

기존에 제가 구현했던 코드들은 기껏 해봤자 클래스 분할 정도로만 썼으니 SOLID원칙 중 단일 책임의 원칙(사실 따져보면 그마저도 여러 기능들이 있어서 지키지 못했겠지만…😭)정도만 지키려고 노력했다고 볼 수 있을 것 같아요.

그런데 여러 글을 보고, 직접 예제코드를 작성하며 공부를 하면서 느낀 점은
MVVM의 핵심은 그게 아니었습니다.

View에서는 View를 그리는 로직 및 View에 바인딩하는 로직(ViewController)이 들어있고,
그리고 View에서 들어온 input(Command)을 가지고 ViewModel에서는 비즈니스 로직을 처리하고, output을 view에 바인딩 해주는 것.(Data Binding)

즉 Command 패턴과 Data Binding이 핵심이었습니다.

View에서는 앱에 어떤 명령을 주면, ViewModel에서 처리하고, 데이터를 View에 알아서 바인딩 해주는 시스템을 구축 하는 것이 MVVM 인 것을 깨달았습니다.

그리고 이것을 가장 효과적으로 구현할 수 있도록 도와주는 것이 바로 Rx입니다.

— -

그리고 위의 대화를 통해 얻었던 가장 큰 깨달음.
원래의 MVC 조차 잘못 알고 있었습니다.

저는 MVC에서 M 즉, 모델은 단지 데이터 모델을 가리키고있다고 생각하고 있었습니다.

실제 MVC에서의 M은 데이터모델 뿐만아니라 비즈니스모델까지 포함한 형태라고 합니다.

하지만 실제로 많은 글에서 그렇게 쓰고 있고 저 또한 그렇게 믿어왔습니다.

또한, 제가 봤던 많은 코드들에서 모델에는 데이터 모델만 포함되어 있었기에 더욱 믿어 의심치 않았었죠.

그리고 어떤 글들에서는 모델이 비즈니스 모델까지 포함한다고 적었지만, 예제 코드에서는 그렇지 않은 글들도 본적이 있는 것 같습니다.

그래서 저와 동료 개발자는 이 MVC를 왜곡하기 시작한 누군가가 있다라는 나름의 음모론을 제기했습니다.

그리고 그 용의자로 애플을 꼽았습니다.

그래서 애플이 MVC를 왜곡한 혐의를 입증하기 위해 공식 문서를 참고해보았고,

수많은 iOS개발자를 양성하는 스탠포드의 Paul교수님의 영상(한글을 원하시면 여기)을 참고해보았습니다.

그런데!!

두 가지 자료 모두 MVC에서의 모델은 비즈니스 모델을 포함하고 있다고 명 백 하 게 나와 있습니다.

애플이 설명하는 MVC

그래서 저는 생각했습니다.

프로그래밍에 있어서 아키텍처든, 언어든, 플랫폼이든..

해당하는 환경에 맞게 그 방법론은 진화하고 발전합니다.

그렇기 때문에 뭐 명백하게 누군가가 model을 왜곡했다기 보다는

쓰다보니 자연스럽게 모바일 개발에서의 MVC 그리고 MVVM의 model은

특성상 데이터모델에 더 초점이 맞춰진거라고 결론을 내렸습니다.

저는 이것이 정답이다 아니다라기 보다는 이것에 대해 동료 서버개발자와 토론하면서 너무도 재밌었습니다.

이런 의미있는 토론을 통해 제가 한 걸음 성장하는 기분이었고,

제가 알고 있던 것에 대해 더 깊히 알아야겠다는 생각을 하게 되었습니다.

--

--