MVC(Model, View, Controller)는 소프트웨어 설계 패턴 중 하나로, 애플리케이션의 구조를 모델, 뷰, 컨트롤러로 나누어 유지보수와 확장성을 높이는 방식이다.
디자인패턴이란 개발하면서 발생하는 반복적인 문제들을 어떻게 해결 할 것인지에 대한 해결 방안이다.
애플리케이션의 데이터 및 비즈니스 로직을 처리하는 부분이다.
데이터베이스와 직접 연결되며, 데이터를 가져오거나 저장하는 역할을 한다.
사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
View나 Controller에 대해서 어떤 정보도 알지 말아야 한다.
변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
사용자에게 데이터를 표시하는 역할이다.
Controller를 통해 Model에게 받은 데이터를 화면에 렌더링하며, 비즈니스 로직을 포함하지 않는다.
HTML, JSP, React, Vue 등 UI 와 관련된 코드이다.
Model이 가지고 있는 정보를 따로 저장해서는 안된다.
Model이나 Controller를 알고 있을 필요가 없다.
변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 한다.
<h1>사용자 정보</h1>
<p>이름: ${user.name}</p>
<p>나이: ${user.age}</p>
사용자의 요청을 처리하고, Model과 View를 연결한다.
Model로부터 데이터를 가져와 View 로 전달하고, 비즈니스 로직을 수행하는 Model을 호출하는 역할을 한다.
모델이나 뷰에 대해 알고있어야 한다.
모델이나 뷰는 서로의 존재를 모르고 변경을 외부에 알리고 수신하는 방법만 가지고 있다. 이를 컨트롤러가 중재하기 위해 모델과 그에 관련된 뷰에 대해 알고있어야 한다.
모델이나 뷰의 변경을 모니터링 해야 한다.
모델이나 뷰의 변경 통지를 받으면 이를 해석해서 각각의 구성 요소에게 통지를 해야 한다.
또한 애플리케이션의 메인 로직은 컨트롤러가 담당하게 된다.
@Controller
public class UserController {
@GetMapping("/user")
public String getUser(Model model) {
User user = new User("Alice", 25);
model.addAttribute("user", user);
return "userView"; // userView.jsp 로 이동
}
}
애플리케이션의 구조를 Model, View, Controller로 나눔으로서 해당 기능에 집중 할 수 있게되어 여러가지 이점이 생긴다.
역할이 분리되어 있어 수정이 쉬워져 유지보수 용이해진다.
Model, View, Controller를 독립적으로 관리할 수 있게 되어 재사용성이 높아지고, 협업에서의 장점이 있다.
프로젝트가 커질수록 Controller의 복잡성이 커지고, View와 Model이 많아질수록 Controller의 로직이 증가하여 비대해진다.
코드가 분산되어 디버깅과 유지보수가 어려워 질 수 있다.
View가 Mdoel의 특정 속성에 의존되는 경우가 많아, Model과 View의 완벽한 분리가 어려울 수 있다.
비즈니스 로직이 많아질수록 Controller가 비대해지는 문제 발생.
Service 레이어를 추가해 해결할 수 있지만, 그 과정에서 추가적인 복잡성이 증가함.
MVC 패턴은 사용자의 이벤트를 즉각적으로 처리하기 어령ㅂ다.
View에서 Model을 변경하려면 Controller를 거쳐야 하므로 복잡한 구조가 된다.
실시간 UI 업데이트가 필요한 경우 MVC 패턴이 적합하지 않을 수 있다.