메모장

MVC 패턴 본문

JAVA/개념정리

MVC 패턴

Itchild 2024. 4. 7. 20:37
728x90
반응형

MVC 패턴에 대해 알아보자

 

▶ M Model 모델 (DB와 관련되어있다.)

데이터(DB)와 관련된 로직을 담당하는 파트

1)DB에서 데이터를 다루는 방법에 대한 코딩

== SQL

 

2)DB의 데이터 <-> JAVA환경으로 가져올수 있도록

== JDBC,DAO

: CRUD 기능을 구현하는 파트 (사용자에게 제공할 서비스를 코딩 하는 부분 )

: CRUD 란? 생성(Create) , 읽어오기(Read), 업데이트 (Update), 삭제(Delete) 의 앞 이니셜을 따서

CRUD 라고 부르며 이 로직을 큰 틀로 잡고 코딩을 진행한다.

: 비즈니스 메서드, 핵심 로직

 

3)JAVA에서 데이터를 정의하는 코딩

== VO

 

▶ V View 뷰 (사용자와 관련된거 )

사용자가 보는 화면에 대한 모든것을 담당하는 파트

사용자 편의성 (UI /UX) 고려

유효성 검사도 필요한 부분

사용자와의 입출력을 담당하는 파트

 

▶ C Controller 컨트롤러 (연결을 관리 하는거 )

View <---> Model을 연결하는 파트

★ 여기서 MVC 패턴의 핵심은 ,

Model 과 View가 절대 서로 딱 ! 붙어있지 않게 하는것 !

무조건! 분리 되어 있어야함 !!!

그리고 사용자가 DB에 직접접근하는일은 절대 없어야한다 !

 

그렇다면 MVC 패턴을 왜 쓰는가 ??

 

MVC패턴에 대해 설명해보세요 ~!!

MVC의 장점

1. 유지보수 용이

2. 모듈화를 강제해서 개발의 편의성을 도모

ex) 레고 - 블록이 작을수록 다양한 output을 낼수 있다.

3. 프로젝트 코드가 '★낮은 결합도★' 를 가짐

결합도 :( 코드와 코드가 엉겨붙어있는 ) 코드 의존도가 존재

작게작게 쪼갤수록 결합도가 낮아진다.

main 에 다 집어넣으세요 vs 한팀은 사용자 한팀은 main 한팀은 관리자 코드 짜세요

4. 프로젝트 코드가 '★높은 응집도★' 를 가짐

응집도 : 관련 있는 코드들끼리 하나의 페이지에 작성하는것

int 학생수 = 50;

for (학생수)

for (학생수)

while(학생수가 될때까지)

for(학생수)

 

결론 : 결합도가 낮아지고 응집도가 높아져서 유지보수가 용이해져서 사용하는 장점이 있다.

 


예제를 통해 MVC패턴에 대해 살펴보자 !

예제 ) 새로운 프로그램 작성하기 == 학생부 프로그램

C, R, U, D 기능 넣어서

MVC 패턴으로 작성하기 !!

 

Model - StudentVO

package model;

// 학생 데이터 그 자체를 의미함 
// 멤버변수 + getter,setter 
// toString() 오버라이딩
// 생성자 (오버로딩)
// 데이터들 모아두는
public class StudentVO {
	private int num; // 각각의 고유 번호가 생기는 초기화
	private String name;
	private int score;
	StudentVO(int num,String name,int score){
		this.num=num;
		this.name=name;
		this.score=score;
		System.out.println(this.name+" 학생 생성완료!");
	}
	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 this.num+"번 학생 "+this.name+" ["+this.score+"점]";
	}
}
 

Model - StudentDAO

package model;

import java.util.ArrayList;

// CRUD (비즈니스 메서드, 핵심 로직) 구현이 목표
// : 일반적으로 output 이 boolean 타입이다 !!! ★★★★★★
// 다 boolean으로 바꿔주고 return true인지 false인지
// 기능구현 
// 로그들만 syso() 가능 -> 나중에 로그는 주석으로 제거함 !
// 나머지 syso() ------> view 의 기능!
public class StudentDAO {

	// model은 데이터를 가지고 있다
	// 이것이 모델이 가진 데이터 이다.

	// static이 아니라서 생성자에서 구현 

	// 외부로 부터 뭘 받아와야 되고 뭘 줘야하는지 
	// 로그를 어떤 패키지 어디 에서 받아왔는지

