IT일반과목/java

MVC패턴으로 소스 짜보기

어쩌먼 2018. 8. 2. 21:42

MVC 패턴

디자인패턴 -> 공법 -> 소프트웨어의 개발방법을 공식화한것

소프트웨어를 개발중에 자주나타나는 과제를 해결하기 위해서 과거의 소프트웨어 개발과정에서 발견된 노하우를 축적해서 재이용하기 좋게 규약을 만들고 이름을 붙인것

 -> 개발자들끼리 커뮤니케이션 효율이 높다.


MVC패턴

책임을 나누는 느낌

Model - 데이터(DB) -> 데이터를 가지고있는 객체

View - 화면을 구성하는 프로세스(html,css,javascript)

Controller - View - model 조정

앞글자를 하나씩 딴것이다.


View객체를 만든 것이다.

Student에선 이름과 성적을 넣었다 생각을 하면

Controller이라는 녀석에서 이름입력후 성적입력후 그 데이터를 객체에 저장을 했는데


MVC패턴으로 하면 view에 이름입력하세요가 view가있고 성적입력도 다 view가있고 실제 입력도 view에서받는다. 이게 역할이 끝이다. 이 받은데이터를 컨트롤러에주고 이걸 student라는 객체에 준다.


student0802이거 압축풀어서 이걸 바꿔보겠다.

-------------------------------------------------------------------

Student 클래스는 그냥 냅둬도된다.

StuMgr을 Controller이랑 View에 옮길 것이다.

1. 학생등록

2. 출력

3. 삭제



view는 보여주고 입력만하고 처리는 안한다.

어디까지가 view의영역이고 어디까지가 컨트롤러의역할인지봐야된다.


0번이랑 1번의 데이터가 있고 나머지에 대해서는 데이터가 없다. 우리가 해야될께 c.count를 해서 index가 2라는 것도 알고있다.



======================================================================================


--------------------------------------------------------------

package kh.java.run;

import kh.java.controller.StuMgr;

import kh.java.model.vo.Student;

import kh.java.view.View;

public class Run {


public static void main(String[] args) {

// StuMgr s = new StuMgr();

// s.insertStudent(new Student("홍길동",20,"경기도"));

// s.insertStudent(new Student("김말똥",30,"충청도"));

// s.insertStudent(new Student("고길똥",99,"서울시"));

// s.viewAllStudent(); //저장된 모든 학생들 정보 출력

View v = new View();

v.main();

}

}


----------------------------------------------------------------------------------------------------------

package kh.java.view;


import java.util.Scanner;


//컨트롤러를 호출하기 위해서

import kh.java.controller.Controller;

import kh.java.model.vo.Student;


public class View {

Scanner sc = new Scanner(System.in);

Controller c = new Controller();

public void main() {

while(true) {

System.out.println("1. 학생등록");

System.out.println("2. 학생출력");

System.out.println("3. 학생삭제");

System.out.println("4. 종료");

System.out.print("선택 > ");

int sel = sc.nextInt();

switch(sel) {

case 1: insert(); break;

case 2: print(); break;

case 3: delete(); break;

case 4: return;

default : System.out.println("잘못입력하셨습니다.");

}

}

}

public void delete() {

System.out.println("===== 학생 삭제 =====");

System.out.println("삭제 학생 이름 입력 : ");

String name = sc.next();

//search를 돌릴것이다.

if(c.delete(name)) {

System.out.println("삭제완료");

}else {

System.out.println("이름이 존재하지 않습니다.");

}

}

public void print() {

System.out.println("=====학생출력=====");

System.out.println("이름\t 나이\t 주소");

for(int i=0;i<c.count();i++) {//Controller의 count를 갖고왔다.

Student s = c.print(i);//주소값 저장하기 위해 잠깐 만든것이다.

//index번호를 그대로 준다.

//c.print는 i의 숫자를 controller에다가 줘서 Controller배열의 몇번지의 주소를 받아온다.

//얘의 의미는 내가 Student 참조형변수 s를만들었고 거기에 어떤변수 저장할꺼냐면

//Controller의 주소값을 저장을 하겠다는 것이다.

//그녀석은 index번호를 줄것이다. 

//반복문안에 넣어두고 i라는 값을 통해줄것이다.

//처음에 0이면 Controller에서 0번지의 주소를 갖고올것이다.

//s=s[0]

System.out.printf("%s\t %d\t %s\t \n",s.getName(),s.getAge(),s.getAddr());

//s라는 녀석에다가 실제 저장되어있는 주소를 저장했으니 굳이 배열을 쓸필요가 없는 것이다.

//c[i].getName()도가능

//c.insert(name,age,addr)도가능

//Controller에서 생성자를 string name, int age, String addr)로만들어도상관은 없다.

}

}

public void insert() {

System.out.println("============= 학생 등록 ==========");

System.out.print("이름 입력 : ");

String name = sc.next();

System.out.println("나이 입력 : ");

int age=sc.nextInt();

System.out.print("주소입력 : ");

String addr = sc.next();

Student s = new Student(name,age,addr);//학생이라는 생성자를 호출했다.

//오로지 데이터를 컨트롤러에 전달하기 위한 목적이다.

//여기아래부턴 컨트롤러한테 떠넘길꺼다.

c.insert(s);//등록을 하면 컨트롤러의 등록을 호출할꺼야 

//여기에 주소를 줄꺼야.

System.out.println("저장완료");

}

}


----------------------------------------------------------------------------------------------------------
package kh.java.model.vo;

public class Student {
private String name;
private int age;
private String addr;

public Student() {
} // 기본생성자

public Student(String name, int age, String addr) {
this.name = name;
this.age = age;
this.addr = addr;
}

// getter
public String getName() {
return name;
}

public int getAge() {
return age;
}

public String getAddr() {
return addr;
}

// setter
public void setName(String name) {
this.name = name;
}

public void setAge(int age) {
this.age = age;
}

public void setAddr(String addr) {
this.addr = addr;
}
}

------------------------------------------------------------------------------------------
package kh.java.controller;

import kh.java.model.vo.*;

public class Controller {
Student []s = new Student[10];
int index=0;

public void insert(Student stu) {
s[index++]=stu;
//전달받은 주소값을 우리가 저장한 객체배열에 저장하고 1을 더했다.

}
public int count() {
return index;
}//index라는걸 넘겨주기 위해 만들었다.

public Student print(int i) {
return s[i];//요청한인덱스번호의 주소를 리턴해줄께 Student타입으로 리턴해줄께
}//Student의주소값을 넘겨줄것이다.
public boolean delete(String name) {
int a=-1;
for(int i=0; i<index; i++) {
if(s[i].getName().equals(name)) {
a=i;//같은값을 찾을 경우
break;//반복문을 빠져나와
}
}
//삭제코드
if(a==-1) {
System.out.println("삭제할데이터가 없다.");
return false;
}else {
for(int i=a; i<index-1; i++) {
s[i]=s[i+1];
}
s[--index]=null;
return true;
}

}

}

-----------------------------------------------------------------------------------------------