StudentVO 에서 멤버변수들을 선언하고.
package model;
public class StudentVO {
private int num; // pk
private String name;
private int score;
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 "StudentVO [num=" + num + ", name=" + name + ", score=" + score + "]";
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return super.equals(obj);
}
}
StudentDAO에서 ArrayList를 사용해 DB역할+시그니처 메서드를 구현 하였다.
package model;
import java.util.ArrayList;
public class StudentDAO {
ArrayList<StudentVO> datas; // DB
private int pk; // 시스템(프로그램)에서 부여
public StudentDAO() {
datas=new ArrayList<StudentVO>();
pk=1001;
// 샘플(초기) 데이터
StudentVO vo=new StudentVO();
vo.setName("홍길동");
vo.setNum(pk++);
vo.setScore(50);
datas.add(vo);
}
public boolean insert(StudentVO vo) {
try {
vo.setNum(pk++);
datas.add(vo);
return true;
} catch(Exception e) {
e.printStackTrace();
System.out.println(" 로그: insert()에서 확인되지 않은 예외 발생!");
return false;
}
}
public boolean update(StudentVO vo) { // vo에 들어온 num값이 나한테(datas에) 있는지 확인을 해줘야함
for(StudentVO data:datas) {
if(data.getNum()==vo.getNum()) { // 내가 갖고있는 vo의 data와 새로 들어온 vo의 datas를 비교해 있다면,
data.setScore(vo.getScore()); // 나의 data를 새로 들어온 vo의 getScore()로 set한다.
return true;
}
}
return false;
}
public boolean delete(StudentVO vo) {
// datas.remove(pk); -> 유효성 검사를 다른곳에서 다 해줬을 시 한줄만 작성해도 된다.
for(int i=0;i<datas.size();i++) {
if(datas.get(i).getNum()==vo.getNum()) { // 만약 내가 갖고있는 datas(i)가 가지고 있는 num값이 인자로 들어온 vo.getNum()과 같다면,
datas.remove(i); // 내가 가지고 있는 datas(i)를 삭제해라.
return true;
}
}
return false;
}
public StudentVO selectOne(StudentVO vo) { // num을 받아서 num과 동일한 값을 가진 vo를 반환
for(StudentVO data:datas) { //내가 가진 datas를 data로 하나씩 전달한다.
if(data.getNum()==vo.getNum()) { // 만약에 내가 datas로부터 전달받은 data값과 인자로받은 vo.getNum()과 같다면
return data; // 내가 가진 datas중에 해당하는 data를 반환한다.
}
}
return null;
}
public ArrayList<StudentVO> selectAll(StudentVO vo) {
if(vo.getName()!=null) { // 겟네임이 null이 아니라면
// 검색 [서비스]
ArrayList<StudentVO> datas=new ArrayList<StudentVO>(); // 해당 지역에서만 사용되는 변수 datas , if문 안에서만
for (int i = 0; i < this.datas.size(); i++) {
if(this.datas.get(i).getName().equals(vo.getName())) { //원래있던 애의데이터랑 controller에서 받은 vo 데이터의 값과 비교
datas.add(this.datas.get(i)); // 여기서만 사용될 datas 배열에, 원래 있던 데이터와 같은 배열의위치에 값을 저장해놓고
}
}
return datas; // 여기서만 사용된 배열을 리턴한다.
}
/*
ArrayList<StudentVO> datas=new ArrayList<StudentVO>();
datas에 데이터를 채워넣는 로직
return datas;
*/
return datas; // 전부의 데이터를 출력
}
}
여기서 중요한건 selectOne 과 selectAll의 차이를 눈여겨 봐야하는데, 달아논 주석을 보면 이해가 될 것이다.
각 비즈니스메서드의 로직들을 익혀두자.
다음은 view 단인데, 다음부턴 함수명들을 각 기능에 맞게 정의하는게 중요할 것 같다.
package view;
import java.util.ArrayList;
import java.util.Scanner;
import model.StudentVO;
public class StudentView {
public int action;
Scanner sc = new Scanner(System.in);
public void startView() {
while (true) {
System.out.println();
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("메뉴입력) ");
try {
action = sc.nextInt();
if (1 <= action && action <= 6) {
break;
}
System.out.println("범위 외 입력!");
} catch (Exception e) {
sc.nextLine();
System.out.println("정수만 입력하세요!");
}
}
}
public String inputString() {
System.out.println("문자열입력) ");
String str = sc.next();
return str;
}
public int inputInt() {
System.out.println("번호입력) ");
int i = sc.nextInt();
return i;
}
public void printDatas(ArrayList<StudentVO> datas) {
System.out.println();
if(datas.size()==0) {
System.out.println("저장 된 정보가 없습니다.");
return;
}
System.out.println("===학생목록===");
for (StudentVO vo : datas) {
System.out.println(vo.getNum() + "번 " + vo.getName() + "학생 " + vo.getScore() + "점");
}
System.out.println("===========");
}
public void func1() {
System.out.println("학생추가 메뉴입니다.");
}
public void func2() {
System.out.println("학생목록 메뉴입니다.");
}
public void func3() {
System.out.println("성적변경 메뉴입니다.");
}
public void func4() {
System.out.println("이름을 입력합니다..");
}
public void func5() {
System.out.println("성적을 입력합니다..");
}
public void func6() {
System.out.println("번호를 입력합니다..");
}
public void func7() {
System.out.println("프로그램을 종료합니다.....");
}
public void func8() {
System.out.println("수행성공!");
}
public void func9() {
System.out.println("수행실패...");
}
public void del() {
System.out.println("삭제하실 학생의 번호를 입력하세요.");
}
public String func11() {
String ans;
while(true) {
System.out.println("성적을 추가 입력하시겠습니까? (YES/NO)");
ans=sc.next();
ans.toUpperCase(); // ans를 대문자로 고정시킨다.
if(ans.equals("YES")||ans.equals("NO")) {
break;
}
System.out.println("Y or N만 입력 가능합니다.");
}
return ans;
}
public void search() {
System.out.println("학생 검색 메뉴입니다.");
}
}
마지막으로 Controller 단인데, 여기서 볼 것은 사용자의 입력값을 view로 어떻게 받고 그걸 model에 어떻게 적용할 지에 대해서 연결하는 것을 주로 확인하면 된다. action==1번에 길게 주석처리 된 부분은 같은 로직을 다르게 쓰는 법을 작성해놨다.
package controller;
import java.util.ArrayList;
import javax.sql.DataSource;
import model.StudentDAO;
import model.StudentVO;
import view.StudentView;
public class StudentController {
private StudentDAO model;
private StudentView view;
public StudentController() {
model = new StudentDAO();
view = new StudentView();
}
public void startApp() {
while (true) {
view.startView();
if (view.action == 1) { //
// StudentVO vo = new StudentVO();
// view.func1(); // 학생추가메뉴입니다. 추가
// view.func4();
// vo.setName(view.inputString());
// view.func8();
// String ans=view.func11();
// if(ans.equals("Yes")) {
// view.func5();
// vo.setScore(view.inputInt());
// boolean flag = model.insert(vo);
// if (flag) {
// view.func8();
// }
// }
// else if(ans.equals("No")) {
// vo.setScore(0);
// view.func8();
// model.insert(vo);
if (view.action == 1) {
view.func1();
view.func4();
String name = view.inputString();
String ans = view.func11();
int score = 0;
if (ans.equals("YES")) {
view.func5();
score = view.inputInt();
}
StudentVO vo = new StudentVO();
vo.setName(name); // V에서 입력받은 값을
vo.setScore(score); // vo객체에 setter로 설정해서 인자로 넘겨줌
boolean flag = model.insert(vo); // insert는 boolean 타입이다.
if (flag) { // flag가 ture이면
view.func8(); // func8 수행성공 출력
} else {
view.func9(); // false면 func9 수행실패 출력
}
}
} else if (view.action == 2) { // ★★★★★
view.func2();
StudentVO vo = new StudentVO();
ArrayList<StudentVO> datas = model.selectAll(vo);
view.printDatas(datas);
} else if (view.action == 3) {
view.func3(); // 성적 변경 메뉴 호출
view.func6(); // 숫자 입력 호출
int num = view.inputInt();
view.func5(); // 성적입력하시오
int score = view.inputInt();
StudentVO vo = new StudentVO();
vo.setNum(num);
vo.setScore(score);
boolean flag = model.update(vo);
if (flag) {
view.func8();
} else {
view.func9();
}
} else if (view.action == 4) {
view.func2();
StudentVO vo = new StudentVO();
ArrayList<StudentVO> datas = model.selectAll(vo);
view.printDatas(datas);
view.del();
view.func6();
int num = view.inputInt();
vo.setNum(num);
vo = model.selectOne(vo);
if (vo == null) {
System.out.println(" 로그: " + num + "번의 학생은 존재하지않습니다!");
view.func9();
continue;
}
boolean flag = model.delete(vo);
if (flag) {
view.func8();
} else {
view.func9();
}
} else if (view.action == 5) {
StudentVO vo = new StudentVO();
view.search();
view.func4();
String name = view.inputString();
// 로직이 필요함
// DAO에서 제작해야함
// R : sellectAll vs selectOne
// output이 2개이상 vs 1개(or 0개)
// -> pk로 검색하는 경우가 아니라면 모두 ALL()
ArrayList<StudentVO> datas = model.selectAll(vo);
vo.setName(name);
// V에서 사용자가 입력한 이름정보를
// M_DAO의 핵심로직(비즈니스 메서드) 인자로 전달하는 코드
view.printDatas(datas);
}
else if (view.action == 6) {
view.func7();
break;
}
}
}
}
'개발자노트' 카테고리의 다른 글
MVC 를 활용한 팀프로젝트 설계안 (0) | 2022.06.30 |
---|---|
[MVC] DB사용 없이 기초예제 (학생부) (0) | 2022.06.28 |
개발의 구조적 패턴 [MVC] (0) | 2022.06.28 |
Resource 파일 복사하기 [buff]와 [FileIn/OutputStream] 응용 (0) | 2022.06.27 |
Resource의 문자들을 [.parseInt]를 사용하여 연산하기 (0) | 2022.06.27 |