MVC 패턴

waonderboy·2022년 3월 10일
3

목록 보기
2/2
post-thumbnail

💡
많은 컴퓨터 시스템의 목적은 데이터 저장소에서 데이터를 검색하여 사용자에게 표시하는 것입니다. 사용자가 데이터를 변경한 후 시스템은 업데이트를 데이터 저장소에 저장합니다. 정보의 주요 흐름은 데이터 저장소와 사용자 인터페이스 사이에 있기 때문에 코딩 양을 줄이고 응용 프로그램 성능을 향상시키기 위해 이 두 부분을 함께 묶는 경향이 있을 수 있습니다. 그러나 이 방식에는 중요한 문제가 있습니다. 그것은 사용자 인터페이스가 데이터 저장 시스템보다 훨씬 더 자주 변경되는 경향이 있다는 것입니다. 또 다른 문제는 비즈니스 응용 프로그램이 데이터 전송을 훨씬 능가하는 비즈니스 논리를 통합하는 경향이 있다는 것입니다.
출처 - Microsoft 문서


사용자 인터페이스 로직은 특히 웹 기반 응용 프로그램에서 비즈니스 로직보다 더 자주 변경되는 경향이 있다. 예를 들어, 다른 언어로 개발되거나 새로운 사용자 인터페이스 페이지가 추가되거나 기존 페이지 레이아웃이 바뀌는 등의 경우가 있다. 이때 MVC패턴을 사용하면 매번 어플리케이션을 재 배포할 필요 없이 언제든지 사용자 인터페이스를 변경할 수 있다.

MVC 디자인 패턴

MVC (Model-View-Controller)

💡 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에 연결되어야 한다. 즉. 서비스 계층을 그 사이에 둘 수 있지만 엄격한 정의에 따르면 이는 도메인의 일부라 볼 수 있다.



MVC패턴 예제 코드

🚥 시작하기 앞서
객체의 특징을 명확히 나타내는 클래스 명을 사용하지 않고 이해를 위해 단순히 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;
    }



정리

  • MVC 패턴은 뷰와 모델을 컨트롤러를 통해 분리하고자 하는 목적이 있다.
  • 모델은 내부 비즈니스 로직을 처리하고 디비의 데이터를 변경하는 트랜잭션을 다루는 역할을 한다
  • 뷰는 사용자 인터페이스에 데이터를 보여주는 역할을 한다
  • 컨트롤러는 뷰의 데이터를 전달해 모델의 메소드를 호출하며, 처리된 데이터를 받아 뷰에 전달해주는 역할을 한다.








Reference

https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649643(v=pandp.10)?redirectedfrom=MSDN
https://www.geeksforgeeks.org/mvc-design-pattern/

profile
wander to wonder 2021.7 ~

0개의 댓글