열심히 끝까지

디바이스 융합 자바(Java) day16 - MVC기본,자판기 프로그램 with MVC 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day16 - MVC기본,자판기 프로그램 with MVC

노유림 2022. 6. 28. 16:42

[오늘 수업]
[MVC]

Model-------------------

     DB 저장된 데이터
     => VO : 어떻게 Java 객체로 표현할 지
     ex ) 재고 데이터
     DBMS(Oracle, MySQL)
     DBMS에 저장된 데이터를 Java단으로 불러오는 역할
     => DAO : CRUD(핵심로직, 비즈니스 메서드)
                    == 사용자에게 서비스(제공)되는 메서드

View-------------------

    사용자 공간 : console, 브라우저, 웹 페이지
    -> 화면 구성
    -> 사용자가 입력한 모든 값에 대해서 유효성 검사
    
Model과 View를 직접 잇는 것은 유지보수에 대해 불리하다.
>> 양측이 다 불편해지는 상황 발생
>> 이 둘을 이어주는 친구 : Controller
Controller-------------

    Model과 View를 연결하는 역할
    >> 데이터 전반의 흐름을 잘 알아야 한다!!
-----------------------------------------------    
>> 결합도가 낮아진다!!
     : 유지보수 유리
     : 에러가 발생하면 다 바꾸지 않아도 
  *결합도가 높다? 
    > 유지보수가 심하게 불리하다는 뜻
>> 응집도가 높아진다!!
  * 응집도가 낮다?
    > 결제 문제가 발생했을 때 다 바꿔야 하는 상황 발생
    > 관련이 되어있는것 끼리 뭉쳐있으면 좋은데 
 > Model은 Model끼리, View는 View끼리 결합되어 있기에 유지보수 유리

>> ★유지보수가 용이한 코드란?
    : "낮은 결합도", "높은 응집도" 를 의미
    : Model은 Model끼리, View는 View끼리 결합하고
     Model과 View를 직접 잇지 않고 Controller를 통해 연결
    >> 결합도는 낮추고 응집도는 높혔다!!! 
 

-------------------------------
자판기류(음료 자판기)
10 20
재고 데이터

불만사항 이슈
- 숫자 제외하고 누르니 작동한다?
View에서!
  > 사용자랑 맞닿아있는 부분
  > 사용자가 입력한 값에 대한 유효성 검사
>> 회사 다닐 때, 바빠서 힘들다..
     : 출퇴근할 시간에 자라고 텐트부터 산다는 말이...
     : 사용자가 이상한 것이 있다고 한다..
     : 404 > Front, 500 > Back

- 1을 눌렀는데 기능이 안나와요!!
Model 아닌가용?
> 1번을 눌렀을 때 인지 하는데.. 아무 것도 안 뜬다!!
      >기능이 동작하지 않는다면?
            1) C한테 너 V의 "화면 출력 기능"을 연결했어?
            2) C는 말합니다.. 아니 근데.. [V가 화면 출력기능]을 나한테 안줬어!
            3) V야, 너 [화면출력기능] 아직 안했어..?? <수행 시 2번으로>
                 >> model파트의 잘못한 것은 없다!!

- 종료버튼을 누르면 "프로그램이 종료됩니다"라고 인사할 수 있는
   버전으로 버전 업 플리즈!!!
>> 예쁜화면이 안내되어야하기 때문에
    View!!!! 가 답
   1) V가 해당 기능을 제작해야함!
   2) Controller에게 View에 기능이 추가되었음을 알려준다
   3) View에서 func2()만든거 불러오기
 >> Controller가 head일 가능성이 크다
 >> 관리직이 버전관리를 하는 경우가 많다
      >> 코딩지식이 제일 많이 있어야 가능하다!!! 
            ..난 안해야지 ㅋㅋㅋㅋ실력이 없어어어.........
           어차피 안시키겠지만..?

- 학생 출력이 이상해요...
>> 이것도 View랑 관련있는 것이다..
    : "출력" 자체가 사용자 눈에 보이는 것이기 때문에
      View가 담당한다!!
    Model은 Java에 데이터만 잘 불러오면 되기때문에
    누구에게 보이는 것은 Model이 아닌 View가 해야 할 일이다!!!!
 


