스프링 MVC(3)
MVC
- MVC 패턴의 등장 : 비즈니스 로직은 서블릿 처럼 다른곳에서 처리하고, JSP는 목적에 맞게 HTML로 화면(View)을 그리는 일에 집중하도록 하자. 과거 개발자들도 모두 비슷한 고민이 있었고, 그래서 MVC 패턴이 등장했다.
- 만약 하나의 서블릿이나 jsp로 모든 로직과 렌더링을 처리하게 된다면?
- 너무 많은 역할을 하므로 유지보수가 어려워 진다.
- 비즈니스 로직과 전혀 관계 없는 UI를 수정한다 해도 로직을 수정해야 하는 일이 발생할 수 있다.
- 병렬 처리 불가 : view 작업이 완료될 때 까지 백엔드가 작업을 못할 수 있다.
MVC의 개요
- mvc모델 1로 View와 Controller를 모두 JSP가 담당하는 형태
- 유지보수가 좋지 않음
- MVC는 Model, View, Controller의 약자이다
- Controller : HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
- Model : 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중
- View : 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중
참고
- Redirect : 실제 클라이언트에 응답이 나갔다가 클라이언트가 다시 요청을 하기 때문에, 클라이언트가 인지할 수 있고, 실제로 url도 변경이 된다.
- Forward : 서버 내부에서 일어나는 호출이기 때문에 클라이언트는 전혀 인지하지 못한다.
MVC패턴의 한계
- 중복되는 코드가 많다(forward)
- HttpServletResponse 같이 사용하지 않는 코드도 작성할 때가 있다.
- 공통으로 처리가 어렵다 -> 기능이 복잡해질 수 록 컨트롤러에서 공통으로 처리해야 하는 부분이 점점 더 많이 증가할 것이다. 단순히 공통 기능을 메서드로 뽑으면 될 것 같지만, 결과적으로 해당 메서드를 항상 호출해야 하고, 실수로 호출하지 않으면 문제가 될 것이다. 그리고 호출하는 것 자체도 중복이다.
MVC 모델을 적용한 jsp활용 예시
회원 목록 조회 - 컨트롤러
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/
members")
public class MvcMemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse
response)throws ServletException, IOException {
System.out.println("MvcMemberListServlet.service");
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
회원 목록 조회 - 뷰
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/index.html">메인</a>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<c:forEach var="item" items="${members}">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
JSP 기본 문법
- <% %> : 실행될 자바 코드 입력
- <%! %> : 변수, 메서드 등을 선언할 때 이용하는 태그
- <%= %> : 변수, 메서드 등의 실행에 관한 부분을 맡아 그 결과를 출력
<%! String name = "홍길동"; %>
<%! public int plus(int a, int b){ return a+b; } %>
<!-- 스크립트릿( 변수선언, 메서드 등에 대한 실행 가능 ) -->
<% int a = 5; %>
<% int b = 5; %>
<% plus(a,b); %>
<%= a>
출처 - 김영한의 스프링 MVC 1편
Leave a comment