본문 바로가기

호기심 천국

MVC

철 울타리 위에 앉은 참새.  Unsplash 에 Cherylyn Ang 님이 올림.

들어가는 말

이 글에서는 MVC 디자인 패턴의 특징과 개인적으로 생각하는 장단점을 알아봅니다. 제가 웹 프론트엔드 개발자라서 이쪽으로 시선이 치우쳐져 있음을 양해 부탁드려요.

목적

  • "관심사의 분리"
  • 데이터 객체가 얼마나 크고 복잡하든 상관하지 않고 그것을 시각적으로 표현할 수 있도록 하기 위함
  • 역할과 책임에 따라 소프트웨어 구조를 나누어 개발하기 위함

모델

  • 실제로 표현된 정보
  • 웹 개발에서는 서버의 로직을 모델이라고 생각하면 편함
  • 우리가 흔히 게임 캐릭터를 보고 '데이터 쪼가리'라 칭할 때, 그 '데이터 쪼가리'가 모델이라고 이해해도 될 듯?

  • 사용자에게 정보를 주거나, 사용자의 행동을 입력받음
  • 모델의 시각적 표현
  • 우리가 흔히 '게임 캐릭터'를 보고 데이터 쪼가리라 칭할 때, 그 '게임 캐릭터'가 뷰라고 이해해도 될 듯?
  • 형태 1: 모델한테 직접 정보를 받아서 화면을 그리기
  • 형태 2: 컨트롤러를 이용해 모델에게서 정보를 받아서 화면을 그리기

컨트롤러

  • 모델과 뷰를 연결
  • 입력을 받아 모델이나 뷰를 위한 어떤 명령어들로 바꿈
  • 하나의 컨트롤러는 여러 개의 뷰와 연결되어 있을 수 있음

장단점과 개인 의견

저는 MVC 패턴의 핵심은 '모델의 독립'이라고 생각합니다. MVC가 진정으로 관심사의 분리를 이루어내는데 성공했는지에 대한 의견은 분분하겠지만 그건 뷰와 컨트롤러에 대한 이야기입니다. 모델 자체는 독립하는 데 성공했어요. 모델은 자기 자신이 사람들 눈에는 어떻게 보여야 하는지 신경 쓸 필요 없이 개발과 테스트가 가능합니다.

 

MVC의 특징은 사실 '근본'이라는 거예요. 아래에서 이야기할 MVP나 MVVM도 결국 MVC로부터 출발했고, GUI의 발달 초창기에 제시된 중요한 개념입니다. 1970년대 후반에 나온 만큼 굉장히 오래되었다고 할 수도 있는데요. MVC 패턴의 장점은 이 특징에서 기인합니다. 초창기에 나왔기 때문에 패턴의 제작과 도입이 다른 패턴들에 비해 상대적으로 간단해요. 마치 고대 지식인들이 머리를 맞대고 내놓은 피타고라스의 정리가 지금은 중학생들이 알아야 하는 상식이 되어버린 것과 비슷하지 않을까요?

 

단점 역시 개인적으로는 나온 지 오래 된 패턴이라서 생기는 것 같습니다. 저는 MVC를 찾아보면서 무언가 정해진 제약이 거의 없다는 느낌을 받았어요. 당장 위키피디아의 정보만 봐도 MVC 패턴에서 모델의 정보를 얻어오는 방식이 크게 두 가지로 나뉘었었습니다. 하나는 뷰가 모델에게 직접 연락해서 값을 받아오는 방법이었고, 다른 하나는 뷰가 컨트롤러를 통해 모델에게 연락해서 값을 받아오는 것이었습니다.


만약 뷰가 모델에게서 직접 값을 받아온다면 또 복잡해질 수 있습니다. 사용자가 입력한 자연수를 무지갯빛으로 꾸며서 보여주는 화면이 있다고 칩시다. 자연수만 입력해야 하는 어떤 양식에 사용자가 음수를 입력해서 보내는 경우, 컨트롤러 단에서 이걸 처리해서 모델에게 알리지 않고 오류 문구를 뷰에게 전달할 수 있습니다. 뷰의 입장에서 숫자는 모델에게서, 오류 문구는 컨트롤러에게서 받아와야 하는 셈입니다.


뷰가 모델에게서 받아온 객체 자료를 컨트롤러를 통해서 좀 가공한 다음 보여줄 수도 있습니다. 아니면 애초부터 컨트롤러를 시켜서 모델에게서 받아온 뒤 알아서 가공해서 보여달라고 할 수도 있고요. 제가 받은 MVC의 느낌은 소통의 방식이 어떤 규칙적인 흐름에 매여있다고 보기 힘들다는 것이었습니다.

 

이런 자유도는 작은 서비스를 만드는 데는 효율적일 수 있습니다. 하지만 코드가 길어지고 개발자가 많아질수록 통일된 코드를 구현하기에는 힘들겠다는 생각이 들어요.

두 가지 형태의 MVC 패턴에 대한 상상도.

 

인터넷에서 MVC 패턴을 찾아보면 위 그림과 같이 크게 두 형태로 나뉩니다. 그 이유 역시 MVC 패턴 자체가 나온 지 오래되어 50년이라는 세월 동안 사람마다 생각하는 구현체나 방법이 다 달라서 그렇게 된게 아닌가 합니다. 따라서 MVC 패턴을 썼다고 할 때, 단순하게 그걸 쓴 게 아니라 조금 더 구체적으로 어떤 방식으로, 누가 어떤 역할을 담당할 것인지 규칙을 확실하게 정해야 한다고 생각해요.

참고 자료

Model-View-Controller - Wikipedia
MVC - MDN Web Docs Glossary
Overview of ASP.NET Core MVC | Microsoft Learn
Trygve Reenskaug(1979). Models-Views-Controllers
한 번의 글로 이해하는 소프트웨어 아키텍처 패턴 ( MVC, MVP, MVVM )