# 목적
- MVC 패턴에 대한 이해와 MVC1, MVC2 차이점 알아보기
❓ MVC 패턴 이란?
- 애플리케이션을 Model-View-Controller로 역할을 나누어 개발하는 방식
MVC 패턴 구성
1. Model
- View에 표현할 데이터
- View에 표현할 데이터를 획득하는 작업
2. View
- Model이 제공하는 데이터 표현
- Model이 제공하는 데이터를 다양한 컨텐츠 타입으로 변환
3. Controller
- 사용자와 상호작용하여 사용자의 클라이언트 요청을 처리
MVC 패턴의 목적
- 데이터와 비즈니스로직을 시각적인 표현(디자인 요소)으로부터 분리해줌으로써 화면에 신경쓰지 않고 데이터나 비즈니스 로직을 구성할 수 있게 한다.
적용사례
-
Model2 개발방식 : 웹 애플리케이션 개발에 MVC 패턴을 적용한 것
-
Spring MVC : MVC패턴의 웹 애플리케이션 개발을 지원하는 다양한 라이브러리를 제공
-
Python의 Django : MVC 패턴의 웹 애플리케이션 개발을 지원하는 프레임워크
-
Struts, Struts2 : MVC 패턴의 웹 애플리케이션 지원 프레임워크(Spring 등장 이전에 사용했던 프레임워크)
💡 Model2 개발방식
- 웹 애플리케이션 개발에 MVC 패턴을 적용한 것
* mvc패턴은 웹어플리케이션에만 특화되어 있는 게 아님
Model2 목적
- 비즈니스 로직과 디자인 코드를 분리해서 개발하기 위해 도입되었다.
* 비즈니스 로직 : Java코드, 디자인 코드 : HTML코드
Model2 구성
1. Model
- 비즈니스 로직 수행(업무로직 수행), 데이터베이스 액세스 담당
- Java Class로 구현
2. View
- 모델이 제공하는 데이터를 표현한다.
- JSP로 구현
3. Controller
- 클라이언트의 HTTP 요청 처리
- Servlet과 Java Class로 구현
📌 Model1과 Model2
1. Model1
- View, Controller를 JSP가 모두 담당
- JSP 1개의 파일 내에 로직 요소(Java) + 디자인 요소(HTML)가 같이 섞여있기 때문에
디자인이 바뀌면 java코드도 전부 다시 작성해야 함.
디자이너와 개발자의 분업이 쉽지 않음
- 장점
- 단순한 구조로 개발 초기에 복잡한 설정 없이 빠른 개발 시작이 가능
M - HTML 데이터를 담당(h1, p, ul 등의 태그를 변수라고 가정할 수 있음)
V - CSS 디자인 담당
C - Javascript
2. Model2
- 로직 요소(Java코드)와 디자인 요소(HTML코드)를 분리하기 위해 Model2 발명
M : Java
V : JSP 데이터를 표현만
C : Servlet
Model1과 Model2 응답 차이
1. Model1
- JSP의 SendRedirect : 외부이동
- ex) 고객센터에 문의전화 걸었을 때, 상담원이 담당 부서가 따로 있다며 해당 부서의 전화번호를 알려준 후 전화를 끊음
2. Model2
- Servlet의 forward : 내부이동
(서버 톰캣 내에서만 이동)
- ex) 고객센터에 문의전화 걸었을 때, 상담원이 담당 부서가 따로 있다며 전화를 끊지 않고 해당 부서로 전화를 돌려줌
Model1과 Model2 작성 순서
1. Model1
1) XML에 DB 쿼리 작성
2) Dao에서 ibatis/xml 호출
3) JSP에서 Dao 호출해서 화면에 출력
2. Model2
1) XML에 DB 쿼리 작성
2) Dao에서 ibatis/xml 호출
3) Service에서 Dao 호출
4) Controller에서 Service 호출
5) JSP에서 el표현식으로 화면에 출력
* Model2의 Controller
- Model2에서는 JSP를 직접적으로 호출하는 걸 막기 위해
JSP파일을 webapp 바로 밑에 두지 않고 WEB-INF 하위로 다 숨김
(WEB-INF에 있는 파일을 실행하려면 Controller를 거치는 방법밖에 없음)
- Model2 개발할 때는 FrontController 를 사용
- FrontController는 업무로직을 수행하지는 않고 아래 5가지 작업만 함
(근데 사실 FrontController는 프레임워크가 다 제공해줌)
- 요청 접수
- 요청 분석
- 적절한 요청핸들러 메소드 실행
- 이동할 경로 반환받기
- 해당 경로로 내부 이동하기