[디자인 패턴] MVC 패턴. Model, View, Controller 자바로 보는 이해 빠른 간단한 예제

MVC는 굉장히 많은 어플리케이션에서 사용이 가능하다. 모바일, 데스크탑(윈폼, 스윙 등), 웹 등 다양하게 MVC 패턴을 사용할 수 있다. 스프링 같은 경우는 MVC를 사용해야한다. 사실 Model, View, Controller 각각의 역할은 이론적으로 알지만 코드로 작성할 때 어떻게 해야하는지 감이 잘 안오는 경우가 많다. 그래서 간단한 예제를 사용해서 설명하려고한다.

MVC 구성도


MVC 클래스 다이어 그램

MVC 각각의 특징
Controller
Controller는 관리자 라는 의미를 가지고 있다. Model, View를 가지고 있어 값을 처리하고 화면에 보여주는 것을 관리한다. Controller의 역할은 로직의 순서를 정한다고 봐도 된다.
예를 들어 상품을 구매하는 상황이다. 컨트롤러는 아래와 같은 순서로 처리해야할 것이다.
  1. 사용자가 올바른지 - Model
  2. DB에서 상품 구매 - Model
  3. 결제 - Model
  4. 결제 성공 뷰 - View
위 상황은 예제일 뿐 실제 상황에서는 적절치 않을 수 있다. 위에 여러 상황을 볼 때 컨트롤러에서는 사용하는 것은 Model, View 밖에 없다. 이것이 컨트롤러의 역할이다. 즉 컨트롤러는 Model에서 로직 처리를 관리해야한다. 관리라는 것은 예를 들어 사용자가 올바르지 않는 경우 상품 구매 진행이 되면 안되는 것을 말한다. 이처럼 로직의 흐름을 제어하고 여러 케이스(상황)에 대하여 조작하여야한다. 웹에서의 Controller의 시작은 Api 호출이 될 것이다. 클라이언트가 특정 URL로 웹에 요청하였을 때 Controller로 들어가게 되는 것이다.
public class Controller{
    public static void main(String[] args) {
        Model model = new Model();
        View view = new View();

        int num1 = view.numInput();
        int num2 = view.numInput();

        var addNum = model.add(num1, num2);

        view.showValue(addNum);
    }
}

Model
모델 같은 경우는 로직을 담당한다. 모델의 크기는 굉장히 다양할 것이다. 예를 들어 단위가 Unit일 수 있다. return A + B 이처럼 간단한 것부터 시작해서 DB 접속 후 데이터를 처리하는 것도 모델이 된다. 모델 각각의 함수(기능)의 크기는 작고 재사용성이 커야 좋은 코드라고 볼수도 있다. 주의할 점은 Model은 Controller의 의해 작동하고 Controller에게 값을 넘겨준다. 즉 View와는 연관이 없다. Model에서는 View에 접근을 할 수가 없다.
class Model {
    int add(int a, int b) {
        return a + b;
    }
}
View
View는 말 그대로 보여지는 화면을 말한다. View는 컨트롤러에 값을 받고 화면에 보여주는 것을 말한다. View에서는 컨트롤러에 값을 받기도 하지만 컨트롤러에 이벤트를 전송하기도 한다. 예를 들어 View에서 사용자가 특정 기능 버튼 클릭을 하였을 때 Controller는 그에 맞게 작동을 하여야한다. 이처럼 View에서도 Controller 접근은 가능하나 Model에 접근은 할 수 없다.

import java.util.Scanner;

class View {
    private Scanner in = null;

    View(){
        in = new Scanner(System.in);
    }

    int numInput(){
        System.out.println("Input Number.. : ");
        return in.nextInt();
    }

    void showValue(int value){
        System.out.println("---------------------------------");
        System.out.println("Add value is " + value);
        System.out.println("---------------------------------");
    }
}

예제 코드는 https://github.com/psycho3081/gof_design_pattern/tree/mvc
깃헙에서 다운로드를 받고 Controller를 메인으로 실행시키면 된다.

댓글

이 블로그의 인기 게시물

[INTELLIJ] 인텔리제이 폴더 안 보이고 파일만 보이는 버그 해결 방법

[생활] 짝눈(부동시)로 신체검사 4급(공익) 받은 방법.

[스프링부트] @Mapper import 실패시(빨간줄) 해결 방법