Spring boot 시리즈 이긴하지만, 이번 만큼은 스프링 부트 이전에 스프링webmvc, 와 servlet 에 대해 먼저 알아보는 시간을 가지도록 하겠다.
스프링 웹 MVC 는 서블릿 기반의 웹 어플리케이션을 보다 쉽게 만들기 위한 스프링 프레임워크 모듈이다.
서블릿 기반의 웹 프로그램은 요청이 오면 쓰레드를 생성해 요청을 처리하는 점에서 요청당 프로세스를 생성하는 이전의 CGI 기반의 웹 프로그램과 큰 차이를 나타낸다.
간단하게 서블릿 프로그램을 살펴보록 하자.
우선, 서블릿 디팬던시를 추가하여야 한다.
다음과 같이 pom.xml 에 servlet dependecy 를 추가하였다.
참고로, 메이븐 scope 의 provided 는 해당 라이브러리가 개발시에 적용이 가능하지만, 패키징시에는 포함시키지 않는것을 의미한다. 서블릿 프로그램은 서블릿 컨테이너 안에서 동작하기 때문에, 해당 의존성은 컨테이너에서 제공해 준다.
public class SampleServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("<html>");
resp.getWriter().println("<head>");
resp.getWriter().println("<body>");
resp.getWriter().println("Hello This is Servlet Application");
resp.getWriter().println("</body>");
resp.getWriter().println("</head>");
resp.getWriter().println("</html>");
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
-> 다음과 같이 HttpServlet 을 상속하여 간단한 서블릿 클래스를 생성하였다.
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>me.summerbell.SampleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>/sample</url-pattern>
</servlet-mapping>
-> WEB-INF 디렉토리 안의 web.xml 에 해당 서블릿을 등록하도록 하자.
톰캣과 같은 서블릿컨테이너에 war 파일을 올리고 동작시키면
제대로 동작하고 있는 것을 확인할 수 있다.
서블릿에는 서블릿 리스너와 필터라는 개념이 있다.
리스너 부터 간단히 설명하자면 리스너는 이벤트가 발생하면 동작하는 핸들러이다.
예를들어, 웹어플리케이션이 시작되는 이벤트가 발생하면 리스너를 통해 특정 일을 하게 할 수 있는 것이다.
리스너를 생성하고 등록하여 사용해보도록 하겠다.
public class TestListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("=======================");
System.out.println(" servlet context init ");
System.out.println("=======================");
}
}
-> servletcontext 가 생성될때 동작하는 리스너를 만들었다.
<listener>
<listener-class>me.summerbell.TestListener</listener-class>
</listener>
---WEB-INF 디렉토리 안의 web.xml 에 해당 리스너를 등록하였다.
어플리케이션을 실행하면 servlet context 가 생성됨으로 리스너가 동작하여 콘솔에 찍히는것을 확인할 수 있다.
다음으로 서블릿 필터는, 요청을 처리하기 전-후에 특정 동작을 할 수 있게한다.
필터의 경우, 체인형태로 여러개가 올 수 있으며 순차대로 수행된다.
필터를 생성하고 등록하여 사용해보도록 하겠다.
import javax.servlet.*;
import java.io.IOException;
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("before doGet()");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("after doGet()");servletResponse);
}
-> 간단하게 콘솔에 로그를 남기는 필터를 만들었다 .
<filter>
<filter-name>test</filter-name>
<filter-class>me.summerbell.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>test</filter-name>
<servlet-name>sample</servlet-name>
</filter-mapping>
-> WEB-INF 디렉토리 안의 web.xml 에 해당 필터를 등록하였다.
필터 맵핑을 sample 서블릿으로 하였기 때문에, /sample 로 요청을 보내면, 다음과 같이 콘솔에서 찍히는 것을 확인할 수 있다.
스프링 웹 MVC도 이러한 서블릿 기반 위에서 만들어진 프레임워크이 이기 때문에, 이러한 개념들에 대해 이해해야 스프링 웹 MVC 를 이해할 수 있기 때문에 간단히 서블릿과 서블릿 리스너, 서블릿 필터에 대해 알아보았다.
다음 포스팅에서는 스프링 웹 MVC 가 이러한 서블릿 프로그램위에 어떻게 들어가는지 알아보도록 하겠다.