이전에는 MVC의 기본적인 내용과, VO & DAO의 사용 방법에 대해 다루었고, 이번 포스팅에서는 해당 내용들을 활용하여 예제를 풀이하는 내용을 담아보았다.
1. 각 파트에서 담아야할 내용
1) Model
- VO
- 멤버변수
- 생성자
- getter & setter
- toString Overriding
- DAO
- pk
- 배열리스트
- 생성자(리스트의 객체화 & 초기데이터)
- 비즈니스메서드
VO는 어떠한 경우에도 위에 기재된 내용들 중 하나가 삭제될 순 있지만 다른 내용이 추가가 되지는 않는다.
2) View
- 사용자의 입력을 저장할 변수
- 스캐너 & MyException등 입력과 유효성검사에 필요한 것들
- 유효성 체크
- 초기화면(main화면)
- 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
★프로그램이 종료됩니다★
유효하지 않은 입력 범위에 대한 출력 결과는 첨부하지 않았다.
'JAVA' 카테고리의 다른 글
[MVC] 계산기 : 예제 (0) | 2022.01.18 |
---|---|
[컬렉션 프레임워크] 학생관리시스템_배열리스트 (0) | 2022.01.15 |
[MVC] MVC개념 & DAO·VO (0) | 2022.01.15 |
[파일 입출력] TXT & 이미지형식 (+Wrapper Class) (0) | 2022.01.14 |
[Thread] 블록 & 동기화 (0) | 2022.01.13 |