ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Web Programming] Servlet
    IT/개발(자바, 서블릿, 스프링 등) 2019. 10. 30. 13:55

    1. 서블릿이란?

    자바 웹 애플리케이션의 구성요소 중 클라이언트의 요청을 동적인 처리하여 응답하는 프로그램.

    동적인 페이지가 필요한 이유는, 사용자가 요청하는 요청값에 따라 변경되는 페이지를 보여주기 위해 동적인 페이지가 필요하다.

    일반적인 웹서버는 정적인 페이지만을 제공하기에, 서블릿이 동적인 페이지를 제공하도록 돕는다.

    서블릿은 HttpServlet 클래스를 상속 받아야 한다.

    HttpServlet은 서블릿 규칙에 따라 만들어졌다. doGet, doPost 등이 서블릿 호출 규칙이다. HttpServlet을 상속하지 않으면 Servlet 규칙에 어긋나기 때문에 에러가 발생한다. WAS(서블릿컨테이너)는 servlet 호출규칙에 따라 서블릿(.class) 을 실행시킨다.

     

    2. 서블릿컨테이너란?

    서블릿을 관리하는 컨테이너이다. 대표적인 예로 WAS인 톰캣이 있다.

     

    1. 서블릿 컨테이너(톰캣)는 웹서버(아파치 혹은 톰캣 내의 웹서버)와의 통신을 지원한다. 

    2. 서블릿의 생명주기를 관리한다.

    3. 다중 스레드를 관리한다. 서블릿 컨테이너는 클라이언트의 요청이 올 때마다 자바 쓰레드를 생성하여 서블릿 객체를 생성하고, 서블릿 객체 작업이 종료되면 스레드를 종료한다.

     

     

     

    출처: https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/

    1. 사용자가 URL을 클릭하면 HTTP Request를 Servlet Container에 보낸다.
    2. Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
    3. 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다.
    4. 컨테이너는 서블릿 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.
    5. doGet() or doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse객체에 응답을 보낸다.
    6. 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.

     

     

     

    출처: https://wickedmagic.tistory.com/113

    브라우저에서 서블릿 요청, 웹 서버가 서블릿 요청을 인식하여 서블릿 컨테이너에게 서블릿 요청 처리하도록 넘김, 서블릿 컨테이너는 스레드를 생성하여 해당 서블릿 객체를 생성하여 처리, 서블릿 객체 작업 종료시 스레드 종료하고 리턴, 서블릿 수행 결과 웹 서버에 전송, 웹 서버가 클라이언트에게 전송.

     

    3. 버전에 따른 Servlet 작성 방법

    3-1. Servlet 3.0 spec 이상에서 사용하는 방법

    • web.xml 파일을 사용X.
    • 자바 어노테이션(annotation)을 사용.

    실습코드

    TenServlet.java

    출처: www.edwith.org/boostcourse-web

    * System.out       : 콘솔에 출력.

    * PrintWriter       : HttpServletResponse 객체로부터 얻어온 PrintWriter. 응답 결과로 출력.

    * response.setContentType("text/html;charset=utf-8")      : 브라우저가 응답을 받을 때, 텍스트 중에서 html 파일로 받을 것이고, 캐릭터셋을 utf-8로 인코딩하여 한국어로 출력할 수 있도록 할 것이다.

     

    3-2. Servlet 3.0 spec미만에서 사용하는 방법

    • servlet을 등록할 때 web.xml 파일에 등록한다.

     

    4. Servlet 생명주기

    HttpServlet의 3가지 메소드를 오버라이딩

    • init()
    • service(request, response)
    • destroy()
    • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인.
    •  if (메모리에 없음) {
       - 해당 서블릿 클래스를 메모리에 올림
       - init() 메소드를 실행
      }
       - service()메소드를 실행
    • was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행.

     

    1. 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고, 없을 경우 init()메소드를 호출하여 적재한다. init()메소드는 처음 한번만 실행되기 때문에, 서블릿의 쓰레드에서 공통적으로 사용해야하는 것이 있다면 오버라이딩하여 구현한다. 실행 중 서블릿이 변경될 경우, 기존 서블릿을 파괴하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다.
    2. init()이 호출된 후 클라이언트의 요청에 따라서 service()메소드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기된다. 이때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response객체가 제공된다.
    3. 컨테이너가 서블릿에 종료 요청을 하면 destroy()메소드가 호출되는데 마찬가지로 한번만 실행되며, 종료시에 처리해야하는 작업들은 destroy()메소드를 오버라이딩하여 구현하면 된다.

     

    5. 정리

    클라이언트가 웹브라우저에 도메인과 포트번호를 이용하여 서버에 접속한다.

    path 정보, 클라이언트 ip 등등의 요청정보를 서버에게 전송한다.

    웹서버가 서블릿 컨테이너에게 요청을 전달한다.

    서블릿 컨테이너는 HttpServletRequest(요청정보가 담긴 객체), HttpServletResponse(클라이언트에게 전송할 정보를 담을 객체)를 생성한다.

    요청정보에 있는 path를 참고하여 요청에 맞는 서블릿을 찾는다.

    위 두개의 객체는 doGet(), doPost와 같은 메소드의 파라미터로 전달되어 사용된다.

     

    HttpServletRequest

    • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용.
    • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드 존재.
    • Body의 Stream을 읽어 들이는 메소드 존재.

    HttpServletResponse

    • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse객체를 생성하여 서블릿에게 전달.
    • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지 등을 전송.

     

     

     

     

    참고

    https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/

    https://wickedmagic.tistory.com/113

    https://mangkyu.tistory.com/14

    www.edwith.org/boostcourse-web

Designed by Tistory.