Java

[MVC 패턴] Java로 MVC 패턴 구현하기 (2) - 결합도 낮추기

콩스프 2022. 12. 16. 11:22

유지보수가 용이한 코드

  • 결합도가 낮고, 응집도는 높은 코드

 

결합도

  • 코드 사이의 관계성
  • 1가지의 수정사항이 발생했을 때, 얼마나 코드를 변경해야하는가?

 

응집도

  • 로직에 관한 사항
  • 같은 로직을 가지는 코드를 모듈화하여 관리하기

 

 

결합도 낮추기

 

[MVC 패턴] Java로 MVC 패턴 구현하기 (1)

MVC 패턴 이란? [12/13] MVC 패턴 웹 어플리케이션의 아키텍쳐 모델 1 JSP + JavaBeans (Service) : 뷰와 로직이 섞여있음 장점 단점 구조가 단순함 - 출력과 로직 코드가 섞여 JSP 코드가 복잡해짐 - 프런트와

bean-soup-99.tistory.com

  • 여기서 작성한 코드는 DAO에서 인자가 계속 변경되고 있음
  • 메서드 시그니쳐가 자주 변경됨 == 결합도가 매우 높다는 것
    EX) 만약, 학생 데이터에 속성(멤버변수)에 변화가 있다면 DAO, Controller, View에서 모두 수정을 해야함 
    ➡ 비효율적인 코드

 

Q) 어떤 변경사항이 발생했을 때, DAO의 인자 (메서드 시그니쳐)가 변경되지 않으려면?

 

A) 💡 DAO 메서드의 인자를 VO로 설정하자

 

📌 DAO의 CRUD 비즈니스 메서드들의 메서드 시그니쳐
  • input : VO 객체
  • output : boolean

 

 

VO 생성자

  • 웹 에서는 VO 생성자를 전부 '기본 생성자'로 사용
    • 데이터의 속성이 변동되었을 때 영향을 줄일 수 있음
  • "기본 생성자 + setter * N" 형태로 사용

 

 

StudentDAO

package model;

import java.util.ArrayList;

public class StudentDAO {
	private int PK;
	ArrayList<StudentVO> datas = new ArrayList<StudentVO>();

	public StudentDAO() {
		PK = 1001;
		// 샘플데이터 -> 프로그램이 시작되자마자 저장되어있는 기존의 데이터
		datas = new ArrayList<StudentVO>();
		datas.add(new StudentVO(PK++, "홍길동", 91, 20));
		datas.add(new StudentVO(PK++, "임꺽정", 86, 23));
	}
	
	// CUD : Ctrol로부터 데이터를 받아와서, Model에게 넘겨주는 작업 

	// 학생추가 C
	public boolean insert(StudentVO vo) {
		try {
			datas.add(new StudentVO(PK++, vo.getName(), vo.getScore(), vo.getAge()));
		}
		catch(Exception e) {
			System.out.println("    로그: 학생추가 실패");
			return false;
		}
		System.out.println("    로그: 학생추가 성공");
		return true;
	}

	// 이름변경 U
	public boolean update(StudentVO vo) {
		for (int i = 0; i < datas.size(); i++) {
			if (datas.get(i).getNum() == vo.getNum()) {
				if(vo.getName() != null) {
					datas.get(i).setName(vo.getName());
				}
				else {
					datas.get(i).setScore(vo.getScore());
				}
				System.out.println("    로그: 학생정보변경 성공");
				return true;
			}
		}
		System.out.println("    로그: 학생정보변경 실패");
		return false;
	}

	// 학생삭제 D
	public boolean delete(StudentVO vo) {
		for (int i = 0; i < datas.size(); i++) {
			if (datas.get(i).getNum() == vo.getNum()) {
				datas.remove(i);
				System.out.println("    로그: 학생삭제 성공");
				return true;
			}
		}
		System.out.println("    로그: 학생삭제 실패");
		return false;
	}
	
	// R: Model이 Ctrl에게 데이터를 전달하는 작업

	// 목록보기 R
	public ArrayList<StudentVO> selectAll(StudentVO vo) {
		return datas;
	}
	
	// 학생보기 R
	public StudentVO selectOne(StudentVO vo) {
		for(int i=0; i<datas.size(); i++) {
			if(datas.get(i).getNum() == vo.getNum()) {
				return datas.get(i);
			}
		}
		return null;
	}
}

 

Controller

package ctrl;

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

public class StudentCtrl {
	private StudentDAO model;
	private StudentView view;

	public StudentCtrl() {
		model = new StudentDAO();
		view = new StudentView();
	}

	public void startApp() {
		while (true) {
			int action = view.printMenu();

			if (action == 1) {
				StudentVO vo = new StudentVO();
				vo.setName(view.getString());
				vo.setScore(view.getScore());
				vo.setAge(view.getAge());
				model.insert(vo);
			} else if (action == 2) {
				view.printData(model.selectAll(null));

			} else if (action == 3) {
				StudentVO vo = new StudentVO();
				vo.setNum(view.getNum());
				view.printData(model.selectOne(vo));

			} else if (action == 4) {
				StudentVO vo = new StudentVO();
				vo.setNum(view.getNum());
				vo.setName(view.getString());

				model.update(vo);

			} else if (action == 5) {
				StudentVO vo = new StudentVO();
				vo.setNum(view.getNum());
				vo.setScore(view.getScore());
				model.update(vo);

			} else if (action == 6) {
				StudentVO vo = new StudentVO();
				vo.setNum(view.getNum());
				model.delete(vo);
			} else {
				break;
			}
		}
	}
}