너무나도 많이 들어보고 말했던 서블릿... 하지만 3초안에 대답하기엔 내 머릿속에 명확하게 자리잡혀 있지 않았다.
Web Server(Java 기준 Apache)는 이미 저장되어 있는 정적인 컨텐츠(Html)를 응답한다. 만약 사용자가 직접 정보를 찾거나(검색) 기록(저장)을 하려면 웹서버의 문서를 직접 고치는 작업이 필요했다. 때문에 사용자의 입력과 요청 url에 따라 동적으로 변하는 페이지가 필요하게 되었고, 웹서버에서 동적인 처리를 담당할 표준인 CGI(Common Gateway Interface)가 등장하게 되었다.
CGI는 서버와 응용 프로그램간에 데이터를 주고받기 위한 방법이나 규약을 뜻한다.
CGI 의 가장 큰 단점은 멀티프로세스 방식이란 것이다. 멀티프로세스 방식은 요청이 올 때 마다 프로세스를 생성한다. 프로세스는 자원을 상당히 많이 차지하므로 이를 해결하기 위해 요청에 대응하여 프로세스가 아닌 스레드를 생성하는 자바의 Servlet이 등장했다.
웹 프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 규현 규칙을 지킨 자바 프로그래밍 기술
서블릿이란 웹서버 프로그래밍을 위해 만들어진 자바 프로그램 혹은 코드 라고 할 수 있다.
위에서 CGI의 멀티프로세스 방식을 멀티스레드 방식으로 확장한 것이 서블릿이라고 하였다. CGI가 요청을 받아 처리한 결과를 응답해주는 역할을 하는 것처럼 서블릿도 동일한 역할을 수행한다.
CGI와 마찬가지로 서블릿도 Interface(표준) 이므로 구현체가 따로 존재한다. Spring MVC는 웹 어플리케이션을 만드는데 특화된 서블릿 구현체이다.
// 서블릿 클래스에 요청을 받고 응답을 보내는 기능이 있음을 확인할 수 있다.
public abstract class HttpServlet extends GenericServlet {
//...
protected void doGet(HttpServletRequest req, HttpServletResponse resp){...}
protected void doPost(HttpServletRequest req, HttpServletResponse resp){...}
//...
}
Servlet Container
에 의해 관리, 실행된다.서블릿의 생명주기를 비롯해서 여러가지로 서블릿을 관리하는 컨테이너이다.
대표적으로 아래와 같은 일들을 한다.
통신 지원
서블릿과 웹 서버가 통신할 수 있는 방법을 제공한다. 소켓을 만들고 포트를 리스닝, 스트림 생성 등의 일련의 통신 과정을 서블릿 컨테이너가 API로 제공해 우리 대신 통신해준다.
생명주기 관리
서블릿 컨테이너가 기동되는 순간 서블릿 클래스를 로딩해서 인스턴스화하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메소드를 찾아서 호출한다. 만약 서블릿의 생명이 다하는 순간 가비지 컬렉션을 진행한다.
멀티스레딩 관리
서블릿 컨테이너는 요청이 들어오면 스레드를 생성해 작업을 수행한다. 여러 요청이 동시에 들어오면 멀티스레드 환경으로 작업을 한다.
보안 관리
JSP 지원
웹서버 vs 어플리케이션 서버 vs 서블릿 컨테이너
혼용되어 많이 사용되고 있지만 놀랍게도 셋다 다른 의미를 지니고 있다. !!
웹서버
정적 페이지(html, css)를 제공하는 서버 (ex. 아파치, Nginx)
웹 어플리케이션 서버(WAS)
웹 서버
와 서블릿 컨테이너
가 합쳐진 것. 사용자 요청에 따라 동적 컨텐츠를 만들어 응답한다. (ex. Tomcat, WebLogic, WebSphere, Jeus, JBoss 등)
서블릿 컨테이너 (웹 컨테이너)
WAS별로 다양한 종류의 컨테이너를 내장하고 있으며 이들중 서블릿에 관련된 기능을 모아놓은 것을 서블릿 컨테이너라 부른다. Servlet, JSP를 실행할 수 있는 소프트웨어를 말한다. 웹서버에서 JSP를 요청하면 JSP파일을 서블릿 파일로 변환하고 컴파일해 실행한 결과를 웹서버에 전달하게 된다.
여러 종류의 컨테이너가 있으며(Servlet 컨테이너, JSP 컨테이너, EJB 컨테이너 등) 다양한 컴포넌트 들을 내장하고 있다.
Jay Tech 님의 글을 인용하자면,
WAS는 JavaEE (EJB, JMS, CDI, JTA, the servlet API (including JSP, JSTL), etc.)전부를 지원하고,
서블릿 컨테이너는 servlet API를 지원한다.
따라서 WAS 안에 서블릿 컨테이너가 내장된 그런 형태인 것이다.
톰캣은 WAS중 하나로 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하여 우리가 작성한 자바 서버 페이지(JSP)와 자바 서블릿이 실행할 수 있는 환경을 제공하고있다.
WAS = web server + servlet container
웹서버를 통해 필요한 페이지를 요청받는다. (HttpRequest)
웹서버에서 처리할 수 없는 동적인 정보를 WAS가 처리하여 웹서버에 정적인 정보를 제공. 일반적으로 웹서버의 기능을 내제하고 있어 웹 서버 없이도 서비스가 가능하다.
Container가 web.xml(배포서술자)를 참조하여 스레드를 생성하고 요청 및 응답 객체(HttpServletRequest, HttpServletResponse)를 생성하여 스레드에게 전달한다.
WAS는 Servlet을 생성하고 요청마다 알맞게 매칭을 시켜주어야 한다. 그러려면 WAS에게 Servlet에 대한 정보를 줘야하고, web.xml 혹은 Java Config를 이용한다.
스레드 및 요청, 응답 객체 생성을 완료했다면 Container는 사용자의 요청에 맞는 Servlet을 호출(service()
)한다.
호출된 Servlet의 요청을 담당하는 thread가 요청에 따라 doGet(), doPost()를 호출한다.
호출된 doPost(), doGet() 메소드는 생성된 동적 페이지를 Response객체에 실어 Container에게 전달한다.
Container는 전달받은 Response객체를 HttpResponse형태로 전환하여 웹서버에 전달하고 생성되었던 스레드를 종료하고 요청 및 응답 객체를 소멸시킨다.
init()
메소드를 호출하여 적재한다. 생성된 객체는 메모리에 계속 존재하기 때문에 이후 부터는 메모리에 있는 서블릿 객체를 사용한다. service()
메소드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기된다. 이때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response객체가 제공된다.여러 클라이언트가 동시에 요청을 하더라도 쓰레드가 생성되므로 동시에 service()가 실행이 되기 때문에 수행속도가 빠르다.destroy()
메소드가 호출되는데 마찬가지로 한번만 실행된다.https://jusungpark.tistory.com/15
Web - Web Server, Web Container, WAS 의 이해
[JSP & Servlet 배경지식] 2. WS & WAS / Container
Servlet에 대한 개념없이 스프링을 했네요? (급하게 알아보는 스프링 기반 기술 Servlet, Servlet Context, Application Context, ...)