Web develop/JAVA

[JAVA] 자바 MVC 패턴 (Model, View, Controller)

ForA 2019. 5. 3. 14:38
728x90

model1

  • 구분없이 필요한 내용들(절차적인요소들)을 프로그래밍)
  • 주먹구구식. 작은 프로그램

model2

  • 내용,형식에 따라서 파일을 분류해서 프로그래밍/ MVC)
  • 나누는 기법. 여러명이 작업

Model2구조

Model(모델)

  • 데이터와 관련된 일. 저장, 가공, 등등

  • 비즈니스로직과 관련된 부분 처리

  • 데이터베이스 관련로직 구현

  • JSP Beans, EJB Component

  • 애플리케이션의 데이터를 표현

      class Calculator{
          public int plus(int su1, int su2){
              return su1+su2;
          }
      } //데이터를 가공 처리
    
      int result = plus(2,3);
    
      class Person{
           String name;
           int age;
           String job;
       }// 서로 관련있는 속성을 클래스로 묶음 : JavaBeans
    
       class DBTest{
           public void insert(){
           }
       }//DB access하는 클래스

View(뷰)

  • 사용자에게 알맞은 화면을 보여주는 역할 수행.

  • JSP, CustomTag

  • 데이터를 시각적으로 표현하는 것

    역할)

    1. 결과값 출력
    2. 사용자 요구(버튼클릭: 음료수가 먹고싶다.)
    3. 사용자 데이터 입력.

Controller(컨트롤러)

  • Model과 View를 연결해주기 위한 매개체
  • 사용자가 View(GUI)를 통해 입력을 하면 Model(데이터)을 변경해 주는것
  • 애플리케이션의 흐름제어나 사용자의 처리요청을 구현
  • 사용자인증, 보안설정이라든지전체 애플리케이션에 영향을 미치는 요소구현
  • Servlet
  • Model과 View는 나눠서, 본인일에 전념할 수 있도록 컨트롤해준다.
    장점) 객체지향, 비용절감, 유지보수, 업무분담

컨트롤러의 역할

  1. (뷰를 통해 전달된) 사용자의 요청 분석 ex) if(ob==bt_new){}
  2. (사용자가)입력한 데이터 얻어오기 ex) tf.getText();
  3. 모델클래스 객체생성 ex) Calculator c = new Calculator();
    • 메소드 호출 c.plus(2,3);
    • 리턴된 데이터를 저장 int result = c.plus(2,3);
  4. 페이지 이동(화면 하나), 이동할 페이지(프레임) 선택 ex) f1.setVisible(false); f2.setVisible(true);
  5. 유효성 검사 (Valid Check) [선택사항]

Swing MVC 예시(심플계산기)

  • 뷰 CalcView.java : 계산기 폼
  • 모델 Calculator.java : 더하기, 빼기, 곱하기, 나누기 기능
  • 컨트롤러 CalcController.java : 전체 프로그램 제어 (main()메소드 포함)

MODEL

CalcView view;

public CalcController() {
    view = new CalcView();

    view.bt_calc.addActionListener(this);
}//CaclController

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource()==view.bt_calc) {//1. 계산을 요청했다면
        //2. 계산에 필요한 데이터 얻기
        String su1Str = view.tf_su1.getText();
        String su2Str = view.tf_su2.getText();
        String oper = view.cb_oper.getSelectedItem().toString();

        //5. 유효성검사
        if(!su1Str.matches("[0-9]+")||!su2Str.matches("[\\d]+")) {
            view.la_result.setText("숫자만 입력하세요");
            return;
        }else if (oper.equals("/")&&su2Str.equals("0")) {
            view.la_result.setText("0으로 나눌 수 없습니다.");
            return;
        }

        //3. 모델객체 생성
        Calculator calc = new Calculator(Integer.parseInt(su1Str),Integer.parseInt(su2Str),oper);

        String result = calc.getResultstr();
        //3-2 변수에 저장 //3-1 메소드호출

        view.la_result.setText(result);
        view.reset(); //입력숫자 초기화 메소드
    }//if
}

public static void main(String[] args) {
    new CalcController();
}

VIEW

public class CalcView extends JFrame {

    public JTextField tf_su1, tf_su2;
    public JComboBox<String> cb_oper;
    public JButton bt_calc;
    public JLabel la_result;

    JPanel panel;


    public CalcView() {
        setTitle("Simple Calculator");//이름설정

        //컴포넌트 초기화 및 설정
        tf_su1 = new JTextField(5); //5 = 너비지정
        tf_su2 = new JTextField(5);

        cb_oper = new JComboBox();
            cb_oper.addItem("+");
            cb_oper.addItem("-");
            cb_oper.addItem("*");
            cb_oper.addItem("/");

        bt_calc = new JButton("계산");
        la_result = new JLabel();

        //레이아웃
        setLayout(new FlowLayout());

        panel = new JPanel();
        panel.add(tf_su1);
        panel.add(cb_oper);
        panel.add(tf_su2);
        panel.add(bt_calc);

        add(panel);
        add(la_result);

        setBounds(300,200,300,120);
        setVisible(true);
        setResizable(false);//프레임 재설정 X
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void reset() {
        tf_su1.setText("");
        tf_su2.setText("");
    }
}

Model

public class Calculator { 
//(사칙연산관련) 기능정의. 모델(데이터관련) 클래스. 보통 결과데이터를 리턴 

    private int su1;
    private int su2;
    private String oper;

    private int result; //사칙연산 결과를 담을 변수

    public Calculator(int su1, int su2, String oper) {
        this.su1 = su1;
        this.su2 = su2;
        this.oper = oper;
        choice();
    }

    private void choice() {
        if(oper.equals("+")) plus();
        else if(oper.equals("-")) minus();
        else if(oper.equals("*")) multi();
        else if(oper.equals("/")) div();
    }//choice

    public void plus() {
        result = su1+su2;
    };
    public void minus() {
        result = su1-su2;
    };
    public void multi() {
        result = su1*su2;        
    };
    public void div() {
        result = su1/su2;    
    };

    //최종 결과값 리턴
    public String getResultstr() {
        return "결과값:"+su1+oper+su2+"="+result;
    }
}