지난 글에서 REST, REST API, RESTful API에 대해 알아보았다면 이번엔 MVC패턴에 대해 알아보자
사실 MVC패턴은 내가 가장 많이 접해본 웹 디자인 패턴이다.
스프링 공부하면서 들었던 강의 중 '스프링 MVC - 1,2편'이 있기에 혼자 토이프로젝트 만들어 볼 때도 이 MVC패턴을 적용하여 웹서버를 구성했었다.
MVC패턴
MVC패턴(Model-View-Controller)패턴은 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴이다.
소프트웨어를 3가지 구성 요소로 구성하는데 이름에서부터 알 수 있듯
로 구성되어 있다.
각 요소들에 대해 살펴보면
데이터와 비즈니스 로직을 담당하는 부분 즉 앱이 포함해야할 데이터가 무엇인지를 정의해준다.
데이터의 상태가 변경되면, 모델은 일반적으로 뷰에게 알리며 가끔 컨트롤러에게 알리기도 한다.
조금 더 쉽게 이야기 하자면, 말 그대로 정보, 데이터 즉 우리가 만든 객체가 될 수도 있고, DB에 있는 값일 수도 있고, 여러가지 종류의 데이터들을 책임지는 것이다.
필자는 모델을 'View나 Controller에서 사용할 수 있도록, 가공된 데이터'라고 이해하였다.
모델은 그저 데이터를 전달할 뿐이다 모델이 이 데이터를 가지고 무언가를 하는 것은 아니다. 그렇기에 뷰나 컨트롤러에 대해 어떤 정보도 알지 못한다.
모델은 재사용 가능하고 다른 인터페이스에서도 변하지 말아야 하며, 독립적이어야 한다. 이 특징 덕분에 유지보수성과 확장성이 향상된다.
모델의 정보가 변경된다면, 이벤트를 발생시켜 누군가에게 전달해야 하며, 누군가 모델을 변경하도록 요청하는 이벤트를 보냈을 때 이를 수신할 수 있는 처리 방법을 구현해야만 한다.
모델이 데이터부분을 담당했다면, 뷰는 사용자에게 정보를 표시하고 입력을 처리하는 등 모델의 데이터를 시각적으로 표현하고 사용자와 상호작용을 담당한다.
간단하게 앱의 데이터를 보여주는 방식을 정의해준다고 생각하면 된다.
뷰에서 보여주는 데이터는 모델로부터 받는데 이 정보를 유지하기 위해 뷰 내부에 임의로 저장해서는 안된다.
모델과 같이 자기 자신을 제외하고는 어떻게 동작하는지 알아선 안되며, 변경이 일어났을 때 변경을 알려주는 방법을 구현해야 한다.
재사용 가능하게끔 설계해야하며, 다른 정보들을 표현할 때 쉽게 설계해야 한다.
모델과 뷰 간의 상호작용을 조정하는 마치 다리와 같은 요소이다.
파이썬의 Django를 사용해보았다면 urls.py의 urlPatterns같은 느낌이라고 보면 된다.
위에서 모델이나 뷰는 자신을 제외한 것들은 몰라야 하기에 변경을 외부로 알리고, 수신하는 방법만 가지도록 한다고 하였는데, 컨트롤러는 그 둘을 중재해야 하기에 모델과 그와 관련된 뷰에 대해 알고 있어야 한다.
모델이나 뷰의 변경을 알게되면 이를 해석해 각각의 구성요소에게 통지를 해야한다 그렇기에 컨트롤러는 항상 모델이나 뷰의 변경을 모니터링 해야 한다.
즉 컨트롤러는 '모델과 뷰 사이를 이어주는 다리이며, 둘의 업데이트도 담당한다.'라고 생각하면 된다.
MVC패턴은 즉 <데이터처리 - 시각적 페이지 - 그 둘의 다리>로 구성하는 패턴인 것이다.
MVC패턴을 사용하면 각 구성요소간 의존성이 낮아지기에 코드의 재사용성과 유지보수성이 향상됨은 물론, 개발자는 각 구성요소를 독립적으로 테스트할 수 있어 개발 과정이 더욱 효율적으로 진행된다.
참고로 MVC패턴을 사용하는 프레임워크나 라이브러리로
등이 있다.