서블릿
Last updated
Last updated
HTML form으로 post 전송을 요청하면 웹 브라우저가 오른쪽처럼 HTTP 메시지를 만든다.
만약 웹 애플리케이션 서버를 직접 다 만들어야 한다면 HTTP 메시지를 모두 풀어헤쳐야 한다. 그 다음엔 왼쪽과 같은 과정을 거친다.
이 많은 과정 중에 초록색으로 표시한 부분이 의미있는 비즈니스 로직이다. 그런데 그 전후 처리가 너무 많다. 개발자들이 이걸 개발하는 것은 비효율적이다.
서블릿은 초록색을 제외한 모든 일을 지원해준다. 주로 서블릿을 지원하는 WAS들이 이 기능을 제공한다.
서블릿은 위와 같이 생겼다. URL이 호출되면 해당 코드가 실행된다. 이 코드에 애플리케이션 로직만 작성하면 되는 것이다.
HttpServletRequest
HTTP 요청 정보를 편리하게 사용하도록 한다.
HttpServletResponse
HTTP 응답 정보를 편리하게 제공한다.
서블릿 덕분에 개발자는 HTTP 스펙을 편리하게 사용할 수 있다.
브라우저가 /hello
로 요청을 보내면 WAS는 이 요청 메시지를 기반으로 request, response 객체를 생성한다.
개발자는 request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용한다.
두 객체를 넘겨받은 서블릿 컨테이너는 개발자가 만든 helloServlet을 실행해준다.
리턴을 하면 reponse 객체에 응답 메시지를 만들어 브라우저에 전달한다.
개발자는 response 객체에 HTTP 응답 정보를 편리하게 입력한다.
WAS는 response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성한다.
톰캣처럼 서블릿을 지원하는 WAS는 서블릿 컨테이너라고 한다.
서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
서블릿 객체는 싱글턴으로 관리한다.
요청할 때마다 객체를 생성하는 것은 비효율적이다.
request, response는 요청마다 데이터가 다르므로 요청마다 새로 만든다.
최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.
메서드 안에 애플리케이션 로직만 만들면 되므로 항상 재사용한다.
모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
같은 서버라면 누가 요청하든 같은 서블릿 인스턴스로 로직을 실행한다.
따라서 공유 변수를 사용할 때 조심해야 한다. 자칫하면 다른 사람이 로그인했는데 내 정보가 보일 수 있다.
서블릿 컨테이너가 종료될 때 함께 종료된다.
JSP도 서블릿 변환되어서 사용한다.
동시 요청을 위한 멀티 스레드 처리를 지원한다.