웹 어플리케이션의 아키텍쳐
모델 1
JSP + JavaBeans (Service) : 뷰와 로직이 섞여있음
장점 | 단점 |
구조가 단순함 | - 출력과 로직 코드가 섞여 JSP 코드가 복잡해짐 - 프런트와 백엔드가 혼재되어 분할이 용이하지 않음 - 유지보수가 어려움 |
모델 2
JavaBean(Service) + JSP + Servlet : MVC 패턴과 유사함
장점 | 단점 |
- 뷰와 로직의 분리로 모델1에 비해 덜 복잡함 - 분업이 용이하며, 유지보수가 쉬움 |
- 모델1에 비해 습득이 어렵고, 작업량이 많음 |
MVC 패턴
- 사용자가 어플리케이션을 사용 ➡ 원하는 기능을 처리하기 위한 모든 요청을 컨트롤러에 보냄
- 컨트롤러는 모델을 사용하고, 모델은 알맞은 비즈니스 로직을 수행
- 컨트롤러는 사용자에게 보여줄 뷰를 선택
- 선택된 뷰는 사용자에게 알맞은 결과 확인을 보여줌 ➡ 사용자에게 보여줄 데이터는 컨트롤러를 통해 전달받음
모델
- 값과 기능을 가지고 있는 객체
- 비즈니스 로직을 수행
모델 EX)
public class StudentVO {
private int num;
private String name;
private int score;
...
}
public class StudentDAO {
ArrayList<StudentVO> students;
public StudentDAO() {
students = new ArrayList<StudentVO>();
}
//C
public boolean insert(StudentVO svo) {...}
//R
public ArrayList<StudentVO> selectAll(StudentVO svo) {...}
public StudentVO selectOne(StudentVO vo) {...}
//U
public boolean update(StudentVO svo) {...}
//D
public boolean delete(StudentVO svo) {...}
...
}
뷰
- 모델에 포함된 데이터의 시각화
- 뷰에는 비즈니스 로직이 없음
public class View() {
private Scanner sc;
public int action;
public View() {
sc = new Scanner(System.in)
}
public void printStudents(ArrayList<StudentVO> svo) { ... }
public int getNum() { ... }
public String getName() { ... }
...
}
컨트롤러
- 전체적인 흐름을 제어
- 모델 객체로의 데이터 흐름을 제어
- 뷰와 모델의 역할을 분리
- 컨트롤러 내에서 로직은 최대한 배제하고 모델과 뷰 사이의 연결 역할만 하도록 구현
컨트롤러 EX)
public class Ctrl {
View view;
StudentDAO model;
public Ctrl() {
view = new View();
model = new StudentDAO();
}
public void startApp() {
while(true) {
view.printMenu();
if(view.action == 1) {
StudentVO svo = new StudentVO();
svo.setNum(view.getNum());
model.selectOne(svo);
}
...
}
}
...
}
MVC 패턴을 사용하는 이유
- 원래 개인 컴퓨터에서 작동하는 어플리케이션의 개발을 목적으로 만들어진 패턴
- WWW(World Wide Web) 어플리케이션을 사용하기 위한 용도로도 폭넓게 사용되고 있음
장점
- 각 컴포넌트의 코드 결합도를 낮출 수 있음
- 코드의 재사용성을 높일 수 있음
- 구현자들 간의 커뮤니케이션 효율성을 높일 수 있음
많이 실수하는 부분
1) Model에서 View의 접근 또는 역할 수행
- View 에서 해야하는 출력 로직을 Model에서 수행하지않도록 주의해야 함
- 로그는 개발자가 보는 것 ➡ 사용자가 보는 것이 아님
- 사용자가 결과를 보게하려면 Model에서 비즈니스 로직 메서드의 return 타입을 boolean으로 하여
Controller에 넘겨주고 그 값이 true인지 false에 따라 View가 다르게 출력하도록 Ctrl에서 조합해주어야 함
2) View에서 일어나는 '과한' 값 검증과 예외 처리
- 단일 책임원칙에 위반되는 것
- 사용자의 권한 혹은 논리적인 값 (존재유무, 일치여부) 등은 Service Layer에서 하는 것이 좋음
3) View에서 일어나는 비즈니스 로직
- View에서 Model을 생성하거나 연산을 수행하는 등의 실수를 조심해야 함