WEB

Servlet 이란?

긍.응.성 2020. 4. 9. 16:05
반응형

Servlet에 대해 찾아보고 공부하면서 작성한 글입니다. 내용 중 잘못된 설명이 있다면 짚어주시면 감사드리겠습니다~

Servlet

  • 자바로 구현된 CGI
  • 자바를 이용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램.
  • 동적인 기능을 실행한다
  • Thread를 이용하며 컨테이너에서 실행된다.
  • HTML 변경 시 Servlet을 재컴파일 해야한다 (response에 html을 작성하므로)






Servlet Program의 기본적인 동작 과정

1. Web Server는 HTTP 요청을 Web Container에게 위임한다

1) web.xml 설정에서 url-mapping 확인
2) client 요청 url을 보고 적절한 Servlet을 실행

2. Web Container는 service() 메서드를 호출하기 전에 Servlet 객체를 메모리에 올린다.

1) Web Container는 적절한 Servlet 파일을 컴파일 (.class 파일 생성)한다.
2) .class 파일을 메모리에 올려 Servlet 객체를 만든다.
3) 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메서드가 실행된다.

3. Web Container는 Request가 올 때마다 thread를 생성하여 처리한다.

WAS(tomcat)은 Web Conatiner를 가지며 Web Container는 Thread Pool을 이용하여 쓰레드를 관리한다.
Thread Pool을 이용하여 스레드의 생성과 제거 과정에 일어날 오버헤드를 줄인다.

Servlet program에서 thread에게 수행할 메서드가 지정 또는 할당되면 해당 thread는 생성/할당 후 즉시 해당 메서드를 수행한다(service())
해당 메소드가 return 하면 thread는 종료한다.


각 thread는 Servlet의 단일 객체에 대한 service() 메서드를 실행한다. thread의 역할은 doGet, doPost를 호출(HttpServlet 기준)하는 것이다.






Servlet API

Interface Servlet 은 이 모두를 구현하여야 한다.

void init(ServletConfig config)

  • 단 한 번만 수행된다
  • 클라이언트 요청에 따라 Servlet를 생성되고 이 Servlet이 메모리에 로드될 때 init() 메서드가 호출된다.
  • ServletConfig는 해당 서블릿의 initParams, ServletContext, servletName 등을 가져와 저장할 수 있다.

    실행 후 첫 request를 보내면 수행된다

ServletConfig getServletConfig()

  • 해당 서블릿의 ServletConfig를 가져온다

void service(ServletRequest servletRequest, ServletResponse servletResponse)

  • 개발자가 응답에 대한 내용을 구현해야 하는 곳 (가장 중요한 메서드이다)
  • Servlet을 implement 한 GenericServlet은 service() 메서드만 구현하면 된다 (실제 응답이기 때문에).
  • 요청에 대한 ServletRequest, 응답에 대한 ServletResponse 객체를 받아온다
  • servletResponse.getWriter()에 반환할 웹페이지를 구현하여 print 해주면 client화면에 전송한 페이지가 응답으로 전송되게 된다.
  • HttpServlet에 경우 doGet(), doPost() 메서드를 오버라이드 해 두면 service() 메서드가 요청에 맞는 메서드를 알아서 호출한다.
  • 메서드가 return 하면 해당 thread는 종료된다.

String getServletInfo()

  • 서블릿에 대한 정보를 리턴한다

void destroy()

  • 서버가 종료될 때 한번 수행된다.
  • Servlet 객체를 메모리에서 제거할 때 호출된다.






web.xml

tomcat과 web.xml

tomcat은 Servlet Container, Servlet Engine으로써 Servlet을 실행하여 동작한다.

web.xml 파일에는 클라이언트가 어떤 URL을 요청할 때 실행할 Servlet을 매핑해놓은 정보가 담겨있다.
tomcat은 매핑된 자바 파일을 Servlet으로 변환시키고, 그 Servlet을 실행하여 요청에 응답한다.

@WebServlet

Servlet 3.0부터는 annotation으로 서블릿 배치 정보를 설정할 수 있다.
Servlet 클래스 위에 @WebServlet(value="{path}")를 넣어 mapping을 web.xml에 기록하지 않으며 처리할 수 있다.






예시

public class HelloWorld implements Servlet {

    ServletConfig config;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("call init()");
        this.config = servletConfig;
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("call getServletConfig()");
        return this.config;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("call service()");

        PrintWriter out = servletResponse.getWriter();
        // ServletResponse 객체로부터 PrintWriter 객체를 가져와 응답 생성한다.

        out.println("<html>");
        out.println("<head>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>Hello World!</p>");
        out.println("</body>");
        out.println("</html>");
    }

    @Override
    public String getServletInfo() {
        System.out.println("call getServletInfo()");
        return "version=1.0;author=ckddn";
    }

    @Override
    public void destroy() {
        System.out.println("call destroy()");
    }
}
<web-app ... >

<!--    servlet: 만들어준 서블릿들을 등록한다. -->
    <servlet>
        <servlet-name>Hello</servlet-name>
<!--        servlet-name: 서블릿의 이름. mapping시 이를 활용한다. -->
        <servlet-class>HelloWorld</servlet-class>
<!--        servlet-class: 서블릿 클래스. -->
    </servlet>

<!--    servlet-mapping: servlet이 어느 url에 매핑할 것인지 등록한다 -->
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/Hello</url-pattern>
<!--        등록한 서블릿의 이름(servlet-name)과 url-pattern을 등록한다. -->
    </servlet-mapping>


</web-app>






참고자료

반응형