유지보수가 용이한 코드
- 결합도가 낮고, 응집도는 높은 코드
결합도
- 코드 사이의 관계성
- 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;
}
}
}
}