Servlet
--HTML코드 출력 문제--> JSP
--스파게티 코드 문제--> [JSP MVC
] -> Spring MVC
-> SpringBoot
MVC란
M : model / 출력 데이터
V : view / 출력 담당 (HTML 코드)
C : controller / 입력 담당 (자바 코드)
뒤의 설명을 들으면 감이 올 것이다.
JSP를 이용해 웹 프로그래밍을 할 때 발생했던 스파게티 코드 문제
를 해결하기 위해 등장한
JSP MVC는 크게 JSP MVC model1 , JSP MVC model2 로 나눌 수 있다.
먼저 JSP model1,
JSP MVC model1 의 핵심은
"입력 코드와 출력 코드를 구분해서 모아놓자"
num.jsp의 경우에는 입력 코드 출력 코드 구분 없이 코드가 입력되어 있다.
num.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String _num = request.getParameter("num");
int num = Integer.parseInt(_num);
%>
<html>
<head>
<title>Hello</title>
</head>
<body>
<%if (num % 2 == 0) {%>
짝수입니다.
<%} else {%>
홀수입니다.
<%}%>
</body>
</html>
이를 JSP MVC model1 방식으로 바꾸면
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--입력 코드--%>
<%
String _num = request.getParameter("num");
int num = Integer.parseInt(_num);
String model = "";
if (num % 2 == 0) {
model = "짝수";
} else {
model = "홀수";
}
%>
<%--입력 코드--%>
<html>
<head>
<title>Hello</title>
</head>
<body>
<%--출력 코드--%>
<%=model%>입니다.
<%--출력 코드--%>
</body>
</html>
이처럼
Controller : 입력 코드에는 로직을 담고서 변수들에 값을 할당하는 등 입력과 제어를 담당 (자바 코드)
Model : 할당된 변수를 출력 코드에서 출력하는 데에 사용, 출력 데이터를 담당
View : 출력을 담당 (HTML 코드)
JSP MVC model2 의 핵심은
"Controller와 View가 물리적으로 분리된다."
JSP MVC model1의 경우에는 M,V,C가 모두 모여 있기에 JSP를 출력할 때 컴파일을 동반해야하지만,
입력과 제어를 담당해 컴파일이 필요한 Controller와 컴파일이 필요없는 View를 분리해 따로 관리한다면
이런 장점들을 취할 수 있다.
Controller - View 분리된 모습
그림을 보아 Controller와 View가 분리되어 있고, Controller단에는 Dispatcher
가 존재하는 것이 보인다.
Dispatcher
는 Servlet끼리 연결(forward)해주는 장치라 생각하면 된다.
Controller Servlet과 View Servlet을 분리하고 두 Servlet간의 데이터 교환은 Dispatcher를 통해 관리하는 방식
Distpatcher와 Controller가 분리된 모습
이전의 방식에서, 모든 Controller Servlet에는 Dispatcher가 존재하게 된다.
결국 비슷한 기능을 하는 장치끼리 분리하고 있는 상황이기에 (MVC) Dispatcher만을 남기로 Controller는 일반 자바 클래스로 관리한다.
POJO란, Plain Old Java Object
순수한 자바 객체라고 생각하면 된다.
Controller와 Dispatcher를 구분해
- 사용자 요청이 들어오면 Dispatcher Servlet이 먼저 요청을 만난 뒤,
- 요청에 맞는 Controller 객체를 선택해 로직을 처리하고 반환 받은 값(model, view)을
- JSP Servlet에게 forwarding해 요청에 응답하게 된다.
num.java
@WebServlet("/num")
public class Num extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String _num = request.getParameter("num");
int num = Integer.parseInt(_num);
String result = "";
if (num % 2 == 0) {
result = "짝수";
} else {
result = "홀수";
}
request.setAttribute("result", result);
RequestDispatcher dispatcher = request.getRequestDispatcher("hello.jsp");
dispatcher.forward(request,response);
}
}
num.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<%=request.getAttribute("result")%>입니다.
</body>
</html>
JSP MVC model2 방식에서 Controller를 자바 객체로 관리하는 방식이 진정한 자바를 이용한 웹 프로그래밍
의 핵심이라 생각이 든다.
자바라는 언어는 객체 지향 언어인 만큼, Controller를 일반 자바 클래스, 객체로 관리함으로써 유지 보수의 효율성을 취할 수 있기에, 자바의 취지에 부합하는 것 같다는 생각을 했다.