	/*
	PK는 사용자로부터 입력받으면 안됨!!!!!
	ID를 입력받을수는있으나, "중복검사"를 함!
	시스템에서 int값을 부여해야함!!!!!
	 */
	private static int PK = 1001; // 이 pk는 이제 각 생성된 것들의 번호 // 번호의 기준이 생김
	private ArrayList<StudentVO> datas;
	public StudentDAO(){
		this.datas=new ArrayList<StudentVO>();
		this.datas.add(new StudentVO(PK++,"홍길동",85));
		this.datas.add(new StudentVO(PK++,"아무무",92));
		this.datas.add(new StudentVO(PK++,"티모",51));
	}

	// 이름 고정 (insert, selectAll, selectOne, update, delete)


	// C :  학생을 추가하는 행위
	public boolean insert(String name,int score) {
		this.datas.add(new StudentVO(PK++,name,score));
		return true;
	}

	// 내가 가진 datas 공간에 ADD 할거야 
	//add를 하려면 pk,name,score 가 필요해 



    // R : 목록을 보는 행위 , 목록 출력
	// 학생 목록을 줘야함 

	public ArrayList<StudentVO> selectAll() {
		return this.datas;
	}

	// R : 1개를 출력하는 행위 , select
	// PK 를 받아서,
	public StudentVO selectOne(int num) { // PK를 받아서,
		for(int i=0;i<this.datas.size();i++) {
			if(this.datas.get(i).getNum()==num) {
				return this.datas.get(i);
			}
		} // -> 향상된 for문(forEach문)
		System.out.println("  로그: model: StudentDAO: selectOne(): 반환할 학생이 없습니다!");
		return null; // 해당 PK를 가진 학생이 없는 상태
	}


	// U : 어떤학생은 어떤 성적으로  
	public boolean update(int num,int score) {
		for(int i=0;i<this.datas.size();i++) {
			if(this.datas.get(i).getNum()==num) {
				this.datas.get(i).setScore(score);// > int
				return true;
			}
		}
		System.out.println("  로그: model: StudentDAO: update(): 성적변경할 학생이 없습니다!");
		return false;
	}

	// D : 학생을 삭제하는 행위
	public boolean delete(int num) { // 일단 번호를 알아야함 
		for(int i=0;i<this.datas.size();i++) {
			if(this.datas.get(i).getNum()==num) {
				this.datas.remove(i);
				return true;
			}
		}
		System.out.println("  로그: model: StudentDAO: delete(): 제거할 학생이 없습니다!");
		return false;
	}
}
 

View - StudentView

package view;

import java.util.ArrayList;
import java.util.Scanner;

import model.StudentVO;

//MVC중에서 V를 담당하는 클래스로,
// main()을 동작시키는것이 목표가 아님!

public class StudentView {
	// view : 사용자가 어떤 기능을 사용할지 예상하고 만들어야 함
	// 사용자랑만 생각하는거 , 소통하는거 


	// final : 상수화
	// 멤버변수에 초기화 할수 있는건 static밖에,, 객체와 무관하게
	// 멤버변수라서 private 까지
	private static final int maxMenuNum = 6;
	private static Scanner sc=new Scanner(System.in);

	//높은 응집도를 가진 코드를 구현하기 위함 !

	// 메뉴를 안내해주는 기능 // 입력받는것도 없고 주는것도 없다
	// 1. 학생목록출력
	// 2. 학생검색
	// 3. 학생정보변경
	// 메서드를 만드는 자리 

	public void printMenu() { // 사용자 메뉴 프린트 받을거야 
		System.out.println("=== 학생부 프로그램 ===");
		System.out.println("1. 목록출력");
		System.out.println("2. 학생검색");
		System.out.println("3. 정보변경");
		System.out.println("4. 학생추가");
		System.out.println("5. 학생삭제");
		System.out.println("6. 프로그램 종료");
	}

	// 나 이중에서 학생목록 할래 , 나 학생검색 할래 
	// 사용자의 입력을 저장하는 기능 
	public int getMenuNum() {
		while(true) {
			try {
				System.out.print("입력) ");
				int menuNum=sc.nextInt();

				if(1<=menuNum && menuNum<=maxMenuNum) {
					return menuNum;
				}
			}
			catch(Exception e) {
				sc.nextLine();
				System.out.println("정수로 입력해주세요!");
			}         
		}      
	}



	// 학생 목록을 출력하는 기능
	//	public void printStudentList() { // ArrayList<학생> datas 학생목록을 줘
	//		for(학생 v : datas) { // 학생 목록을 주면 내가 만들게
	//			System.out.println(v);
	//		}
	//	}

