Web

Servlet 이해하기

웹개발자가 되기로 하고 나서 여러가지 기술을 배웠다. 그러나 정작 어디서 들어본 용어만 많고 정작 Servlet이 뭐냐고 물어보면 얼버무리게 되는게 현재 나의 상황인 것 같다. 지금이라도 조금씩 용어를 알고 정리를 해야겠다.

각설은 이만하고 Servlet 이란 무엇일까?

위키백과에서는 이렇게 정의하고 있다.

자바 서블릿(Java Servlet)은 자바)를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 “서블릿”이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. 서블릿은 JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.

자바 서블릿은 자바 EE 사양의 일부분으로, 주로 이 기능을 이용하여 쇼핑몰이나 온라인 뱅킹 등의 다양한 웹 시스템이 구현되고 있다.

CGI는 요청이 있을 때마다 새로운 프로세스가 생성되어 응답하는 데 비해, 자바 서블릿은 외부 요청마다 프로세스보다 가벼운 스레드로써 응답하므로 보다 가볍다. 또한, 자바 서블릿은 자바로 구현되므로 다양한 플랫폼에서 동작한다.

위키백과

잠시 위키백과에서 나온 CGI(Common Gateway Interface) 란 무엇일까?

웹 서버 동작과정

사용자가 웹 브라우저를 통해서 화면을 보고 싶으면 웹 브라우저를 통해서 웹 서버에게 HTTP 프로토콜로 요청을 하게된다.

이때 웹 서버는 그 요청을 처리하기 위해서 애플리케이션을 찾아서 실행을 하게 되고 애플리케이션은 웹서버로 들어온 요청에 대해서 작업을 수행한 후에 작업의 결과를 웹 서버에게 전달한다. 이후 웹 서버는 애플리케이션이 건네 준 결과를 받아서 웹 브라우저에 결과를 전달한다.

이 과정에서 웹서버와 웹 애플리케이션 사이에서 정보를 주고 받는 방법이나 규약이 CGI라고 할 수 있다.

서블릿은 자바로 구현된 CGI 프로그램이고 자바로 웹 어플리케이션을 개발할 수 있도록 하기 위해 만들어 졌다.

자바 서블릿은 클라이언트의 HTTP 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 자바 프로그램이며 서블릿 컨테이너 내에서 실행된다. 라고 이해하면 될 것 같다.

서블릿 동작 과정

서블릿 동작 과정

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

그렇다면 여기서 나오는 서블릿 컨테이너란 무엇일까?

Servlet Container 란?

서블릿을 서버에서 실행하는 자바 프로그램이라고 했는데 이 서블릿을 관리해주는 역할을 하는 것이 서블릿 컨테이너다.

서블릿 컨테이너는 클라이언트에서 전송되는 서블릿 요청에 대하여 서블릿을 수행하는 프로그램이다.

서블릿 컨테이너의 역할

  • HTTP 요청을 받아서 서블릿을 실행시키고, 그 결과를 사용자 웹 브라우저에게 전달해주는 기능을 제공하는 컴포넌트 이다.
  • 서블릿이 제공하는 기능을 실행시켜주며 관리해주고 서블릿의 생명주기 (LifeCycle)을 관리하고 요청에 따른 Thread를 생성해 준다.
  • 서블릿과 웹 서버가 통신하기 용이하게 해준다. 즉 통신 할 수 있는 방법을 제공한다.
  • 멀티 스레딩을 지원하여 클라이언트의 다중 요청을 알아서 처리해준다.

Servlet의 수행 흐름

servlet수행흐름

다음 그림은 서블릿을 브라우저에서 URL 문자열로 요청할 경우 그 수행 순서를 나타낸 그림이다.

서블릿의 수행 흐름

  1. 브라우저에서 서블릿을 요청하는 HTTP URL 문자열을 사용하여 수행을 요청한다.
  2. WAS 안의 웹 서버가 서블릿 수행 요청임을 인식하고 서블릿 컨테이너에게 서블릿을 수행하도록 요청한다.
  3. 스레드를 하나 기동하여 해당 서블릿을 수행한다.
  4. 기동되었던 스레드를 종료하고 리턴한다.
  5. 섭르릿의 수행겨로가를 웹 서버에 전송한다.
  6. 출력 버퍼의 내용으로 HTTP 응답 헤더와 응답 바디를 구성하여 클라이언트로 전송한다.

브라우저로부터 WAS로 섭르릿 요청을 최초로 하는 경우와 두 번째 이후 요청인가에 따라서 처리되는 흐름이 약간 달라진다.

서블릿 최초 요청 시 수행 흐름

  1. 브라우저로부터 서블릿 수행 요청이 전송된다.
  2. 요청된 서블릿 클래스를 찾아서 메모리에 로딩한 후에 객체를 생성한다.
  3. init(ServletConfig) 메서드를 호출한다.
  4. service(ServletRequest, ServletResponse) 메서드를 호출한다.
  5. 요청 방식에 따라서 doGet() 또는 doPost() 메서드를 호출한다.
  6. 출력 버퍼의 내용을 요청을 보낸 브라우저로 리턴한다.

두 번째 이후부터의 요청인 경우에는 이미 생성되어 있는 서블릿 객체를 찾아서 다음과 같은 순서를 적용하여 서블릿을 수행시킨다.

서블릿의 두 번째 이후 요청 시 수행흐름

  1. 브라우저로부터 서블릿 수행 요청이 전송된다.
  2. service(ServletRequest, ServletResponse) 메서드를 호출한다.
  3. 요청 방식에 따라서 doGet() 또는 doPost() 메서드를 호출한다.
  4. 출력 버퍼의 내용을 요청을 보낸 브라우저로 리턴한다.

위 그림에서는 서블릿의 수행 흐름 중 destroy()에 대한 언급이 생략되어 있다.

destroy()는 브라우저로부터의 요청과 관계없이 메모리상에 생성된 서블릿 객체가 메모리 해제되는 시점에서 호출되는 메서드이다.

  • 서블릿 객체가 메모리에서 해제되는 시점

    • 컨테이너(서버)가 종료될 때
    • 웹 어플리케이션이 리로드될 때
    • 자동 리로드가 설정된 상태에서 서블릿이 재컴파일되었을 때

출처

Share