MVC와 관련된 정보
Model
  >> DataBase(DB) 데이터를 Java로 어떻게 불러올 지
        VO(Value Object) : 기본생성자로 만들어내는 경우가 대다수!!!
  >> 데이터와 관련된 정보들을 다룬다!!!
  >> 보다 다양한 기능을 추가 가능!!!
ex ) 
    학생부 프로그램을 만든다고 가정!
      : 이름, 점수를 입력받기도 하고 설정도 한다
        >> 이 때 데이터를 식별하기 위해서는 PK(Primary Key : 기본키)가 필요
--Model 코더 부분----

package model;
// DB 데이터를 Java로 어떻게 불러올 지 >> VO(Value Object)
//                                  기본생성자로 만들어내는 경우 대다수!!
// 데이터와 관련되서 
// 이름, 점수
// 데이터를 식별하려면 PK가 필요하다(Primary Key 기본키)
public class StudentVO {
	private int num;
	private String name;
	private int 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 "StudentVO [num = " + num + ", name = " + name + ", score = " + score + "]";
	}
	// DB에서 Java로 데이터를 불러오는 것과 같은 역할
	public void startModel() {
		this.name = "아무무";
		this.num = 1001;
		this.score = 96;
	}
}

 

 

View
  >> 사용자가 보는 화면을 설계하는 작업
        >> 사용자만 관심!!(자판기면 음료에는 관심 x)
              화면에 어떤 문자가 어떤 방식으로 나오는지만 신경쓰면 됨
             >> 이쁘게 나오는 것이 제일 중요하다!!!!
  >> 사용자의 흐름을 설계 
          : User Flow를 설계!!!
--View 코더 부분----

package view;
import java.util.Scanner;
import model.StudentVO;
// 사용자의 흐름을 설계 >> User Flow 설계
public class StudentView {
	private int startNum = 1;
	private int endNum = 2; // 기능이 추가된다면, 마지막 기능 번호로 변경할 것!
	public int act; // 사용자의 입력값을 저장할 변수
	public void startView() {
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("학생부 프로그램입니다.");
			System.out.println("1. 이름출력 2. 종료");
			System.out.print("입력 ) ");
			this.act = sc.nextInt();
			if(startNum <= act && act <= endNum) {
				break;
			}
			System.out.println("번호 확인 후 다시 입력해주세요!");
		}	
	}
	public void func1(StudentVO vo) { // 1번 누르면 나오는 화면
		System.out.println("학생이름 : " + vo.getName());
	}
}

 

 

Controller
  >> 프로그램을 처음 수행하는 작업을 한다
  >> 수행에 필요한 리소스(자원)을 메모리에 적재(load)
         : 데이터베이스에서 데이터 가져온다!!
  >> 본인이 만든 것이 하나도 없다!
       멤버변수로 Model, View를 가지면서 따로 만드는 것은 하나도 없다..?
        >> 자기만의 로직이 없다
               만약 있다..? 그건 잘못 짜고 있는 것!!!!!
--Controller 코더 부분----

package controller;
import model.StudentVO;
import view.StudentView;
public class StudentController {
	StudentVO model;
	StudentView view;
	public void startController() {
		// 프로그램을 처음 수행
		// -> 수행에 필요한 리소스(자원)을 메모리에 적재(load)
		view = new StudentView();
		model = new StudentVO(); 
		model.startModel(); // DB에서 데이터 가져오기
	}
	public void startApp() {
		while(true) {
			view.startView();
			if(view.act == 1) {
			view.func1(model);
				// 화면출력기능 func1 대입
				// DB의 데이터를 V파트로 옯기는 것(인자로 전달하는 것)은
				// C의 몫이다!
			}
			else if(view.act == 2) {
				break;
			}
		}		
	}
}

 

 

지금까지 만든 APP을 수행시킬 공간!
   >> Model, View, Controller 작동시키는 곳
   >> 거의..Controller에서 가져오지만..?
   >> main()에서 작동시키기 때문에 유일하게 main() 존재
---Client-------------

package client;
import controller.StudentController;
public class Client {
	public static void main(String[] args) {
		// 지금까지 만든 APP을 수행시킬 공간
		// main()이 존재함
		StudentController app = new StudentController();
		app.startController();
		app.startApp();
	}
}