재밌고 어려운 IT를 이해해보자~!
MVC design pattern 본문
MVC! 신기하다 완전체계적이다! 그리고 매우 중요하다 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
MVC란 ?!?!
개발패턴 MVC
MVC 는 Model, View, Controller의 약자 이다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴이다!
원래 스프링 들어가서 배우는 편이지만 일찍 배우게되었다.
팀플을 진행할때, 코드가 Test.java 파일 1개이기때문에 다음과 같은 불편함이 있다.
1) 다른 사람이 코드 작성중일때 => 실행불가능
2) 다른 사람과의 동시간 형상(버전)관리가 불편함
MVC패턴을 사용하면 => 인형을 만들때 머리 몸통 팔 분담해서 만들기 가능
내가 뭘원하는지 구체적으로 생각하자. 본인이 어떤 파트를 하고싶고 잘 맞는지 생각해보는 것도 중요하다.
Model
데이터와 관련된 직업을 처리하는 부분
전제조건 "나는 항상 정확한 값을 받았다."
회원가입 생년월일에 -2000 이런일 아예없다.
모든게 정확하게 입력받았다는 가정하에 어떻게 처리해야하는지를 구상
CRUD 구현
View
사용자와 관련된 작업을 처리하는 부분
"세상에 정상적인 사용자는 없다." 라고 가정
사용자의 모든 입력 값에 대해서 검사 == 유효성 검사
사용자에게 친절한 프로그램이 될수있도록 고민하는 역할
== 사용자 편의성 == -> UI/UX !
Controller
★ M-V 이어주는 역할 ★
M과 V는 절대로 직접 결합되어서는 안된다. NEVER!
오직 Contorller를 통해서만 결합될수 있다!!!
MVC를 접목하는것이 다음주과제
하나의 프로그램에서 Model,View,Controller 객체를 각각 1개씩만 사용한다.
싱글톤 패턴 유지 가능!
앞으로 package 명은
model
view
controller
cline
이다!
학생부 프로그램 MVC 패턴으로 제작하기!!
제작전 설계진행--
LP -> logicprocess / UF userflow / ERD (데이터)
CRUD
Create -> 학생 추가
Read
1. 학생전체 목록
2. 학생 검색
update -> 학생 정보 변경
delete -> 학생 삭제
//종료
MCV -> Model, Ctrl, View
View 메뉴 출력
유저 입력 0~5
print true
print false
Model
입력 받은것으로 기능추가 CRUD진행
이때 Student 클래스는 View에서 참조할 수 있도록 별도로 public 선언
insert
update
delete
Ctrl
//메인문처럼 작성 VIEW, MODEL 결합
// client에서 작동
Model
package model;
import java.util.ArrayList;
public class StudentModel {
private ArrayList<Student> datas;
public StudentModel() {
datas = new ArrayList<Student>();
datas.add(new Student(1001, "개구리", 50));
}
public ArrayList<Student> selectAll() {
return datas;
}
public Student selectOne(int num) {
for (Student data : datas) {
if (data.getStuNumber() == num) {
return data;
}
}
return null;
}
public boolean insert(int StuNumber, String StuName, int StuScore) {
datas.add(new Student(StuNumber, StuName, StuScore));
return true;
}
public boolean update(int StuNumber, int StuScore) {
//스코어는 VIew에서 유효성검사 및 예외처리
//stunum은 유효한 값이 들어왔을때 데이터에 없을 수 도 있음으로 여기서 유효성검사
boolean flag = false;
int i;
for (i=0; i<datas.size(); i++) {
if (datas.get(i).getStuNumber()==StuNumber) {
flag = true;
break;
}
}
if (!flag) {
// System.out.println("학생 존재 X");
}
datas.get(i).setScore(StuScore);
// System.out.println("점수 변경 완료");
return true;
}
public boolean delete(int StuNumber) {
boolean flag = false;
int i;
for (i=0; i<datas.size(); i++) {
if (datas.get(i).getStuNumber()==StuNumber) {
flag = true;
break;
}
}
if (!flag) {
// System.out.println("학생 존재 X");
}
datas.remove(i);
//System.out.println("점수 삭제 완료");
return true;
}
}
student class
package model;
public class Student {
int stuNumber; // PK
String name;
int score;
Student(int stuNumber,String name, int score) {
this.stuNumber = stuNumber;
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStuNumber() {
return stuNumber;
}
public void setStuNumber(int stuNumber) {
this.stuNumber = stuNumber;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "이름: " + name + "번호: " + stuNumber + "점수: " + score;
}
}
View
package view;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Pattern;
import model.Student;
public class StudentView {
private Scanner sc;
public StudentView() {
sc = new Scanner(System.in);
}
public void printMenu() {
System.out.println("====MENU====");
System.out.println(" 1. 학생 추가 ");
System.out.println(" 2. 학생 출력 ");
System.out.println(" 3. 학생 검색 ");
System.out.println(" 4. 학생 변경 ");
System.out.println(" 5. 학생 삭제 ");
System.out.println(" 0. 종료 ");
System.out.println("============");
}
public int inputAction() {
System.out.println("입력 >> ");
int action;
while (true) {
try {
action = sc.nextInt();
if (action >= 0 && action <= 5) {
break;
}
System.out.println("입력 범위 초과");
} catch (Exception e) {
System.out.println(("ONLY 정수 입력"));
sc.nextLine();
}
}
return action;
}
public String inputStuName() {
String name;
while (true) {
System.out.print("학생이름입력 >> ");
try {
name = sc.next();
boolean checkStr = Pattern.matches("^[ㄱ-ㅎ|가-힣]*$",name);
if(checkStr) {
break;
}
System.out.println("ONLY 한글");
} catch (Exception e) {
System.out.println("입력 에러");
sc.nextLine();
}
}
return name;
}
public int inputStuNumber() {
int stuNum;
while (true) {
System.out.print("학생번호입력 >> ");
try {
stuNum = sc.nextInt();
if (1000 < stuNum && stuNum <= 2000) {
break;
}
System.out.println("번호(PK) 범위 초과");
} catch (Exception e) {
System.out.println(("ONLY 정수 입력"));
sc.nextLine();
}
}
return stuNum;
}
public int inputScore() {
int stuScore;
while (true) {
System.out.print("학생점수입력 >> ");
try {
stuScore = sc.nextInt();
if (0 <= stuScore && stuScore <= 100) {
break;
}
System.out.println("점수 범위 초과");
} catch (Exception e) {
System.out.println("ONLY 정수 입력");
sc.nextLine();
}
}
return stuScore;
}
public void printTrue() {
System.out.println("완료!");
}
public void printFalse() {
System.out.println("해당 번호의 학생은 없습니다...");
}
public void StudentDatas(ArrayList<Student> datas) {
System.out.println("====학생 목록====");
for (Student data : datas) {
System.out.println(data);
}
System.out.println("===============");
}
public void StudentData(Student data) {
System.out.println("====학생 목록====");
System.out.println(data);
System.out.println("===============");
}
}
Controller
package controller;
import java.util.ArrayList;
import model.Student;
import model.StudentModel;
import view.StudentView;
public class StudentCtrl {
private StudentModel model;
private StudentView view;
public StudentCtrl() {
this.model = new StudentModel();
this.view = new StudentView();
}
public void startApp() {
int PK = 1002;
view.printMenu();
while (true) {
int action = view.inputAction();
if (action == 1) {
String name = view.inputStuName();
int score = view.inputScore();
boolean flag = model.insert(PK++, name, score);
if (!flag) {
view.printFalse();
} else {
view.printTrue();
}
} else if (action == 2) {
view.StudentDatas(model.selectAll());
} else if (action == 3) {
} else if (action == 4) {
} else if (action == 5) {
int num = view.inputStuNumber();
boolean flag = model.delete(num);
if (!flag) {
view.printFalse();
} else {
view.printTrue();
}
} else if (action == 0) {
System.out.println("프로그램 종료");
break;
}
}
}
}
Client
package client;
import controller.StudentCtrl;
public class Client {
public static void main(String[] args) {
StudentCtrl app = new StudentCtrl();
app.startApp();
}
}
피드백
안보고 나만의 학생부 프로그램을 만들어보려했는데 정말 어려웠다!!
반복학습이 필요해보인다.
View - 유저에게 출력, 유저의 입력 받기 학생전체출력같은경우 -> 모델에서 데이터를 메게변수로 받아와야한다.
Model- 기능부구현 insert, update, delete , 또한 전체데이터, 하나의데이터 리턴
-> 모델에서의 Read는 데이터의 반환을 의미. view에서는 데이터에 접근하지 못한다 따라서 model에서 데이터를 반환 한것을 view를 이용해서 출력
Controller - View , Model을 합성해서 main문에서 동작할 수 있도록 작성. run() 자체는 Client 클래스에서 진행.
'코리아IT핀테크과정' 카테고리의 다른 글
MVC Pattern Practice 1 (0) | 2023.12.13 |
---|---|
DTO (Data Transfer Object) DAO (Data Access Object) (0) | 2023.12.12 |
컬렉션 프레임워크 (Collection Framework) (2) | 2023.12.07 |
추상클래스 (abstract class), 인터페이스 (Interface) (2) | 2023.12.06 |
상속을 이용한 CRU 설계 및 제작 (0) | 2023.12.03 |