서블릿이란 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다.
쉽게 말하면, 클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램이라고 할 수 있다.
글로만 설명하면 쉽게 이해가 되지 않으니, 코드로 설명하겠다.
@WebServlet(urlPatterns = { "/hello" })
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String requestName = request.getParameter("name");
String servletName = getServletConfig().getServletName();
StringBuilder html = new StringBuilder(); html.append("<html>");
html.append(" <head>");
html.append(" <title>초 간단 서블릿 개발하기</title>");
html.append(" </head>");
html.append(" <body>");
html.append(" <h1>" + requestName + "님 안녕하세요.</h1>");
html.append(" <h1>저는 " + servletName + "입니다.</h1>");
html.append(" </body>");
html.append("</html>");
response.setStatus(200);
response.setContentType("text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write(html.toString());
}
}
코드를 자세히는 설명하지 않겠다.
하지만 지금까지 작성해 왔던 MVC 패턴 중 컨트롤러와 유사한 느낌을 받을 수 있다.
이러면 "클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다." 라는 위의 개념이 조금은 이해가 갈 것 이다.
서블릿은 다음과 같은 특징을 갖는다.
클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
html을 사용하여 요청에 응답한다.
Java Thread를 이용하여 동작한다.
MVC 패턴에서 Controller로 이용된다.
HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
UDP보다 처리 속도가 느리다.
HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.
일반적으로 웹서버는 정적인 페이지만을 제공한다. 그렇기 때문에 동적인 페이지를 제공하기 위해서 웹서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 한다.
동적인 페이지로는 임의의 이미지만을 보여주는 페이지와 같이 사용자가 요청한 시점에 페이지를 생성해서 전달해 주는 것을 의미한다.
그런데 위 코드를 보면, 반환할 html 코드를 하나씩 이어 붙이면서 작성하고 있다. 너무나 불편하고 지저분해 보인다.
하지만, 서블릿에서는 이 방식외엔 지원해주지 않는다. 그래서 HTML과 같은 화면(뷰)을 구성해줄 템플릿 엔진이 필요하다.
템플릿 엔진은 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어 또는 소프트웨어 컴포넌트를 말한다. 특히, 웹 템플릿 엔진은 웹 문서가 출력되는 템플릿 엔진을 말한다.
즉, 웹 템플릿 엔진은 지정된 템플릿 양식과 데이터가 합쳐져서 HTML 문서를 출력하는 소프트웨어를 말한다.
우리가 쉽게 들었던 JSP, Thymeleaf가 바로 템플릿 엔진이다.
이중 JSP는 서블릿과 매우 깊은 연관이 있다.
JSP(Java Server Page)란자바 언어를 기반으로 하는 서버 사이드 스크립트 언어이다. JSP는 HTML 코드에 Java 코드를 넣어 동적인 웹 페이지를 생성할 수 있다.
서블릿이 Java 코드에 HTML 코드가 들어가는 형태라면, JSP는 HTML 코드에 Java 코드가 들어가는 구조이다.
jsp로 작성된 코드는 아래와 같다.
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%
String requestName = request.getParameter("name");
String servletName = config.getServletName();
%>
<html>
<head>
<title>JSP 개발하기</title> </head>
<body>
<h1><%= requestName %>님 안녕하세요.</h1>
<h1>저는 <%= servletName %>입니다.</h1>
</body>
</html>
JSP는 위와 같이 템플릿과 문법 요소를 사용해 동적으로 웹 페이지 생성한다.
JSP를 사용하면 복잡했던 서블릿 코드를 다음과 같이 바꿀 수 있다.
@WebServlet(urlPatterns = { "/improved-hello" }) public class ImprovedHelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String requestName = request.getParameter("name");
String servletName = getServletConfig().getServletName();
request.setAttribute("requestName", requestName);
request.setAttribute("servletName", servletName);
request RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/view/hello.jsp");
requestDispatcher.forward(request, response);
}
}
Thymeleaf
Thymeleaf도 JSP와 같이 서버 사이드 템플릿 엔진의 일종이다. Spring boot에서 공식적으로 지원하고 권장하는 템플릿 엔진은 JSP가 아닌 Thymeleaf이다. Thymeleaf는 MVC 기반 웹 애플리케이션의 뷰 레이어에서 XHTML/HTML5를 서비스하는데 적합하다. 스프링 프레임워크와 완전한 통합 기능을 제공한다.
이전에는 웹 개발에 있어 JSP를 많이 사용했다. 하지만 JSP는 성능과 기능면에서 다른 템플릿 엔진에 밀려 사장되어 가는 추세이다.
서블릿 컨테이너란 간단히 말해 서블릿을 관리해주는 컨테이너이다.
우리가 서버에 서블릿을 만들었다고 해서 스스로 작동하는 것이 아니고 서블릿을 관리해주는 것이 필요한데, 그러한 역할을 하는 것이 바로 서블릿 컨테이너 이다.
서블릿 컨테이너는 클라이언트의 요청(Request)을 받아주고 응답(Response)할 수 있게, 웹서버와 소켓으로 통신하며 대표적인 예로 톰캣(Tomcat)이 있다. 톰캣은 실제로 웹 서버와 통신하여 JSP(자바 서버 페이지)와 Servlet이 작동하는 환경을 제공해준다.
서블릿 컨테이너는 다음과 같은 역할을 한다.
서블릿 컨테이너와 서블릿, JSP 는 아래 그림과 같이 동작한다.
스프링 MVC는 프론트 컨트롤러 패턴을 사용한다.
프론트 컨트롤러 패턴이란, 대표 컨트롤러(Front Controller)를 두고 뷰에서 들어오는 모든 요청을 담당하여 웹 애플리케이션을 실행하는 모든 요청을 일괄적으로 처리하는 방식이다.
위 그림에서 DispatcherServlet이 바로 Spring에서의 프론트 컨트롤러이다.
Dispatcher-Servlet(디스패처 서블릿) 이란?
디스패처 서블릿은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)이다.
클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿 컨테이너가 요청을 받게 된다.
그리고 이 모든 요청을 프론트 컨트롤러인 디스패처 서블릿이 가장 먼저 받게 된다.
그러면 디스패처 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 컨트롤러를 찾아서 작업을 위임한다.
과거 DispatcherServlet이 등장하기 전에는 모든 서블릿에 대해 URL을 매핑하기 위해 관련 설정을 해주어야 하는 번거로움이 존재했다.
그러나 DispatcherServlet이 등장한 이후에는 DispatcherServlet이 모든 요청을 먼저 받아서 직접 적합한 컨트롤러로 위임을 해주기 때문에 위와 같은 작업은 필요없어졌고, 이로 인해 개발이 굉장히 편리해졌다.
오늘은 이렇게 서블릿과 템플릿 엔진, 디스패처서블릿 등에 대해서 알아보았다.
스프링의 전체적인 동작을 파악하기 위해서는 위의 개념에 대한 이해가 굉장히 중요할 것 같다.
Thymeleaf라던지, DispatcherServlet라던지, Spring 프로젝트를 하면서도 너무 가까이에 있던 내용들이었는데, 이제서야 알 수 있었다.
스프링과 점점 가까워지고 있는 느낌이 들어 기쁘다.
참고 자료