스프링 웹 MVC -기본원리1(서블릿)

김종하·2020년 12월 30일
0

Spring boot booster

목록 보기
12/13

Spring boot 시리즈 이긴하지만, 이번 만큼은 스프링 부트 이전에 스프링webmvc, 와 servlet 에 대해 먼저 알아보는 시간을 가지도록 하겠다.

스프링 웹 MVC 는 서블릿 기반의 웹 어플리케이션을 보다 쉽게 만들기 위한 스프링 프레임워크 모듈이다.

Servlet

서블릿 기반의 웹 프로그램은 요청이 오면 쓰레드를 생성해 요청을 처리하는 점에서 요청당 프로세스를 생성하는 이전의 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 가 이러한 서블릿 프로그램위에 어떻게 들어가는지 알아보도록 하겠다.

0개의 댓글