Velog에 작성했던 포스트를 옮깁니다:)
Servlet / JSP ) 13. JSP MVC
JSP MVC
velog.io
JSP MVC
MVC란
M : model / 출력 데이터
V : view / 출력 담당 (HTML 코드)
C : controller / 입력 담당 (자바 코드)
뒤의 설명을 들으면 감이 올 것이다.
JSP를 이용해 웹 프로그래밍을 할 때 발생했던 스파게티 코드 문제
를 해결하기 위해 등장한
JSP MVC는 크게 JSP MVC model1 , JSP MVC model2 로 나눌 수 있다.
먼저 JSP model1,
JSP MVC 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>
- 홀수인지 짝수인지 판별하는 로직은 입력 코드에 모으고, 이를 model이라는 변수에 담았다.
- 출력 코드에서 model에 담긴 변수를 출력하게 된다.
이처럼
Controller : 입력 코드에는 로직을 담고서 변수들에 값을 할당하는 등 입력과 제어를 담당 (자바 코드)
Model : 할당된 변수를 출력 코드에서 출력하는 데에 사용, 출력 데이터를 담당
View : 출력을 담당 (HTML 코드)
JSP MVC model2
JSP MVC model2 의 핵심은
"Controller와 View가 물리적으로 분리된다."
JSP MVC model1의 경우에는 M,V,C가 모두 모여 있기에 JSP를 출력할 때 컴파일을 동반해야하지만,
입력과 제어를 담당해 컴파일이 필요한 Controller와 컴파일이 필요없는 View를 분리해 따로 관리한다면
- 사용자 요청이 있을 때 View를 만들고, Controller는 미리 컴파일이 되어있기에 실행 속도 개선
- 자바 코드 - HTML 코드 가 분리 되어있기에 유지 보수도 원활
이런 장점들을 취할 수 있다.
- Controller - View 분리된 모습
- 그림을 보아 Controller와 View가 분리되어 있고, Controller단에는
Dispatcher
가 존재하는 것이 보인다. Dispatcher
는 Servlet끼리 연결(forward)해주는 장치라 생각하면 된다.
- 그림을 보아 Controller와 View가 분리되어 있고, Controller단에는
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해 요청에 응답하게 된다.
JSP MVC model2 구현
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를 일반 자바 클래스, 객체로 관리함으로써 유지 보수의 효율성을 취할 수 있기에, 자바의 취지에 부합하는 것 같다는 생각을 했다.
'Java > Servlet' 카테고리의 다른 글
Servlet, JSTL (0) | 2023.04.02 |
---|---|
Servlet, JSP로 게시판 구현 (0) | 2023.04.01 |
Servlet, JSP를 이용한 웹 프로그래밍 (스파게티 코드 문제) (0) | 2023.04.01 |
Servlet, JSP with Japser (0) | 2023.04.01 |
Servlet, 하나의 프로그램은 하나의 Servlet으로 (0) | 2023.04.01 |