Servlet에 대해

Minkuk Jo·2020년 1월 9일
0

Servlet 동작 과정

  1. 웹 클라이언트는 웹 서버에게 HTTP 요청(GET or POST) 메시지를 보낸다.
    이때, 필요에 따라 매개변수와 웹 서버로부터 전달받아 보관하고 있던 쿠키 정보를 같이 보낼 수도 있다.

  2. 웹 서버는 웹 클라이언트로부터 들어온 HTTP 요청을 해석하여 서블릿에 대한 요청일 경우, 서블릿 컨테이너에게 네트워크를 통해 요청을 전달한다. 이렇게 네트워크를 통해 웹 서버와 서블릿 컨테이너가 메시지를 주고받기 때문에 각각이 실행되는 컴퓨터가 달라도 된다.

  3. 웹 서버로부터 클라이언트의 요청을 받은 서블릿 컨테이너는 해당 서블릿을 생성하여 서비스를 수행할 수 있도록 service() 메소드를 호출한다.

  4. 서블릿은 서블릿 컨테이너에 의해 인스턴스가 생성되어 필요에 따라 init() 메소드가 호출되어 초기화되고, 실제 서비스를 수행하기 위한 service() 메소드가 호출된다.

  5. 서블릿에서는 서비스를 수행한 후, 해당 결과를 알리기 위해 결과 페이지를 웹 서버에게 네트워크를 통해 전달한다.

  6. 웹 서버는 서블릿 컨테이너로부터 전달받은 결과 페이지를 웹 클라이언트에게 HTTP 응답으로 되돌려준다.


Servlet 기본 인터페이스와 클래스

HttpServlet 클래스

  • HTTP 서블릿을 작성하기 위해서는 HttpServlet 클래스를 상속받고,
    HTTP 요청에 해당하는 doGet(), doPost() 메소드를 재정의 해야 한다.

HttpServletRequest 인터페이스

  • HTTP 서블릿에서 웹 클라이언트로부터 전달된 요청과 관련된 작업을 할 수 있도록 기능을 제공한다.
  • 웹 클라이언트로부터 전달된 매개변수를 파싱 하거나, 쿠키 데이터를 파싱 하는 작업을 할 수 있다.
  • HTTP 요청에 대한 헤더 정보를 얻을 수 있다.
  • HttpServletRequest 인터페이스는 ServletRequest 인터페이스를 상속받고, HttpServlet 클래스에 상속된다.

HttpServletResponse 인터페이스

  • 웹 클라이언트에게 전달할 응답과 관련된 작업을 할 수 있도록 기능을 제공한다.
  • ServletResponse 객체를 이용하여 PrintWriter 객체를 얻은 후, 결과 페이지를 출력하는 작업을 할 수 있다.
  • HTTP 응답에 대한 헤더 정보를 설정하거나, 웹 클라이언트에게 부여할 쿠키를 추가할 수 있다.
  • HttpServletResponse 인터페이스는 ServletResponse 인터페이스를 상속받고, HttpServlet 클래스에 상속된다.

Servlet의 생명주기

서블릿 클래스는 객체를 생성하거나 메소드를 호출하는 주체가 서블릿 컨테이너다.
서블릿 컨테이너가 서블릿 인스턴스의 생명주기를 관리하면서 아래와 같은 메소드를 호출한다. 개발자는 서블릿 구현 시 생명주기와 관련된 메소드를 작성해야 한다.

init()

  • 서블릿 컨테이너는 요청을 처리할 서블릿의 인스턴스를 생성한 후, 서블릿이 초기화 작업을 수행할 수 있도록 init() 메소드를 내부적으로 자동 호출한다. 따라서, 초기화해야 할 작업이 있다면 서블릿 클래스의 init() 메소드 내에 정의해야 한다.

service()

  • 서블릿 컨테이너는 인스턴스의 init() 메소드를 호출 후, 서블릿 인스턴스의 service() 메소드를 호출하여 클라이언트로부터 온 요청을 받아 처리할 수 있도록 한다.
  • 서블릿이 service() 메소드를 호출하면서 요청과 관련된 ServletRequest 객체와 ServletResponse 객체를 매개변수로 전달한다. 따라서, 서블릿에서는 ServletRequest 객체를 이용하여 요청을 처리하고 응답에 해당하는 결과 페이지를 ServletResponse 객체에서 얻은 PrintWriter 객체를 통해 출력한다.

destroy()

  • 서블릿이 요청과 관련된 작업을 모두 마치면, 서블릿 컨테이너에 의해 Thread Pool에 들어가거나 메모리에서 내려간다.
  • Thread Pool에 들어가는 경우 나중에 다시 실행되기 때문에 상관없지만, 메모리에서 내려갈 땐 서블릿이 GC 되는 것을 의미하기 때문에 서블릿이 마지막으로 마무리 작업을 하도록 해야 한다.
  • 따라서, GC 되기 전 마지막으로 수행해야 할 작업이 있다면 destroy() 메소드 내에 정의해야 한다.

Servlet의 요청 처리 과정

  1. 컨테이너는 서블릿 클래스를 메모리에 적재하여 상주시킨다.

  2. 서블릿 클래스의 생성자 메소드를 호출해 인스턴스를 생성하고 메모리에 적재한다.

  3. 생성된 인스턴스의 init() 메소드가 호출된다.
    init() 메소드는 서블릿 생명주기에서 단 한번만 실행된다.
    따라서 init() 메소드에서는 각종 초기화 작업 등을 수행한다.

  4. Servlet에 대한 사용자 요청에 대해 web.xml 파일을 참조해 URL 매핑을 확인하고, 해당 Servlet 인스턴스로부터 Thread를 생성해 service() 메소드를 호출한다. 모든 사용자 요청에 대해 개별적인 service() 메소드가 호출되며 GET or POST 요청을 구분하여 doGet() or doPost() 메소드가 호출된다. 따라서 개발자는 doGet() or doPost() 메소드에 대부분의 필요 기능을 구현한다.

  5. destroy() 메소드는 Servlet 인스턴스가 더 이상 존재할 이유가 없어 메모리에서 소멸될 때 호출된다. 이 상황에 필요한 작업이 있다면 이 메소드에 관련 내용을 구현한다.

profile
앞으로 모든 건 github에 집중! https://github.com/J-minkuk

0개의 댓글