본문 바로가기
JAVA

[MVC] 학생관리시스템 : 예제

by amoomar 2022. 1. 17.
반응형



이전에는 MVC의 기본적인 내용과, VO & DAO의 사용 방법에 대해 다루었고, 이번 포스팅에서는 해당 내용들을 활용하여 예제를 풀이하는 내용을 담아보았다.




 

1. 각 파트에서 담아야할 내용

 

1) Model

 

  1. VO
    • 멤버변수
    • 생성자
    • getter & setter
    • toString Overriding
  2. DAO
    • pk
    • 배열리스트
    • 생성자(리스트의 객체화 & 초기데이터)
    • 비즈니스메서드

 

VO는 어떠한 경우에도 위에 기재된 내용들 중 하나가 삭제될 순 있지만 다른 내용이 추가가 되지는 않는다.




 

 

 

 

2) View

 

  • 사용자의 입력을 저장할 변수
  • 스캐너 & MyException등 입력과 유효성검사에 필요한 것들
  • 유효성 체크
    1. 초기화면(main화면)
    2. main에서의 입력에 따른 화면전환
      • 인자(Model의 내용)를 출력하는 메서드 : 목록보기 & 조회하기 등에 사용
      • 사용자의 입력을 유효성검사 진행 후 저장하는 메서드 : 입력의 자료형에 따라 로직을 각각 구현한다.



유효성검사에 따른 사용자의 입력 저장이 가장 중요하다






 

 

 

3) Controller

 

  • 클래스 변수 선언
  • 매핑 : V에서 사용자의 액션을 입력받는것으로 시작하여, 사용자 요청과 맞는 M과 결합하는 것.
  • model의 값에 대해 어떤 경로로 가야하는지 지정



*controller에서 자주 발견되는 예외 : java.lang.NullPointException*

: 객체가 null인 상황에서 메서드 수행시키려고하면 생기는 문제이다.








2. Model

 

1) VO

package model;

// 데이터 정의
public class StudentVO {
	//멤버변수
	private int pk;
	private String name;
	private int score;

	// getter & setter
	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;
	}
	public int getPk() {
		return pk;
	}
	public void setPk(int pk) {
		this.pk = pk;
	}
	
	//생성자
	public StudentVO(int pk, String name, int score) {
		this.pk = pk;
		this.name = name;
		this.score = score;
	}

	// 정보 출력시 사용
	@Override
	public String toString() {
		return pk + " | " + name + " | " + score + "점";
	}
	

}




2) DAO

package model;

import java.util.ArrayList;

// 데이터가 수행하는 행동을 정의
public class StudentDAO {
	
	private int pkNum = 2022001;//학번 시작번호

	ArrayList <StudentVO> datas = new ArrayList <StudentVO> ();
	
	
	// 학생 추가
	public void insert (StudentVO vo) {
		datas.add(new StudentVO(pkNum++, vo.getName(), vo.getScore()));
		System.out.println("로그 : 학생추가 완료");
	}
	
	
	// 목록보기
	public ArrayList<StudentVO> selectAll (StudentVO vo) {
		//유지보수때문에 인자 필요없어도 인자 주기
			return datas;
	}
	
	
	// 학생조회
	public StudentVO selectOne (StudentVO vo) {

		StudentVO data = null;
		for(int i=0; i<datas.size(); i++) {
			if(datas.get(i).getPk() == vo.getPk()) {
				data = datas.get(i);
				break;
			}
		}
		//입력한 학번이 없으면, null
		return data;

	}
	
	
	// 성적변경
	public void upDate (StudentVO vo) {
		for(int i=0; i<datas.size(); i++) {
			if(datas.get(i).getPk()==vo.getPk()) {
				if(vo.getScore() != 0) {
					datas.get(i).setScore(vo.getScore());				
				}
				System.out.println("로그 : 수정 완료");
				return; //리턴을 만나면 수정 완료!
			}
		}
		//리턴을 못만나면 수정 실패!
		System.out.println("로그 : 수정 실패");
	}
	
	
	// 학생정보삭제
	public void delet (StudentVO vo) {
		for(int i=0; i<datas.size(); i++) {
			if(datas.get(i).getPk() == vo.getPk()) {
				datas.remove(i);
				System.out.println("로그 : 삭제 완료");
				return; //리턴을 만나면 삭제 완료!
			}
		}
		//리턴을 못만나면 삭제 실패!
		System.out.println("로그 : 삭제 실패");
	}

	
}

 

목록보기 기능을 하는 selectAll메서드에서 기능상 인자가 별도로 필요하진 않으나, 추후에 발생될지 모르는 유지보수 부분을 고려하여 인자를 두고, 사용시마다 null혹은 인자를 입력하는게 좋다.

 

return 변수명; 처럼도 쓰지만, 리턴값이 없는경우에는 return;으로 사용하여 함수를 즉시종료 시킬 수 있다.

 

*return과 break*

