[Spring] Servlet 이해하기

Woo Yong·2024년 1월 22일
0

Spring

목록 보기
9/15
post-thumbnail

Servelt

Servlet은 자바 EE에서 제공하는 웹 애플리케이션 개발용 스팩이다.

조금 더 쉽게 말하면, Servlet은

이러한 서블릿이 하는 역할로는 세션관리, 네트워크 서비스, MIME 기반 메시지 인코딩 디코딩, 서블릿 생명주기 관리등이 있다.

조금 더 쉽게 생각하면, 서블릿은 자바 언어를 기반으로 웹 애플리케이션에서 동적인 웹 페이지를 생성하는 자바 클래스이다.

그렇기 때문에 서블릿은 웹 애플리케이션 서버(WAS, Tomcat)에서 실행되어 클라이언트의 HTTP 요청에 응답을 수행한다.

따라서, Spring Web MVC는 클리언트 요청에 대해서 동적으로 HTTP 응답을 위한 서블릿 기반의 프레임워크라는 것이다.

그렇다면 Servlet Container 동작 원리에 대해 알아보자.

Servlet Container 동작 원리

위 사진은 Servlet Container의 동작원리를 보여주고 있다.

  1. 클라이언트의 요청이 만약 정적 콘텐츠라면, 웹 서버 단에서 바로 응답을 보낸다.

  2. 요청이 만약 동적 콘텐츠라면, 요청(HTTP Request)을 먼저 웹 서버에서 받아서 웹 애플리케이션 서버로 전달하여 servlet을 메모리에 로딩한다.
    1 ) 이때, Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
    2 ) 생성된 두 객체는 HTTP 요청, 응답을 처리하기 위한 Java EE API의 일부이다.

  3. 웹 애플리케이션 서버는 web.xml(자신만의 web.xml)을 참조하여 메모리에 올라간 Servlet에 HttpServletRequest와 HttpRequestResponse 객체를 전달하여 쓰레드를 생성한다.

  4. 해당 Servlet은 service() 메서드를 호출하고, POST, GET 여부에 따라서 doGet(), doPost() 메서드를 호출한다.

  5. 비즈니스 로직을 실행한 후, 2단계에서 만들었던 HttpServletResponse 객체 내용을 담아서 웹 애플리케이션 서버에 응답한다.

  6. 웹 애플리케이션 서버는 응답을 받아서 웹 서버에게 다시 전달한다.

  7. 웹 애플리케이션 서버는 생성된 쓰레드를 종료하고, HttpServletRequest, HttpServletResponse 객체를 소멸 시킨다.

web.xml을 이용하여 등록하는 방법

web.xml파일을 이용하여 서블릿 클래스와 매핑 정보를 설정하여 서블릿을 등록할 수 있다.

1. HttpServlet 인터페이스를 구현한 서블릿 클래스 ( HelloServelet.java )

public class HelloServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        response.getWriter().println("Hello, Servlet!");
    }
}

2. web.xml에 Servlet 등록

<!-- web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.example.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

<servlet>태그는 작성한 Servlet이 있다고 웹 컨테이너에게 명시적으로 선언만 한 것이다.
즉, 웹 컨테이너는 존재 여부만 알고 언제 실행시켜야하는지 모른다는 것이다.

그렇기 때문에 언제 실행 되어야하는지 알려주어야한다.
언제 실행되어야하는지 알려주는 코드가 <servlet-mapping>태그이다.

이때, <servlet><servlet-mapping>에 작성하는 <servlet-name>태그는 고유한 이름으로 동일하게 작성해주어야하고, <servlet-class>는 1번에서 작성한 클래스의 패키지 경로를 정확하게 작성해주어야한다.

코드를 분석하면 HelloServlet이라는 서블릿 클래스를 /hello URL 경로에 매핑하고 있다.

Anotation을 이용하여 등록하는 방법 ( @WebServlet )

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        response.getWriter().println("Hello, Servlet!");
    }
}

@WebServlet 어노테이션을 이용해서도 서블릿을 등록할 수 있다.
하지만, 어노테이션을 이용한 방법은 Servlet3.0 버전 이상에서만 사용이 가능하다.

profile
Back-End Developer

0개의 댓글