이 포스팅은 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(김영한 님) 강의를 보고 정리한 것입니다.
클라이언트 <-> 서버는 모든것이 HTTP 기반으로 동작한다.
웹서버 또한 HTTP기반으로 동작한다.
웹 애플리케이션 서버(WAS) 또한 HTTP 기반으로 동작한다.
웹서버와 웹애플리케이션 서버의 차이?
- 둘의 용어와 경계가 모호함
- 웹서버는 정적 리소스 제공, WAS는 애플리케이션 로직 수행에 특화되어 있음
- 웹서버도 프로그램을 실행하는 기능을 포함하기도 함
- WAS도 웹서버의 기능을 제공 함
- 자바는 서블릿 컨테이너의 기능을 제공하면 WAS로 여김
- 서블릿 없이 자바코드를 실행하는 서버 프레임워크도 있음!
--> WAS는 애플리케이션 코드를 실행하는데 더 특화
이 구성만으로의 문제점으로는
해결 방법으로는
웹시스템 구성을 WAS, DB에서 WAS, DB + WEB
으로 바꾼다.
자바 서블릿은 웹서버의 성능을 향상하기 위해 사용되는 클래스의 일종이다.
클라이언트의 요청을 받아 그에 대한 결과를 반환해주는 역할을 한다.
내 개인적으로 JAVA + HTML 로 이해했다.
@WebServlet(name="responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println("<div>안녕</div>");
writer.println("</body>");
writer.println("</html>");
}
}
하지만 서블릿만을 이용한 개발에는 문제가 있었다.
위와 같이 많은 태그들을 직접 썻어야 했으며 이에 따른 html화면 렌더링은 큰 고통이였다.
이에 따라 JSP가 등장하게 된다.
Java 코드가 들어가 있는 HTML 코드라고 보면 된다.
그냥 서블릿이 JAVA + html 이였다면, 이건 HTML + JAVA 이다.
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="/functions" prefix="f" %>
<html>
<head><title>Localized Dates</title></head>
<body bgcolor="white">
<jsp:useBean id="locales" scope="application"
class="mypkg.MyLocales"/>
<form name="localeForm" action="index.jsp" method="post">
<c:set var="selectedLocaleString" value="${param.locale}" />
<c:set var="selectedFlag"
value="${!empty selectedLocaleString}" />
<b>Locale:</b>
<select name=locale>
<c:forEach var="localeString" items="${locales.localeNames}" >
<c:choose>
<c:when test="${selectedFlag}">
<c:choose>
<c:when
test="${f:equals(selectedLocaleString, localeString)}" >
<option selected>${localeString}</option>
</c:when>
<c:otherwise>
<option>${localeString}</option>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<option>${localeString}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
<input type="submit" name="Submit" value="Get Date">
</form>
<c:if test="${selectedFlag}" >
<jsp:setProperty name="locales"
property="selectedLocaleString"
value="${selectedLocaleString}" />
<jsp:useBean id="date" class="mypkg.MyDate"/>
<jsp:setProperty name="date" property="locale"
value="${locales.selectedLocale}"/>
<b>Date: </b>${date.date}</c:if>
</body>
</html>
JSP를 이용한 개발에서는 JAVA 파일에서의 html태그와는 이별 할 수 있었지만 반면에 JSP파일 자체가 너무 커지는 부담이 있었다.
위에서 보았듯이 JSP만으로 비즈니스 로직과 뷰 렌더링을 처리한다면 너무 많은 역할을 하게 되고 결과적으로 유지보수가 어려워 진다.
따라서 나온 것이 모델, 뷰, 컨트롤러를 구분하자는 의미의 MVC 패턴이다.
M : Model, 뷰에 출력할 데이터를 담아둔다.
V : View, 모델에 담겨있는 데이터를 사용하여 HTML을 보여준다
C : Controller, HTTP요청을 받아 파라미터를 검증하고 비즈니스 로직을 실행하고 뷰에 전달할 데이터를 모델에 담는다.
장점
한계