return : 반복문 종료 이후 해야할 진행사항이 없는 경우
break : 반복문 종료 이후에 해야 할 진행사항이 있는 경우







3. VIew

package view;

import java.util.InputMismatchException;
import java.util.Scanner;

// 지정 범위 외 입력 : 예외화
class MyException extends Exception {

	MyException(String message){
		super(message);
	}

}

public class StudentView { 

	Scanner sc = new Scanner(System.in);
	MyException myExcep = new MyException("다시 입력하세요.");
	private int action; //사용자의 입력 저장
	String startMsg = "1. 학생추가 \n2. 목록 보기 \n3. 학생조회"
			+ "\n4. 성적변경 \n5. 삭제 \n6. 종료"; //시작메세지
	private String name; //입력된 이름
	private int score; //입력된 점수
	private int num; //입력된 학번

	// Getter & Setter
	public int getAction() {
		return action;
	}
	public void setAction(int action) {
		this.action = action;
	}
	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;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	
	// 시작화면
	public void startView() {
		System.out.println("학생관리 프로그램입니다!");
		System.out.println(startMsg);
		System.out.println("==================");

		while(true) {

			try{
				System.out.println(">>>");
				//잘못된 입력 저장 방지(새로운 변수)
				int action=sc.nextInt(); 

				if(action<1 || action>6) {
					throw myExcep;
				}
				//정상 입력이라면 저장
				this.action = action;
				break;
			} catch(InputMismatchException e) { //타입 외 입력
				sc.nextLine();//무한루프방지
				System.out.println("정수로 입력하세요");
				continue; //반복문 처음으로 가!
			}catch(Exception e) { //그 외 오류
				System.out.println("예외 발생 : "+e.getMessage());
			}

		}
	}

	// 학생추가
	public void stuInsert() {
		
		System.out.println("이름 : ");
		name = sc.next();
		
		while(true) {

			try{
				System.out.println("성적 : ");
				int score = sc.nextInt();
				
				if(score<0 || score>100) {
					throw myExcep;
				}
				
				this.score = score;
				break;
			} catch(InputMismatchException e) { //타입 외 입력
				sc.nextLine();//무한루프방지
				System.out.println("정수로 입력하세요");
				continue; //반복문 처음으로 가!
			}catch(Exception e) { //그 외 오류
				System.out.println("예외 발생 : "+e.getMessage());
			}

		}
	}
	
	
	
	// 학생조회
	public void stuSelectOne() {
		while(true) {

			try{
				System.out.println("조회할 학번 : ");
				int num = sc.nextInt();
				
				if(num<2022000 || score>2023000) {
					throw myExcep;
				}
				
				this.num = num;
				break;
			} catch(InputMismatchException e) { //타입 외 입력
				sc.nextLine();//무한루프방지
				System.out.println("정수로 입력하세요");
				continue; //반복문 처음으로 가!
			}catch(Exception e) { //그 외 오류
				System.out.println("예외 발생 : "+e.getMessage());
			}

		}
	}
	
	// 성적변경
	public void stuUpdate() {
		System.out.println("변경할 학번 : ");
		int num = sc.nextInt();
		
		while(true) {

			try{
				System.out.println("점수 수정 : ");
				int score = sc.nextInt();
				
				if(score<0 || score>100) {
					throw myExcep;
				}
				
				this.score = score;
				this.num = num;
				break;
			} catch(InputMismatchException e) { //타입 외 입력
				sc.nextLine();//무한루프방지
				System.out.println("정수로 입력하세요");
				continue; //반복문 처음으로 가!
			}catch(Exception e) { //그 외 오류
				System.out.println("예외 발생 : "+e.getMessage());
			}

		}
	}
	
	//삭제
	public void stuDelet() {
		while(true) {

			try{
				System.out.println("삭제할 학번 : ");
				int num = sc.nextInt();
				
				if(num<2022000 || score>2023000) {
					throw myExcep;
				}

				this.num = num;
				break;
			} catch(InputMismatchException e) { //타입 외 입력
				sc.nextLine();//무한루프방지
				System.out.println("정수로 입력하세요");
				continue; //반복문 처음으로 가!
			}catch(Exception e) { //그 외 오류
				System.out.println("예외 발생 : "+e.getMessage());
			}

		}
	}
	
	// 인자를 출력하는 메서드
	public void print(Object obj) {
		System.out.println(obj);
	}
	
	// 내용이 없을때
		public void noMsg() {
			System.out.println("내용이 없습니다.");
		}
	
	// 종료문구
	public void endPrint() {
		System.out.println("★프로그램이 종료됩니다★");
	}
	
}

 




4. Controller

package controller;

import model.StudentDAO;
import model.StudentVO;
import view.StudentView;

public class StudentController {
	//접근 목적
	//VO도 지속적으로 사용되기에 선언해도 되지만,
	//사용시마다 초기화 하기로 한다.
	StudentDAO modelDAO;
	StudentView view;

