[JSP] MVC

2024. 10. 9. 16:02JSP

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