The Debugging Chronicles : "코드의 미학"

MVC 패턴 예제 본문

JAVA/자바 수업 내용

MVC 패턴 예제

sweetseonah1004 2024. 7. 29. 19:59

clinet

package client;

import service.controller.StudentController;

public class Client02 {
	public static void main(String[] args) {

		// 학생부 프로그램
		
		StudentController app=new StudentController();
		app.start();
		
	}
}

 

controller

package service.controller;

import java.util.ArrayList;

import service.model.StudentDAO;
import service.model.StudentDTO;
import view.StudentView;

public class StudentController {
	private StudentDAO model;
	private StudentView view;
	// 외부에서 받아와야하는 값이기 때문에 
	private int PK;
	public StudentController() {
		this.model=new StudentDAO();
		this.view=new StudentView();
		this.PK=104;
	}

	// 사용자(Client)에게 [M과 V를 조합해서] 서비스를 제공하는 역할
	public void start() {
		while(true) {
			view.print01();
			int action=view.inputAction();

			if(action==1) {
				view.print02();
				String name=view.inputName();
				view.print03();
				int score=view.inputScore();
				
				boolean flag=model.insert(PK++, name, score);
				if(flag) {
					view.print04();
				}
				else {
					// 실패했습니다.
				}
			}
			else if(action==2) {
				ArrayList<StudentDTO> datas=model.selectAll();
				view.print05(datas);
			}
			else if(action==3) {
				view.print07();
				int num=view.inputNum(PK);
				
				StudentDTO data=model.selectOne(num);
				
				view.print08(data);			
			}
			else if(action==4) {
				view.print12();
				String searchKeyword=view.inputName();
				
				ArrayList<StudentDTO> datas=model.selectAll(searchKeyword);
				view.print13(datas);
			}
			else if(action==5) {
				ArrayList<StudentDTO> datas=model.selectAll();
				
				// 데이터 정제, 가공
				int sum=0;
				for(StudentDTO data:datas) {
					sum+=data.getScore();
				}
				double avg=sum*1.0/datas.size();
				
				/*
				StudentDTO data=model.selectOne();
				double avg=data.getAvg();
				*/
				
				view.print14(avg);
			}
			else if(action==6) {
				view.print07();
				int num=view.inputNum(PK);
				view.print03();
				int score=view.inputScore();
				
				boolean flag=model.update(num, score);
				
				if(flag) {
					view.print15();
				}
				else {
					view.print16();
				}
			}
			else if(action==7) {
				view.print09();
				int num=view.inputNum(PK);
				
				boolean flag=model.delete(num);
				if(flag) {
					view.print10();
				}
				else {
					view.print11();
				}
			}
			else if(action==0) {
				break;
			}
		}
	}
}

 

StudnetDAO

package service.model;

import java.util.ArrayList;

// MVC 패턴에서 DBMS를 DAO라고 함
public class StudentDAO {
	private ArrayList<StudentDTO> datas;
	
	public StudentDAO() {
		System.out.println("   service.model.StudentDAO  StudentDAO() 생성자 시작");
		datas=new ArrayList<StudentDTO>();
		
		StudentDTO data1=new StudentDTO();
		data1.setNum(101);
		data1.setName("오리아나");
		data1.setScore(50);
		datas.add(data1);
		
		StudentDTO data2=new StudentDTO();
		data2.setNum(102);
		data2.setName("모르가나");
		data2.setScore(89);
		datas.add(data2);
		
		StudentDTO data3=new StudentDTO();
		data3.setNum(103);
		data3.setName("티모");
		data3.setScore(67);
		datas.add(data3);
		System.out.println("   service.model.StudentDAO  StudentDAO() 생성자 종료");
	}
	
	// CUD : output이 booelan
	public boolean insert(int num,String name,int score) {
		System.out.println("   service.model.StudentDAO  insert() 시작");
		// DBMS에 data를 추가 == AL에 DTO를 추가
		StudentDTO data=new StudentDTO();
		data.setNum(num);
		data.setName(name);
		data.setScore(score);
		datas.add(data);
		System.out.println("   service.model.StudentDAO  insert() 종료");
		return true;
	}
	public boolean update(int num, int score) {
		System.out.println("   service.model.StudentDAO  update() 시작");
		for(StudentDTO data:datas) {
			if(data.getNum() == num) {
				data.setScore(score);
				System.out.println("   service.model.StudentDAO  update() 종료 : 성공");
				return true;
			}
		}
		System.out.println("   service.model.StudentDAO  update() 종료 : 실패");
		return false;
	}
	public boolean delete(int num) {
		System.out.println("   service.model.StudentDAO  delete() 시작");
		for(int i=0;i<datas.size();i++) {
			if(num == datas.get(i).getNum()) {
				datas.remove(i);
				System.out.println("   service.model.StudentDAO  delete() 성공");
				return true;
			}
		}
		System.out.println("   service.model.StudentDAO  delete() 실패");
		return false;
	}
	
