2024. 10. 9. 16:02ㆍJSP
MVC패턴의 장점에 대해 알아보고, 적절하게 로직을 분리해 보자.
JSP (model1의 장점과 단점)
장점
- HTML과 Java코드를 함께 사용할 수 있다.
- Java 코드를 편리하게 사용하기 위한 라이브러리가 존재한다.(EL태그, JSTL태그)
- 개발 로직과 화면 구성을 동시에 수행할 수 있다.
단점
- 사이트 규모가 커지면, 파일 관리가 어려워진다
- 개발 로직과 화면 구성을 동시에 수행할 수 있다. (유지 보수가 까다로움)
- HTML과 Java 코드를 분리하여 처리 및 표현을 별도로 개발하는 편이 더 좋다.
= MVC패턴을 사용하는 궁극적 이유
MVC패턴 사용이유
1. 모델과 뷰의 분리
무조건 사용자가 직접 DB에 접근할 수 있으면 안되기 때문이다.
여기서 모델은 데이터, 뷰는 보이는 화면을 의미한다.
2. 유지보수 편리
모델과 뷰를 분리시켜 컨트롤러에서 통제하게 만들기 위해서이다.
(사용자는 항상 프로그램을 통해 데이터에 접근하고 처리한다.)
MVC패턴의 형태
:Model - view - controller 가 분리되어 있는 형태
Servlet을 사용하는 Model2 방식
Ex02 Servlet
1 ~ 100까지의 랜덤 정수 2개를 생성하여, 두 정수의 합계가 나온다.
이 결과값을 ex02.jsp 에 전달하여 출력해보자.
public class Ex02Servlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
private Random ran = new Random();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int n1 = ran.nextInt(100) + 1;
int n2 = ran.nextInt(100) + 1;
String data = String.format("%d + %d = %d", n1, n2, n1 + n2);
// 요청은 서블릿이 받았지만, 응답은 JSP가 함
// JSP로 넘겨주기 전에, 서블릿에서 생성한 데이터를 넘겨준다
// jsp의 경로를 WEB-INF 아래에 넣어두면
// 단독 실행은 불가능하지만 포워드는 가능
req.setAttribute("data", data);
req.getRequestDispatcher("/WEB-INF/views/ex02.jsp").forward(req, resp);
}
}
ex02.jsp
Ex02Servlet 에서 넘겨준 데이터를 받아서 출력
유의할점
이 페이지를 실행하면 원하는 결과값이 뜨지 않는다.
url에 .jsp 를 지우고 enter를 눌러야 함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>서블릿에서 넘겨준 데이터를 화면에 출력하기</h1>
<hr>
<h3>${data }</h3>
</body>
</html>
Ex03 Servlet
[ doGet ] 은 기본값 . ex03-form을 실행할 때
: 별도의 데이터 처리가 없는 상황
[ doPost ] 는 ex03-form에 있는 form을 제출할 때
: form을 제출함으로써, 데이터의 처리가 일어나야하는 상황
@WebServlet("/ex03")
public class Ex03Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private final String prefix = "/WEB-INF/views/";
private final String suffix = ".jsp";
// 서블릿은 요청메서드에 따라 doGet 및 doPost 함수를 별도로 사용할 수 있다
@Override // 처리 내용 없이 JSP만 보여주면 된다 (곧바로 포워드)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String viewName = "ex03-form";
req.getRequestDispatcher(prefix + viewName + suffix).forward(req, resp);
}
@Override // 처리만 수행하고 JSP로 넘기지 않는다 (다른 주소로 리다이렉트)
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String userid = req.getParameter("userid");
String userpw = req.getParameter("userpw");
HttpSession session = req.getSession();
if("test".equals(userid) && "1234".equals(userpw)) {
session.setAttribute("login", "테스트");
}
String cpath = req.getContextPath();
resp.sendRedirect(cpath + "/ex03");
}
}
ex03-form.jsp
[ 로그인이 되어있지 않을때 ] userid 와 userpw 를 입력하여 로그인 시도
[ 로그인이 되어있을때 ] ${login} 님 안녕하세요 + 로그아웃 버튼
로그인 성립 조건
: Ex03Servlet 를 참고
if("test".equals(userid) && "1234".equals(userpw)) {
session.setAttribute("login", "테스트");
}
userid 가 test 이면서
userpw 가 1234 일때만 로그인 성공
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>서블릿 활용 로그인 테스트</h1>
<hr>
<c:if test="${empty login }">
<form method="POST">
<p><input type="text" name="userid" placeholder="ID" required autofocus></p>
<p><input type="password" name="userpw" placeholder="Password" required></p>
<p><input type="submit" value="로그인"></p>
</form>
</c:if>
<c:if test="${not empty login }">
<h3>${login }님 안녕하세요</h3>
<c:set var="cpath" value="${pageContext.request.contextPath }" />
<a href="${cpath }/logout"><button>로그아웃</button></a>
</c:if>
<!-- 라이브러리 파일 넣기 -->
</body>
</html>
처음에 MVC 패턴에 대해 배웠을때, 나는 왜 굳이 이런 번거롭운 일을 하는지 잘 이해가 되지 않았다.
내가 관리해야 할 페이지 수도 늘어나고, 어느 면에서 유지보수에 좋다는 건지 몰랐었다.
하지만 서로의 목적과 기능에 맞게 model, view, controller로 각각 분리하면 각 페이지가
담당하는 기능은 하나가 된다.
조금씩 익숙해지다 보니 왜 MVC패턴을 사용해야 하는지도 와닿는 것 같다.
'JSP' 카테고리의 다른 글
[JSP] MVC - 페이징 및 검색 (5) | 2024.10.09 |
---|---|
[JSP] 게시판 (2) (1) | 2024.10.07 |
[JSP] 게시판 (1) (0) | 2024.10.07 |
[JSP] 회원 기능 (2) (0) | 2024.10.07 |
[JSP] 회원 기능 (1) (0) | 2024.10.05 |