본문 바로가기

개발자노트

[MVC] DB사용 없이 기초예제 (학생부+기능추가)

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;
			}

		}
	}
}