The Debugging Chronicles : "코드의 미학"
MVC 패턴 예제 본문
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;
}
}
'JAVA > 자바 수업 내용' 카테고리의 다른 글
디버깅표 문제 (0) | 2024.07.31 |
---|---|
MVC 패턴 (0) | 2024.07.30 |
제네릭 배열리스트 컬렉션 프레임 워크 (0) | 2024.07.29 |
추상 클래스 (0) | 2024.07.29 |
오버라이딩 : 메서드 재정의 (final 상수화 static 클래스 변수) (0) | 2024.07.29 |