프로그래밍

[자바 기초] day15 : MVC 예제(학생부 프로그램) 본문

자바/자바 기초

[자바 기초] day15 : MVC 예제(학생부 프로그램)

시케 2023. 5. 23. 16:01
728x90
반응형

2023.05.23.화

학생부 프로그램

 

먼저 시작하기 전에 위와 같은 형태로 파일을 생성해주었다

 

StudentView.java

package view;

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

import model.StudentVO;

public class StudentView {
	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() {
		int menuNum;
		while (true) {
			try {
				System.out.println("입력: ");
				menuNum = sc.nextInt();
				break;
				
			} catch (InputMismatchException e) {
				sc.nextLine();
				System.out.println();
			}
		}
		if (1 <= menuNum && menuNum <= 3) {
			return menuNum;
		}
		return menuNum;
	}

	// 학생목록을 출력하는 기능
	public void printStudentList(ArrayList<StudentVO> datas) {
	      System.out.println("===학생 목록 출력===");
	      for(StudentVO v:datas) {
	         System.out.println(v);
	      }
	   }


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

	

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

	// 사용자가 입력한 점수를 저장하는 기능
	public int getStudentScore() {
		System.out.println("학생 점수 입력: ");
		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.println("이름 입력: ");
		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("프로그램 종료...");
	}
}

 

MVC 중에서 View를 담당하는 클래스로 main()을 동작시키는 것이 목표가 아니다

그러므로 main() 을 작성하지 않는다

View()는 사용자에게 무엇을 보여주고 받아올 것인지 생각하여야 한다

출력은 View의 담당이기 때문에 다른 파트에서 출력문이 존재하면 안된다

 

studentVO.java

package model;
// VO(value object)
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() {
		// TODO Auto-generated method stub
		return this.name + this.score;
	}
}

VO는 Value Object의 준말로 데이커 값을 저장하는 곳이다

학생 멤버변수를 선언하고 객체를 생성하여 초기화 시켜주었다

 

 

StudentDAO.java

package model;

import java.util.ArrayList;
// DAO (data access object)
// CRUD 비즈니스 메서드
public class StudentDAO {
	public ArrayList<StudentVO> datas;
	private static int PK = 1001;
	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));
	}
	
	
	// C
	public void insert(String name, int score) {
		this.datas.add(new StudentVO(PK++, name, score)); 
	}
	
	// R : 목록 출력
	public ArrayList<StudentVO> selectAll() {
		return this.datas;
		
	}
	
	// R : 
	public StudentVO selectOne(int num) { //PK를 받아서
		for(StudentVO v: this.datas) {
			if(v.getNum()==num) {
				return v;
			}
		}
		System.out.println("로그: model: StudentDAO: selectOne(): 반환할 학생이 없습니다");
		return null; // 해당 PK 가진 학생이 없음
	}
	
	public void 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);
				return;
			}
		}
		System.out.println("로그: model: StudentDAO: selectOne(): 반환할 학생이 없습니다");
	}
	
	
	// D
	public void delete(int num) {
		for(int i=0; i<this.datas.size(); i++) {
			if(this.datas.get(i).getNum()==num) {
				this.datas.remove(i);
				return;
			}
		}
		System.out.println("로그: model: StudentDAO: selectOne(): 제거할 학생이 없습니다");
	}
}

DAO는 Data Access Object의 준말로 실질적인 기능을 담당하는 곳이다

CRUD(비즈니스 메서드, 핵심로직)을 작성하는 곳이다

이때 insert. selectAll, selectOne, update, delete 를 제외하고 이름을 지을 수 없다

기능이 겹치는 문제는 오버라이딩으로 해결한다

 

StudentCtrl.java

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) {
				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();
				dao.delete(num);
				view.printInfo();
			}
			else if(menuNum==6) {
				view.printEnd();
				break;
			}
		}
	}
}

컨트롤러는 View와 Model,  사용자 사이에서 작동한다

서로 필요하고 원하는 것을 전달해주는 역할이다

 

client.java

package client;

import controller.StudentCtrl;

public class Client {
	public static void main(String[] args) {
		StudentCtrl app = new StudentCtrl();
		app.startApp();
	}
}

실제로 클라이언트 코드에는 많은 내용이 담겨있지 않다

 

728x90
반응형
Comments