티스토리 뷰
서버 개발자로 지원할때(웹 프론트나 모바일 애플리케이션은 지원해본적이없어서 모르겠다) 단골로 등장하는 질문이다.
MVC패턴에 대해 설명해주세요
누군가가 이것에대해 설명해달라고하면 늘 두루뭉실하게 대답하는 것 같아서 이번 기회에 제대로 정리를 해두려고 한다.
MVC Pattern
바퀴를 재발명하지마라. 라는 유명한 말이 있다. 어떤 프로젝트를 개발할때 처음부터 모든것을 하나하나 스스로 개발하려고 한다면 엄청난 노력과 시간이 걸릴 것이다. 또한 누군가가 자신의 입맛대로 만든다면 추후에 다른 개발자가 유지보수하기에도 힘들 것이다. 이에 대해 유지보수를 포함한 모든과정을 보다 쉽고 편리하게 만들기위해 디자인패턴이라는 것이 존재한다.
디자인패턴이란?
프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 상황에 따라 간편하게 적용해서 쓸 수 있있도록 정리한 특정한 "규약"을 통해 쉽게 쓸 수 있는 형태로 만든 것.
[출처] [개발자 면접준비]#1. MVC패턴이란 | 작성자 큰돌
결국 MVC패턴도 웹이나 모바일 앱 서비스를 개발하는 과정을 보다 효율적으로 만들기위한 디자인패턴 중 하나이다.
MVC패턴은 Model - View - Controller의 약자이다.
유저가 필요한 어떤 데이터가 존재한다고 하면
- 그 어떤 데이터를 정의하고 데이터 자체에 대한 로직을 처리하는게 Model
- 모델이 갖고있는 데이터를 화면에 보여주는게 View
- 모델과 뷰를 연결하는게 Controller
이다.
그림으로 표현하면 위와같다.
Model
애플리케이션이 가지고 있어야할 데이터를 정의한다.
예를들면 알고리즘, 데이터베이스, 초기값, 변수 등이 있고, 이러한 데이터(정보)들의 가공을 책임지는 컴포넌트를 말한다.
Model은 컨트롤러에서 수행할 내용을 받아 데이터에 대해 짜여진 코드, SQL을 수행하고 결과물을 Controller로 반환하는 역할을 한다. 쉽게말해 데이터와 그 데이터를 처리하는 로직을 가지고 있다.
또한 모델에는 뷰나 컨트롤러의 정보가 전혀 없다. 단지, 정보만 반환하거나 설정할 수 있다.
스프링을 사용한다면 이에대해 DAO, DTO, VO, Entity 의 개념도 존재한다. 처음에 제대로 기초가 잡혀있지 않은상태에서 무작정 이것들에 대한 개념만 외우는식으로 받아들이다보니 머릿속이 혼란스러웠다.
우선은 Model에 대해서만 정리하고 나중에 이 내용과 연계해서 DAO와 DTO와 같은 객체들에 대해서도 정리해봐야겠다(간단하게 모델과 컨트롤러, 데이터베이스를 연결해서 정보를 전달해주는 객체역할이라고 생각하면 된다고 한다.)
View
모델이 가지고있는 정보를 사용자에게 보여주는 부분, User Interface를 뜻한다.
여기서 중요한것이 모델이 가지고있는 정보(데이터)를 뷰는 별도로 저장하지 않는다.
뷰는 단지 모델이 정의한 데이터를 보여주는 역할만하고 무슨 데이터를 보여주는지는 컨트롤러가 뷰에게 알려줄것이다.
또한, View가 입출력하는 모든 데이터는 Model이 정의한 데이터여야한다.
(나는 Model -> 무엇을, Controller -> 모델이 무엇을 어떻게, View -> 무엇을 보여주는 틀이라고 이해했다)
Controller
위에서 모델과 뷰는 독립적이라고 했는데, 이 둘을 연결해주는 징검다리 역할을 하는것이 컨트롤러이다.
예를들어,
사용자가 버튼을 클릭하면 이벤트는 뷰에서 발생하지만 내부 처리는 컨트롤러에서 관리하는 것입니다.
또한, 입력이 발생하면 이에 대한 통지를 담당합니다.
출처 [Design Pattern] MVC(Model-View-Controller) 패턴 이야기 #1 (tistory.com)
위 예시에서 버튼클릭이라는 이벤트에 대해
1. View에서 버튼 클릭같은 이벤트가 발생
2. Controller는 Model에게 수행할 메소드와 파라미터를 전송
3. Model은 메소드를 수행한 결과를 Controller에게 반환
4.Controller는 그 내용을 View로 반환하게 된다
의 순서로 진행된다.
이 과정을 그림으로 표현하면 아래와 같다.
위 과정을 좀 더 일반화해서 설명하면
1. 유저가 컨트롤러에 요청을 보냅니다.(예시 : 뷰에 있는 Submit 버튼을 누른다)
2. 컨트롤러가 모델에 요청사항대로 데이터를 수정할 것을 지시합니다.
3. 모델은 지시받은대로 데이터를 수정하고 컨트롤러에게 완료되었음을 알려줍니다.
4. 컨트롤러는 수정된 데이터를 토대로 표시할 뷰를 결정하고 화면을 출력할 것을 지시합니다.
5. 뷰는 지시받은대로 화면을 출력합니다.
출처 : 장고(Django) - MVC패턴과 MTV패턴 (tistory.com)
MVC 패턴을 간단하게 보자면
View에서 특정 이벤트를 수행했을 경우
Controller에서 이벤트에 해당하는 메소드를 Model로 보내면
Model에서 수행해서 결과를 가져온 뒤
이벤트 결과를 View에 적용시킨다
출처 : MVC 패턴 예제 및 동작방식 정리글 (tistory.com)
MVC 패턴에대해 정리해놓은 글들을보면 무슨말인지 설명을 이해하기 어려웠는데 위 말이 가장 쉽고 직관적으로 설명한 것 같다.
MVC Pattern의 한계
웹 서비스 개발 과정을 더 효율적으로 만들어주지만 MVC 패턴도 한계가 존재한다고 한다.
" MVC패턴은 각각의 구성 요소가 분리되어 본연의 역할에만 충실한 구조이므로 유연성이 높고 유지보수가 용이하며 개발자와 디자이너의 작업 영역을 분리할 수 있다는 장점이 있습니다.
하지만 프로젝트의 규모가 커질수록 컨트롤러가 비대화되고 모델과 뷰의 의존성을 완벽히 분리할 수가 없기 때문에 유지보수가 점점 어려워진다는 단점이 있습니다. "
출처 : 장고(Django) - MVC패턴과 MTV패턴 (tistory.com)
컨트롤러에 대응되는 모델이 많아질수도 있고, 모델과 뷰의 의존성을 완벽하게 분리할수 없다고 한다.
컨트롤러에 대응되는 모델이 많아지고 이 모델과 의존되는 뷰도 많아지면 컨트롤러가 비대해지고 Model, View, Contoller의 구조는 복잡해질 수 밖에 없을 것이다.
이러면 새 기능을 추가할때마다 크고 작은 문제점이 생길 수 있고 그만큼 유지보수하기도 어려워 질 것이다.
이처럼 컨트롤러에 대응되는 모델이 많아져서 컨트롤러가 비대해진 구조를 MassiveViewController 라고 한다.
이와같은 MVC 패턴의 한계를 개선한 모델로 MVP, MVVM 패턴등이 존재한다고 한다.
출처 : [아키텍처 패턴] MVC 패턴이란?. MVC (Model-View-Controller) Pattern 은… | by Clint Jang | Medium
출처 : 장고(Django) - MVC패턴과 MTV패턴 (tistory.com)
출처 : MVC - 용어 사전 | MDN (mozilla.org)
출처 : [Design Pattern] MVC(Model-View-Controller) 패턴 이야기 #1 (tistory.com)
출처 : MVC 패턴 예제 및 동작방식 정리글 (tistory.com)
출처 : [Spring] MVC Model 2 (tistory.com)
'Web' 카테고리의 다른 글
URL과 URI의 차이 (0) | 2021.07.26 |
---|---|
HTTP 프로토콜 (0) | 2021.07.21 |
[Django] MVC 패턴과 MTV 패턴 (0) | 2021.07.14 |
MVC 패턴과 데이터 접근 (0) | 2021.07.14 |
Restful API 서버 구현과 JSON (0) | 2021.04.15 |