	// R : output이 AL,DTO
	public ArrayList<StudentDTO> selectAll() {
		System.out.println("   service.model.StudentDAO  selectAll()");
		return this.datas;
		/*
		ArrayList<StudentDTO> datas=new ArrayList<StudentDTO>();
		
		return datas;
		// null이 반환되는 경우는 없다.
		// 다만, .size()가 0일수는 있다.
		*/
	}
	public ArrayList<StudentDTO> selectAll(String searchKeyword) {
		ArrayList<StudentDTO> datas=new ArrayList<StudentDTO>();
		
		for(StudentDTO data:this.datas) {
			if(data.getName().contains(searchKeyword)) {
				datas.add(data);
			}
		}
		
		return datas;
	}
	public StudentDTO selectOne(int num) {
		System.out.println("   service.model.StudentDAO  selectOne() 시작");
		for(StudentDTO data:datas) {
			if(data.getNum()==num) {
				System.out.println("   service.model.StudentDAO  selectOne() 데이터 일치");
				return data;
			}
		}
		System.out.println("   service.model.StudentDAO  selectOne() 데이터 불일치");
		return null;
	}
	// 
	public StudentDTO selectOne() {
		System.out.println("   service.model.StudentDAO  selectOne() 시작 : 평균");
		int sum=0;
		for(StudentDTO data:datas) {
			sum+=data.getScore();
		}
		double avg=sum*1.0/datas.size();
		// 함수의 반환타입이 객체라 객체를 담기 위해 객체를 생성
		StudentDTO dto=new StudentDTO();
		dto.setAvg(avg);
		System.out.println("   service.model.StudentDAO  selectOne() 종료 : 평균");
		return dto;
	}
}

 

StudentDTO

package service.model;

// MVC 패턴에서 data를 VO, DTO라고 함
public class StudentDTO {
	private int num;
	private String name;
	private int score;
	private double avg;
	public double getAvg() {
		return avg;
	}
	public void setAvg(double avg) {
		this.avg = avg;
	}
	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 "StudentDTO [num=" + num + ", name=" + name + ", score=" + score + "]";
	}
}

 

view

package view;

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

import service.model.StudentDTO;

public class StudentView {
	static Scanner sc=new Scanner(System.in);

	public void print01() {
		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. 점수변경");
		System.out.println("7. 학생삭제");
		System.out.println("0. 프로그램 종료");
		System.out.println("==========");
	}
	public void print02() {
		System.out.print("추가할 학생의 이름 입력 >> ");
	}
	public void print03() {
		System.out.print("추가할 학생의 성적 입력 >> ");
	}
	public void print04() {
		System.out.println("학생 추가 완료!");
	}
	public void print05(ArrayList<StudentDTO> datas) {
		System.out.println("=== 전체 목록 ===");
		for(StudentDTO data:datas) {
			System.out.println(data);
		}
		System.out.println("===============");
	}
	public void print06() {
		System.out.println("출력할 데이터가 없습니다!");
	}
	public void print07() {
		System.out.print("검색할 학생의 번호 입력 >> ");
	}
	public void print08(StudentDTO data) {
		if(data==null) {
			System.out.println("검색 결과가 없습니다!");
			return;
		}

		System.out.println("=== 검색 결과 ===");
		System.out.println(data);
		System.out.println("===============");
	}
	public void print09() {
		System.out.print("삭제할 학생의 번호 입력 >> ");
	}
	public void print10() {
		System.out.println("학생 삭제 완료!");
	}
	public void print11() {
		System.out.println("학생 삭제 실패...");
		System.out.println("관리자에게 문의하세요.");
	}
	public void print12() {
		System.out.print("검색할 이름 입력 >> ");
	}
	public void print13(ArrayList<StudentDTO> datas) {
		if(datas.size() <= 0) {
			System.out.println("검색 결과가 없습니다!");
			return;
		}

		System.out.println("=== 검색 결과 ===");
		for(StudentDTO data:datas) {
			System.out.println(data);
		}
		System.out.println("===============");
	}
	public void print14(double avg) {
		// 학생이 많아질수록, 성적이 다양해질수록, V에 로직이 있으면 느려질것으로 예상
		// 평균 로직을 백단에 위치시킬예정
		System.out.println("전체 평균은 "+avg+"점 입니다.");
	}
	// 1. V  ex) 쿠팡의 총합금액 로직 등은 V에 위치함
	// 2. M vs C  ex) 오피지지의 승률픽률 로직 등은 백단에 위치함(C)
	public void print15() {
		System.out.println("학생 점수 변경 완료!");
	}
	public void print16() {
		System.out.println("학생 점수 변경 실패...");
		System.out.println("관리자에게 문의해주세요!");
	}
	
	
	public int inputAction() {
		int action=sc.nextInt();
		return action;
	}
	public String inputName() {
		String name=sc.next();
		return name;
	}
	public int inputScore() {
		int score=sc.nextInt();
		return score;
	}
	public int inputNum(int lastPK) {
		int num;
		while(true) {
			num=sc.nextInt();
			if(100 < num && num < lastPK) {
				break;
			}
			System.out.println("제대로 입력해주세요!");
		}
		return num;
	}
}