💡
많은 컴퓨터 시스템의 목적은 데이터 저장소에서 데이터를 검색하여 사용자에게 표시하는 것입니다. 사용자가 데이터를 변경한 후 시스템은 업데이트를 데이터 저장소에 저장합니다. 정보의 주요 흐름은 데이터 저장소와 사용자 인터페이스 사이에 있기 때문에 코딩 양을 줄이고 응용 프로그램 성능을 향상시키기 위해 이 두 부분을 함께 묶는 경향이 있을 수 있습니다. 그러나 이 방식에는 중요한 문제가 있습니다. 그것은 사용자 인터페이스가 데이터 저장 시스템보다 훨씬 더 자주 변경되는 경향이 있다는 것입니다. 또 다른 문제는 비즈니스 응용 프로그램이 데이터 전송을 훨씬 능가하는 비즈니스 논리를 통합하는 경향이 있다는 것입니다.
출처 - Microsoft 문서
💡 MVC 패턴의 목적은 뷰와 모델의 의존성 을 최소화 하고, 이를 Controller를 통하여 해결하려고 하는 것이다. 즉, 뷰와 모델을 분리하고자 하는 목적이 있다.
MVC패턴은 어플리케이션을 Model
, View
, Controller
역할로 분리하여 개발할 수 있는 디자인 패턴이다. MVC패턴을 잘 활용 하면 사용자 인터페이스로(View)부터 비즈니스 로직(Model)을 분리하여 관리하고, View와 Model의 상호작용을 브릿지 역할을 하는 (Controller)를 통해 처리할 수 있다.
그러면 Model, View, Controller가 각각 무슨 역할을 하는지 알아볼 것이다.
Model
Model
은 내부 비즈니스 로직을 처리하는 역할을 한다. DB와 연결되어 사용자와 상호작용(입, 출력)할 데이터를 다루고 데이터 변경 작업(CRUD)을 하나의 작업으로 묶은 트랜잭션을 다루는 일도 한다. Model
에는 순수한 애플리케이션 데이터만 포함되어 있으며 사용자에게 데이터를 제공하는 로직은 포함되지 않는다.
View
View
는 모델이 처리한 데이터를 사용자에게 시각적으로 제공한다. 예를 들어 HTML, CSS, Javascript를 사용하여 웹 브라우저가 출력할 UI를 만들어 제공하는 방식이 있다. 그리고 View
는 모델에 독립적이다. 모델의 데이터에 액세스하는 방법을 알고 있지만 이 데이터가 무엇을 의미하는지 또는 사용자가 이를 조작하기 위해 무엇을 할 수 있는지는 모른다. 따라서 View
는 사용자 인터페이스를 바꿔도 모델에 영향을 주지 않는다.
Controller
Controller
는 간단히 말해서 전체 메커니즘의 흐름을 제어한다. Controller는 View와 Model 사이에 존재하며 View(또는 다른 외부 소스)에 의해 트리거된 Event 수신하고 이러한 이벤트에 대한 적절한 응답을 하는 역할을 한다. 조금 더 살펴보면 대부분의 경우 Controller
의 응답은 Model에서 메서드를 호출(Domain에 View 데이터를 전달)하고 그 결과 데이터를 View에 전달한다.
정리하자면 Controller
는 어느 정도 도메인 Model
에 연결되어야 한다. 즉. 서비스 계층을 그 사이에 둘 수 있지만 엄격한 정의에 따르면 이는 도메인의 일부라 볼 수 있다.
🚥 시작하기 앞서
객체의 특징을 명확히 나타내는 클래스 명을 사용하지 않고 이해를 위해 단순히 Model, View, Controller라고 나타내었습니다.
Car의 정보를 나타내는 클래스이다.
public class Model {
// Car model class
private String modelName;
private String licensePlate;
private String releaseDate;
private int seatNum;
//...getter setter
}
다음은 차의 정보를 출력하는 View 클래스이다.
public class View {
// View data about car
public void printCarInfo(String Name, String licensePlate, String releaseDate, int seatNum) {
System.out.println("Car model name : " + Name);
System.out.println("Car license plate : " + licensePlate);
System.out.println("Release date : " + releaseDate);
System.out.println("Num of seat : " + seatNum);
}
}
위에서 설명한대로 모델의 메소드를 호출하여 처리된데이터를 viewInfo()
라는 메소드를 통해 뷰에 전달한다. 아래코드를 통해 뷰와 모델은 독립적임을 알 수 있다.
또한, 뷰 인터페이스를 만들어 구체화시키면 얼마든 뷰를 바꿔도 괜찮을 것이다.
public class Controller {
// Transfer data between Model and View
private Model model;
private View view;
public Controller(Model model, View view) {
this.model = model;
this.view = view;
}
public String getCarName() {
return this.model.getModelName();
}
public void setCarName(String name) {
this.model.setModelName(name);
}
public String getLicensePlate() {
return this.model.getLicensePlate();
}
public void setLicensePlate(String licensePlate) {
this.model.setLicensePlate(licensePlate);
}
// .
// .
// . 다른 프로퍼티에 관한 getter setter 메소드는 생략
public void viewInfo() {
view.printCarInfo(model.getModelName(), model.getLicensePlate(), model.getReleaseDate(), model.getSeatNum());
}
}
메인에서 코드가 잘 동작함을 알 수 있다.
public class ModelViewController {
public static void main(String args[]){
System.out.println("This is MVC model!");
Model car = makeCarinfo();
View view = new View();
Controller controller = new Controller(car, view);
controller.viewInfo();
}
private static Model makeCarinfo()
{
Model car = new Model();
car.setModelName("BMW");
car.setSeatNum(5);
car.setReleaseDate("2022");
car.setLicensePlate("111-111");
return car;
}
https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649643(v=pandp.10)?redirectedfrom=MSDN
https://www.geeksforgeeks.org/mvc-design-pattern/