서블릿

HTML form으로 post 전송을 요청하면 웹 브라우저가 오른쪽처럼 HTTP 메시지를 만든다.

만약 웹 애플리케이션 서버를 직접 다 만들어야 한다면 HTTP 메시지를 모두 풀어헤쳐야 한다. 그 다음엔 왼쪽과 같은 과정을 거친다.

이 많은 과정 중에 초록색으로 표시한 부분이 의미있는 비즈니스 로직이다. 그런데 그 전후 처리가 너무 많다. 개발자들이 이걸 개발하는 것은 비효율적이다.

서블릿은 초록색을 제외한 모든 일을 지원해준다. 주로 서블릿을 지원하는 WAS들이 이 기능을 제공한다.

서블릿은 위와 같이 생겼다. URL이 호출되면 해당 코드가 실행된다. 이 코드에 애플리케이션 로직만 작성하면 되는 것이다.

  • HttpServletRequest

    • HTTP 요청 정보를 편리하게 사용하도록 한다.

  • HttpServletResponse

    • HTTP 응답 정보를 편리하게 제공한다.

서블릿 덕분에 개발자는 HTTP 스펙을 편리하게 사용할 수 있다.

  1. 브라우저가 /hello로 요청을 보내면 WAS는 이 요청 메시지를 기반으로 request, response 객체를 생성한다.

    • 개발자는 request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용한다.

  2. 두 객체를 넘겨받은 서블릿 컨테이너는 개발자가 만든 helloServlet을 실행해준다.

  3. 리턴을 하면 reponse 객체에 응답 메시지를 만들어 브라우저에 전달한다.

    • 개발자는 response 객체에 HTTP 응답 정보를 편리하게 입력한다.

    • WAS는 response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성한다.

서블릿 컨테이너

  • 톰캣처럼 서블릿을 지원하는 WAS는 서블릿 컨테이너라고 한다.

  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.

  • 서블릿 객체는 싱글턴으로 관리한다.

    • 요청할 때마다 객체를 생성하는 것은 비효율적이다.

      • request, response는 요청마다 데이터가 다르므로 요청마다 새로 만든다.

    • 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.

      • 메서드 안에 애플리케이션 로직만 만들면 되므로 항상 재사용한다.

    • 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.

      • 같은 서버라면 누가 요청하든 같은 서블릿 인스턴스로 로직을 실행한다.

      • 따라서 공유 변수를 사용할 때 조심해야 한다. 자칫하면 다른 사람이 로그인했는데 내 정보가 보일 수 있다.

    • 서블릿 컨테이너가 종료될 때 함께 종료된다.

  • JSP도 서블릿 변환되어서 사용한다.

  • 동시 요청을 위한 멀티 스레드 처리를 지원한다.

Last updated