공부기록

MVC Pattern 본문

Programming/Design Pattern

MVC Pattern

코타쿠 2021. 5. 30. 16:43

MVC?

Model View Controller (MVC) 디자인 패턴은 어플리케이션이 model, presentation information, control information으로 구성되는 것을 명시한다. 이 패턴은 이 것들이 서로 다른 객체로 나누어지는 것을 필요로 한다.

MVC는 완전한 어플리케이션이 아닌 구조적인 패턴에 더 가깝다. MVC는 대개 어플리케이션의 UI / 상호작용 계층에 더 관련된다. 당신은 여전히 비지니스 로직계층과, 서비스 계층, 그리고 데이터 엑세스 계층이 필요할 것이다.

img

위 그림의 각 구성요소의 특성은 아래와 같다.

Model

Model은 오직 어플리케이션 데이터, 비지니스 로직을 포함하며, 어떻게 유저에게 정보를 제공할 지에 대한 정보를 전혀 가지지 않는다. 웹 어플리케이션에서 DB와 데이터를 조작하는 기능에 해당한다. 모델은 아래와 같은 3가지 기능을 제공해야 한다.

  1. Querying : 모델은 상위 계층에 정보를 제공해야 한다.
  2. Altering : 모델은 정보를 변경하는 기능을 제공해야한다.
  3. Notifying : 정보의 상태가 바뀌면 변화를 알리는 기능을 제공해야한다.

VIew

View는 유저에게 모델의 정보를 제공한다. 뷰는 모델의 데이터에 접근하는 법을 알지만, 이 데이터가 무엇을 의미하는지 또는 사용자가 데이터를 조작하기 위해 무엇을 할 수 있는지에 대한 정보를 가지지 않는다. 웹 어플리케이션에서 HTML과 데이터에 동적으로 반응하는 코드에 해당한다.
view는 다음과 같은 기능을 수행해야 한다.

  1. 데이터를 보여주어야 한다.
  2. 입력장치 입출력에 대한 이벤트를 처리해야한다.
  3. 모델의 알림에 반응하여 변화된 정보를 반영시켜야 한다.

view는 다음과 같은 것을 해서는 안된다.

  1. UI 이벤트에 인해서 model을 직접 조작해서는 안된다.
  2. model 데이터를 저장하거나, model이 하는 일을 해서는 안된다.

Controller

Controller는 view와 model 사이에 있다. 이것은 view나 다른 외부로부터 발생한 이벤트를 듣고 이 이벤트들을 프로세싱하여 모델로 전달한다. 대부분의 경우, 이 반응은 model로부터 메서드를 호출하는 것이다. view와 model이 (notification mechanism을 통해) 연결되어 있기 때문에, 메서드가 호출된 결과는 자동으로 view에 반영된다.
컨트롤러와 뷰는 강한 상호의존 관계를 가지고 있다. 뷰가 이벤트를 받으면, 그것은 대응하는 컨트롤러 메서드의 호출로 이어지고, 그것은 모델의 메서드의 호출로 이어지게 된다.
컨트롤러는 뷰와 모델에 대한 참조를 가지고 있으며 그들의 인터페이싱을 담당하고 있다.

아래의 코드는 MVC 패턴의 예시이다.

class Student 
{
    private String rollNo;
    private String name;

    public String getRollNo() 
    {
        return rollNo;
    }

    public void setRollNo(String rollNo) 
    {
        this.rollNo = rollNo;
    }

    public String getName() 
    {
        return name;
    }

    public void setName(String name) 
    {
        this.name = name;
    }
}

class StudentView 
{
    public void printStudentDetails(String studentName, String studentRollNo)
    {
        System.out.println("Student: ");
        System.out.println("Name: " + studentName);
        System.out.println("Roll No: " + studentRollNo);
    }
}

class StudentController 
{
    private Student model;
    private StudentView view;

    public StudentController(Student model, StudentView view)
    {
        this.model = model;
        this.view = view;
    }

    public void setStudentName(String name)
    {
        model.setName(name);        
    }

    public String getStudentName()
    {
        return model.getName();        
    }

    public void setStudentRollNo(String rollNo)
    {
        model.setRollNo(rollNo);        
    }

    public String getStudentRollNo()
    {
        return model.getRollNo();        
    }

    public void updateView()
    {                
        view.printStudentDetails(model.getName(), model.getRollNo());
    }    
}

class MVCPattern 
{
    public static void main(String[] args) 
    {
        Student model  = retriveStudentFromDatabase();

        StudentView view = new StudentView();

        StudentController controller = new StudentController(model, view);

        controller.updateView();

        controller.setStudentName("Vikram Sharma");

        controller.updateView();
    }

    private static Student retriveStudentFromDatabase()
    {
        Student student = new Student();
        student.setName("Lokesh Sharma");
        student.setRollNo("15UCS157");
        return student;
    }

}

MVC 패턴의 장점

  • 여러 명의 개발자가 동시에 model, view, controller에 대한 작업이 가능하다.
  • MVC는 컨트롤러 상의 관련된 행위들 간의 논리적인 grouping을 가능하게 한다. 특정한 모델을 위한 view들도 grouping 될 수 있다.
  • 모델이 여러 개의 view를 가질 수 있다.

MVC패턴의 단점

  • 새로운 추상적인 계층이 생겨나고, 개발자가 MVC의 분해 하는 철학을 적용해야 하기 때문에 개발이 복잡해 질 수 있다.
  • 여러가지 기술에 대한 지식이 표준이 되어버린다. MVC를 사용하는 개발자들은 여러 기술들에서 숙련되어 있어야한다.

WEB에서의 MVC

Model

  • ORM, 또는 SQL을 통해 DB와 상호작용 한다.
  • 비지니스 로직을 담당한다.
  • web request (GET/POST), response cycle(HTML rendering)에 대한 일은 일절 하지 않는다.

View

  • end-user rendering(HTML, JS), 또는 데이터를 주는 코드를 다룬다.
  • web request와 데이터소스에 대해서는 관련하지 않는다.

Controllers

  • web request를 담당한다.
  • model 객체 생성을 관리한다.

출처

https://www.geeksforgeeks.org/mvc-design-pattern/
https://velog.io/@ljinsk3/MVC-%ED%8C%A8%ED%84%B4
https://www.rareparts.com/pdf/MVC.pdf
http://poincare.matf.bg.ac.rs/~andjelkaz/pzv/cas4/mvc.pdf
https://stefanoborini.com/book-modelviewcontroller/

'Programming > Design Pattern' 카테고리의 다른 글

객체지향설계 : SOLID 원칙  (0) 2021.10.02