프로그래밍/Spring

[Spring] Servlet에 대해 간단히 알아보자

byungmin 2021. 12. 30. 14:37

 

Spring Framework는 Servlet이 발전된 형태이기 때문에 Servlet과 닮은 부분이 많다. 또한 브라우저에서 요청을 받을 때도 Servlet인 DispatcherServlet을 사용하기 때문에 간단하게 알아보고자 한다.

 

Servlet과 Controller 비교

- TestServlet 작성 (Servlet)

@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {

        String name = req.getParameter("name");
        String age = req.getParameter("age");

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter writer = response.getWriter();
        //...
    }
}

@WebServlet

- 원격프로그램으로 연결할 때 사용

- @Controller와 @RequestMapping 이 합쳐진 것

- URL매핑은 클래스에 하나만 사용할 수 있다. 그러므로 하나의 클래스에 하나의 서블릿만 적용가능

 

HttpServlet을 상속

- service 메서드를 오버라이딩해서 작성해야 한다.

 

- Test 클래스 작성 (Controller)

@Controller
public class Test {

    @RequestMapping("/test")
    public void test(String name, String age, HttpServletResponse response) throws Exception {

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter writer = response.getWriter();
        //...
    }
}

@Controller

- 원격프로그램으로 연결할 때 사용

 

@RequestMapping

- 메서드마다 각각의 URL을 매핑해줄 수 있으므로 하나의 클래스 안에 여러개의 URL을 매핑해줄 수 있다.

 

상속을 받지 않아서 서블릿보다 이점이 있다.

 

서블릿의 생명주기

서블릿은 기본적으로 생명주기를 가지고 있다. 각각의 메서드는 직접 호출하는 것이 아니라 Servlet Container가 자동으로 호출해준다.

서블릿의 생명주기 출처 : https://velog.io/@max9106/JSP-Servlet-Life-cycle

 

 

  • @PostContruct - 서블릿이 생성되기 전에 준비하는 단계
  • init() - 서블릿이 생성(초기화)되는 단계
  • service - 개발자가 구현한 방식으로 서블릿이 일을 하는 단계 (doGet(),doPost() 등을 호출)
  • destroy() - 서블릿이 일을 마치고 소멸되는 단계
  • @PreDestroy - 서블릿 소멸 뒤 정리하는 단계

 

예제

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        // 서블릿 초기화 - 서블릿이 생성 또는 리로딩 될 때, 단 한번만 수행된다.
        // 서블릿의 초기화 작업을 담당
        System.out.println("HelloServlet.init");
    }

    @Override // 호출될 때마다 반복적으로 수행된다.
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 입력
        // 처리
        // 출력
        System.out.println("HelloServlet.service");
    }

    @Override
    public void destroy() {
        // 뒷정리 작업 - 서블릿이 제거(Unload)될 때, 단 한번만 수행된다.
        System.out.println("HelloServlet.destroy");
    }
}

 

요청이 왔을 때 서블릿이 어떻게 처리되는가?

서블릿 인스턴스가 존재하는지는 map으로 저장되어 있는 서블릿 이름을 통해 확인한다.

 

서블릿은 기본적으로 싱글톤 객체를 사용

요청이 오면 처리되어야할 작업들이 대부분 같기 때문에 요청이 올 때 마다 서블릿 객체를 생성할 필요가 없다. 따라서 싱글톤 객체를 이용해서 하나의 객체로 여러 요청을 받는다.