본문 바로가기

개발 패턴/MVC

[개발 패턴] <MVC> 기초

MVC 개발 패턴이란

  • MVC란 Model View Controller의 약자이다.
  • MVC는 서비스하는 방식에 대한 하나의 아이디어 디자인 패턴이다.

이미지로 보기

패턴 특징

  • 개발 파트가 Model, View, Controller로 나뉘어 있다.
  • 한 프로그램에서 Model, View, Controller의 객체는 1개씩만 사용한다.(싱글톤 패턴)

파트별 특징

  • Model(DAO)
    • 데이터와 관련된 로직을 처리하는 부분이다.
    • 항상 정확한 값을 받았다라고 가정하고 데이터 처리한다.
    • 출력 처리가 일절 존재하지 않는다.
// 사용자와는 전혀 상호작용을 하지 않기 때문에
// 출력이 단 한개도 없다
public class CalcModel {

    public int plus(int num1, int num2) {

        return num1 + num2;

    }

    public int minus(int num1, int num2) {

        return num1 - num2;

    }

    public int by(int num1, int num2) {

        return num1*num2;

    }

}

 

  • View
    • 사용자와 관련된 작업을 처리하는 부분이다.
    • 사용자의 모든 입력 값에 대해서 유효성 검사를 한다.
    • 유효성 검사에 따른 안내를 한다.
    • 사용자 편의성을 고려한다.=>UI/UX
// 사용자와의 input, output만을 고려하는 파트
public class CalcView {

    private Scanner sc;

    private ArrayList<String> opList;

    public CalcView() {

        sc = new Scanner(System.in);

        opList = new ArrayList<String>();

        opList.add("+");
        opList.add("-");
        opList.add("x");
        opList.add("X");
        opList.add("*");

    }

    // 사용자가 제공받아야하는 문구를 제작
    public void printInputInteger(int num) {

        System.out.println("정수 " + num + " 입력 >>");

    }

    public void printInputOp() {

        System.out.println("연산자 입력 >>");

    }

    public void printResult(int num1, String op, int num2, int result) {

        System.out.println("결과는 " + num1 + " " + op + " " + num2 + " = " + result + " 입니다.");

    }

    // 사용자의 입력을 받력을 받아야하는 부분을 제작
    public int inputInteger() {

        int num;

        while (true) {

            try {

                num = sc.nextInt();

                break;

            } catch (Exception e) {

                sc.nextLine();

                System.out.println("[로그] 종수만 입력 가능합니다.");

            }

        }

        return num;

    }

    public String inputOp() {

        String op = "";

        while (true) {

            op = sc.next();

            if (op.contains("+") || op.contains("-") || op.contains("X") || op.contains("x")) {

                break;

            }

            System.out.println("[로그] 없는 연사자이거나 아직 개발 되지않은 연산자 입니다...");

        }

        return op;

    }

}

 

  • Controller
    • Model과 View를 중개한다.
    • Model과 View는 절대로 직접 결합되어서는 안된다. Controller를 통해서만 결합되어야만 한다.
    • 자체적으로 기능을 가지고 있지 않고 View와 Model을 호출해서 사용만 한다.
    • 메인에 호출되는 유일한 파트
// Ctrl은 절대로 자신 스스로 기능을 구현 하지 않는다.
// M,V호출 사용만

public class ClacCtrl {

    private CalcModel model;
    private CalcView view;

    public ClacCtrl() {

        model = new CalcModel();

        view = new CalcView();

    }

    public void startApp() {

        view.printInputInteger(1);
        int num1 = view.inputInteger();

        view.printInputOp();
        String op = view.inputOp();

        view.printInputInteger(2);
        int num2 = view.inputInteger();

        int result;

        if (op.equals("+")) {

            result = model.plus(num1, num2);

        } else if (op.equals("-")) {

            result = model.minus(num1, num2);

        } else {

            result = model.by(num1, num2);

        }

        view.printResult(num1, op, num2, result);

    }

}

 

  • DTO
    • JAVA는 2개이상의 값을 return할 수 없기 때문에, 여러개의 값을 들고다닐 목적으로 만든 클래스이다.
    • 자료형이 없어서 개발자가 직접 만든 클래스
    • VO라고도 한다.
public class StudentDTO {

    private int num; // PK

       private String name; // 이름

    private int score; // 점수

    public StudentDTO(int num, String name, int score) {

        this.num = num; // PK 초기화

          this.name = name; // 이름 초기화

          this.score = score; // 점수 초기화

       }

       public int getNum() {

        return num;

     }

       public void setNum(int num) {

          this.num = num;

       }

       public String getName() {

        return name;

      }

       public void setName(String name) {

          this.name = name;

       }

       public int getScore() {

          return score;

       }

      public void setScore(int score) {

         this.score = score;

      }

      @Override
      public String toString() {

         return num + "번 " + name + "학생 " + score + "점";

      }

}

개발 패턴을 이용 했을 경우의 이점

  • 다른 사람이 코드 작성 중일 때 실행 가능하다.
  • 다른 사람과의 동시간 버전 관리가 가능하다.