	public void printStudentList(ArrayList<StudentVO> datas) {

		System.out.println("===학생 목록 출력===");
		for(StudentVO v:datas) {
			System.out.println(v);
		}
	}


	// 검색한 학생의 정보를 출력하는 기능
	//public void printStudent(학생 data) {
	public void printStudent(StudentVO data) {
		System.out.println("===학생 출력===");
		System.out.println(data);
	}


	// 사용자가 입력한 번호를 저장하는 기능
	public int getStudentNum() {
		System.out.print("학생번호입력) ");
		int num=sc.nextInt();
		return num;
	}

	// 사용자가 입력한 점수를 저장하는 기능 
	public int getStudentScore() {
		System.out.print("학생점수입력) ");
		int score=sc.nextInt();
		return score;
	}

	// 변경완료를 안내해주는 기능
	public void printInfo() {
		System.out.println("학생정보변경완료!");
	}
 

	// 학생추가시 안내멘트
	public void printInfo_C_Start() {
		System.out.println("학생추가를 시작합니다.");
	}

	// 이름 입력받기
	public String getStudentName() {
		System.out.print("이름입력) ");
		String name=sc.next();
		return name;
	}

	// 학생추가완료를 안내해주는 기능
	public void printInfo_C_End() {
		System.out.println("학생추가완료!");
	}

	// 학생삭제시 안내멘트
	public void printInfo_D_Start() {
		System.out.println("학생삭제를 시작합니다.");
	}

	// 학생삭제완료를 안내해주는 기능
	public void printInfo_D_End() {
		System.out.println("학생삭제완료!");
	}

	// 프로그램 종료 안내해주는 기능
	public void printEnd() {
		System.out.println("프로그램 종료 .....");
	}

    // false 일때 안내 멘트
	public void printFalse() {
		System.out.println("서비스 수행 실패...");
	}
}
 

Controller - StudentController

package controller;

import java.util.ArrayList;

import model.StudentDAO;
import model.StudentVO;
import view.StudentView;

// 컨트롤러 

public class StudentCtrl {

	// 뷰랑 모델의 중간다리

	private StudentView view;
	private StudentDAO dao; // model

	public StudentCtrl() {
		this.view = new StudentView();
		this.dao = new StudentDAO();
	}

	public void startApp() {
		while (true) {

			// 사용자한테 메뉴보여줘!
			view.printMenu();
			// 사용자가 뭐 할지 입력받아줘 !
			int menuNum = view.getMenuNum();

			if (menuNum == 1) {
				// 목록출력해줘
				ArrayList<StudentVO> datas = dao.selectAll();
				view.printStudentList(datas);
			} else if (menuNum == 2) {
				// 1명출력해줘
				int num = view.getStudentNum();
				StudentVO data = dao.selectOne(num); // 전체중 한명 선택
				view.printStudent(data);
			} else if (menuNum == 3) {
				// 변경해줘
				int num = view.getStudentNum(); // 번호를 받아
				int score = view.getStudentScore(); // 점수를 받아
				dao.update(num, score); // 변경 (몇번 학생, 점수)
				view.printInfo();
			} else if (menuNum == 4) {
				// 추가해줘
				view.printInfo_C_Start();
				String name = view.getStudentName(); // 이름과
				int score = view.getStudentScore(); // 점수를 받아
				dao.insert(name, score); // 추가(이름, 점수)
				view.printInfo_C_End();
			} else if (menuNum == 5) {
				// 제거해줘
				view.printInfo_D_Start();
				int num=view.getStudentNum();
				if(dao.delete(num)) {
					view.printInfo_D_End();
				}else {
					view.printFalse();
				}
				// CRUD(비즈니스 메서드,핵심 로직)이 성공했는지,실패했는지를 알아야함!!!!!

			} else if (menuNum == 6) {
				view.printEnd(); // 프로그램 종료
				break;
			}
		}
	}
}
 

Client - StudentClient

package client;
// 클라이언트 
//main 에 쓰는 친구

import controller.StudentCtrl;

public class Client {

	public static void main(String[] args) {

		StudentCtrl app=new StudentCtrl();
		app.startApp();
	}
}
 

 

 

728x90
반응형

'JAVA > 개념정리' 카테고리의 다른 글

MVC 패턴 중 View 공부  (0) 2024.04.07
MVC 패턴 중 Model 공부  (0) 2024.04.07
스레드(Thread) 와 파일 입출력  (1) 2024.04.07
예외 와 예외처리  (0) 2024.04.07
컬렉션 프레임 워크  (0) 2024.04.06