| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 비즈니스레이어
- @
- @RequestParam
- Model
- 스프링
- @ResponseBody
- AOP
- springmvc
- 서비스레이어
- Java
- 바인딩변수
- c:if
- SpringBoot
- 의존주입
- PointCut
- after-throwing
- application.properties
- jointpoint
- gradle
- 어노테이션
- @RequestMapping
- produces
- 유효성검사
- MVC
- spring
- 생성자주입
- springjdbc
- @Valid
- frontController
- .xml
- Today
- Total
메모장
MVC 패턴 본문
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();
}
}
'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 |