관리 메뉴

나만을 위한 블로그

MVC 패턴이란? 본문

개인 공부/디자인 패턴

MVC 패턴이란?

참깨빵위에참깨빵_ 2020. 11. 27. 00:24
728x90
반응형

먼저 MVC는 Model, View, Controller의 약자다. 이 3가지는 프로젝트의 구성요소를 기준으로 모였다.

그 전에 저 3가지는 각각 뭐하는 놈들일까? 일단 사전에선 뭐라고 말하는지 확인해보자.

 

Model : (보통 실물보다 작게 만든) 모형, (상품의) 모델(디자인)
View : (개인적인) 견해, 의견, 생각, 태도 / 관점 / ~라고 여기다, 보다, 생각하다
Control : 지배(권), 통제(제어), 지배하다 -> Controller : 관리자, (기계의) 조종 장치, 회계 담당자

모형 : 모양이 같은 물건을 만들기 위한 틀, 실물을 모방해 만든 물건

 

모델은 어떤 걸 만들기 위한 틀이란 의미같고 뷰는 어떤 걸 보는 역할, 컨트롤러는 어떤 것을 조종하는 장치라고 이해했다. 많이 들어봐서 아는 단어라 생각했지만 뉘앙스가 알고 있던 것과 미묘하게 다르다.

이제 영문 위키백과에선 MVC 패턴을 뭐라고 설명하고 있는지 확인해보자.

 

MVC 패턴은 관련 프로그램 로직을 3개의 상호 연결된 요소로 나누는 사용자 인터페이스를 개발하는 데 일반적으로 사용되는 소프트웨어 디자인 패턴이다. 이것은 정보의 내부 표현과 정보가 사용자에게 제공되고 수용되는 방식을 분리하기 위해 수행된다. 전통적으로 데스크탑 그래픽 사용자 인터페이스 (GUI)에 사용되는 이 패턴은 웹 애플리케이션 설계에 널리 사용되었다. JavaScript, Python, Object Pascal / Delphi, Ruby, PHP, Java, C# 및 Swift와 같은 널리 사용되는 프로그래밍 언어에는 웹 또는 모바일 애플리케이션 개발에 즉시 사용되는 MVC 프레임워크가 있다.

Model : 패턴의 중심 구성요소. 사용자 인터페이스와 독립적인 응용 프로그램의 동적 데이터 구조다. 애플리케이션의 데이터, 로직, 규칙을 직접 관리한다. 컨트롤러로부터 입력을 받는다.
View : 차트, 다이어그램, 표와 같은 정보의 표현. 같은 정보에 대한 멀티뷰가 가능하다. 특정 형식으로 모델을 표시하는 역할을 한다.
Controller : 입력을 받아 모델 또는 뷰에 대한 명령으로 변환한다. 사용자 입력에 응답하고 데이터 모델 개체에 대한 상호작용을 수행한다. 입력을 수신하고 선택적으로 유효성을 검사한 다음 입력을 모델에 전달한다.

MVC 패턴은 애플리케이션을 위처럼 나누는 것 외에도 이들 간의 상호작용을 정의한다.

 

뭔가 많이 있다. 이 위키의 결론은, MVC 패턴은 데이터가 사용자에게 보여지는 부분, 내부 처리되는 부분을 분리하기 위해 수행된다는 것으로 이해했다.

또한 모델은 사용자로부터 입력을 받으며 앱의 데이터를 관리하고, 뷰는 모델을 정해진 형식으로 표시하며, 컨트롤러는 입력을 수신하고 유효성을 검사해서 모델에 전달한다.

이제 다른 포스팅을 돌면서 좀 더 정확한 정보를 찾아봐야겠다.

 

  • Model : 데이터를 전달하는 객체 or POJO를 말한다. 데이터가 바뀌면 Controller를 업데이트한다 / Controller : Model과 View 모두에서 작동하는 것. 모델 객체로의 데이터 흐름을 제어하고 데이터가 바뀌면 뷰를 업데이트한다. 뷰와 모델을 별도로 유지한다.
  • Model에는 순수한 애플리케이션 데이터만 포함된다. 사용자에게 데이터를 표현하는 로직이 없다. Controller는 뷰와 모델 사이에 있으며, 뷰 또는 다른 외부 요인에 의해 트리거된 이벤트를 수신하고 이 이벤트에 대한 반응(대부분 메서드 호출)을 실행한다. View와 Model이 알림 매커니즘으로 연결되기 때문에 이 작업의 결과는 자동으로 View에 반영된다.

그럼 MVC 패턴은 자바에선 어떻게 구현될까? 간단한 예시 프로젝트를 공부해봤다.

사람의 정보를 표현하기 위한 Model, View, Controller 클래스를 각각 만들고 이것들을 사용할 메인 클래스까지 총 4개의 클래스를 만들었다.

 

/* 모델 */
public class PersonModel
{
    private String name;
    private int age;
    private String gender;

    public String getName()
    {
        return name;
    }

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

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public String getGender()
    {
        return gender;
    }

    public void setGender(String gender)
    {
        this.gender = gender;
    }
}
/* 뷰 */
public class PersonView
{
    // 이름, 나이, 성별을 인자로 받아 콘솔에 출력하는 메서드
    void printPersonInformation(String name, int age, String gender)
    {
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
        System.out.println("성별 : " + gender);
    }
}
/* 컨트롤러 */
public class PersonController
{
    private PersonModel model;
    private PersonView view;

    public PersonController(PersonModel model, PersonView view)
    {
        this.model = model;
        this.view = view;
    }

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

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

    public void setPersonAge(int age)
    {
        model.setAge(age);
    }

    public int getPersonAge()
    {
        return model.getAge();
    }

    public void setPersonGender(String gender)
    {
        model.setGender(gender);
    }

    public String getPersonGender()
    {
        return model.getGender();
    }

    // 객체에 저장된 이름, 나이, 성별 정보를 출력하는 메서드
    public void update_view()
    {
        view.printPersonInformation(model.getName(), model.getAge(), model.getGender());
    }
}
public class Main
{
    public static void main(String[] args)
    {
        /* 객체에 메인에서 만든 메서드를 적용시키려면 메서드를 static으로 선언해야 한다
        * 선언하지 않을 경우 Non-static method 'getPersonInformation()' cannot be referenced from a static context
        * 에러가 발생한다. 이 에러에 대한 자세한 내용은 구글링 */
        // 메서드에서 초기화한 정보로 PersonModel 객체화
        PersonModel model = getPersonInformation();

        // 뷰 생성
        PersonView view = new PersonView();

        // 컨트롤러로 콘솔에 학생의 세부 정보를 출력한다
        PersonController controller = new PersonController(model, view);
        controller.update_view();
        System.out.println("=====================");

        // 모델의 데이터 업데이트
        System.out.println("이름, 나이, 성별 수정");
        controller.setPersonName("최은지");
        controller.setPersonAge(30);
        controller.setPersonGender("여자");
        controller.update_view();
        System.out.println("=====================");
    }

    // Model 클래스 객체의 정보를 초기화한 후 이 객체를 리턴한다
    public static PersonModel getPersonInformation()
    {
        PersonModel model = new PersonModel();
        model.setName("김철수");
        model.setAge(10);
        model.setGender("남자");
        return model;
    }

}

 

위 코드의 실행 결과는 아래와 같다.

 

 

반응형
Comments