	//프로그램 리소스 메서드
	public void startController () {
		//인자 없이 객체생성
		modelDAO = new StudentDAO();
		view = new StudentView();
	}

	public void appStart() {
		while(true) {
			// 실행화면
			view.startView();

			// 1. 학생추가
			if(view.getAction()==1) {

				// view접근 -> 입력의 유효성검사&사용자입력 저장
				view.stuInsert();
				// 사용자입력 StudentVO로 저장 -> 필요없는 부분은 빈채로
				StudentVO vo = new StudentVO(0, view.getName(), view.getScore());
				// DAO접근 -> 삽입메서드 실행
				modelDAO.insert(vo);

			// 2. 목록보기
			} else if (view.getAction()==2) {
				
				//목록이 비어있다면 멘트 출력
				if(modelDAO.selectAll(null).size()==0) {
					view.noMsg();
				}

				//DAO접근 -> 목록 세로출력!!
				for(StudentVO d : modelDAO.selectAll(null)) {
					view.print("["+d+"]");
				}
				
			// 3. 검색	
			}  else if (view.getAction()==3) {

				//view접근 -> 입력의 유효성검사&사용자입력 저장
				view.stuSelectOne();
				//사용자입력 StudentVO로 저장 & DAO접근, 조회 메서드 실행
				StudentVO data = modelDAO.selectOne(new StudentVO (view.getNum(), null, 0));

				//만약 조회정보가 null이면!
				if(data==null) {
					view.noMsg();
				} else {
					view.print(data);
					// System.out.println(modelDAO.selectOne(data))와 같다;
				}

				
			// 4. 성적변경	
			}  else if (view.getAction()==4) {

				//view접근 -> 입력의 유효성검사&사용자입력 저장
				view.stuUpdate();
				//사용자입력 StudentVO로 저장
				StudentVO vo = new StudentVO(view.getNum(), null, view.getScore());
				// DAO접근 -> 수정메서드 실행
				modelDAO.upDate(vo);

			// 5. 삭제	
			} else if (view.getAction()==5) {

				//view접근 -> 입력의 유효성검사&사용자입력 저장
				view.stuDelet();
				//사용자입력 StudentVO로 저장
				StudentVO vo = new StudentVO(view.getNum(), null, 0);
				// DAO접근 -> 수정메서드 실행
				modelDAO.delet(vo);

			// 6. 종료
			} else if (view.getAction()==6) {
				view.endPrint();
				break;
			}


		}
	}

}

 

별도로 ModleVO의 초기화를 상단에 선언하지 않아도, 사용시마다 객체화 하도록 하는 방법도 있다.

StudentVO vo = new StudentVO(생성자에 지정된 Input);
modelDAO.메서드명(vo);
// 혹은
modelDAO.메서드명(new StudentVO(생성자에 지정된 Input));









5. mian과 console출력

package class01;

import controller.StudentController;

public class StudentClient {

	public static void main(String[] args) {
		StudentController ctrl = new StudentController();
		
		// 데이터 불러오기
		ctrl.startController();
		// 프로그램 실행
		ctrl.appStart();
	}
}

[출력화면 : -> 입력]
학생관리 프로그램입니다!
1. 학생추가
2. 목록 보기
3. 학생조회
4. 성적변경
5. 삭제
6. 종료
==================
>>>
2
내용이 없습니다.
학생관리 프로그램입니다!
1. 학생추가
2. 목록 보기
3. 학생조회
4. 성적변경
5. 삭제
6. 종료
==================
>>>
1
이름 :
김첨지
성적 :
78
로그 : 학생추가 완료

(생략 : 학생 1명 더 추가)

로그 : 학생추가 완료
학생관리 프로그램입니다!
1. 학생추가
2. 목록 보기
3. 학생조회
4. 성적변경
5. 삭제
6. 종료
==================
>>>
2
[2022001 | 김첨지 | 78점]
[2022002 | 왕밤빵 | 99점]
학생관리 프로그램입니다!
1. 학생추가
2. 목록 보기
3. 학생조회
4. 성적변경
5. 삭제
6. 종료
==================
>>>
3
조회할 학번 :
2022002
2022002 | 왕밤빵 | 99점
학생관리 프로그램입니다!
1. 학생추가
2. 목록 보기
3. 학생조회
4. 성적변경
5. 삭제
6. 종료
==================
>>>
4
변경할 학번 :
2022002
점수 수정 :
100
로그 : 수정 완료
학생관리 프로그램입니다!
1. 학생추가
2. 목록 보기
3. 학생조회
4. 성적변경
5. 삭제
6. 종료
==================
>>>
2
[2022001 | 김첨지 | 78점]
[2022002 | 왕밤빵 | 100점]
학생관리 프로그램입니다!
1. 학생추가
2. 목록 보기
3. 학생조회
4. 성적변경
5. 삭제
6. 종료
==================
>>>
6
★프로그램이 종료됩니다★





유효하지 않은 입력 범위에 대한 출력 결과는 첨부하지 않았다.





 

반응형