[Web & Server] 서블릿(Servlet)이란?

업데이트:




✅ 서블릿(Servlet)이란?

서블릿이란 Dynamic Web Page, 즉 동적 페이지를 만들 때 사용되는 JAVA기반 웹 애플리케이션 프로그래밍 기술이다. 웹을 만들 때는 다양한 요청 (Request)과 응답(Response)이 있고, 이 요청과 응답에는 규칙이 존재하는데, 이러한 요청 응답을 간단한 메서드 호출로 체계적으로 다룰 수 있게 해주는 기술이라고 보면 된다.

좁은 의미로 서블릿을 보면 위와 같은 기능을 하는 자바 클래스이고, 넓은 의미로 서블릿을 보면 위와 같은 기능을 하는 자바 패키지이다.




✅ 서블릿의 등장 배경

과거에 서버는 정적페이지(HTML,CSS,Image) 만을 처리했다. 클라이언트가 자료를 요청하면 서버는 미리 만들어둔 데이터를 저장하고 있다가 HTML로 반환했다. 그런데 점점 사용자가 많아지자 저장공간도 부족해지고, 사용자들은 정적페이지가 아닌 각자 필요에 맞는 동적 페이지를 받고 싶어했다. 그래서 이러한 동적 페이지를 만들기 위해 생겨난 것서블릿(Servlet)이다!




✅ 서블릿과 서버

앞선 포스팅에서 Web서버와 WAS에 대해서 알아봤는데 서블릿과도 관계가 아주 깊다. Web서버는 정적페이지를 처리하고, WAS는 동적페이지를 처리하는데 WAS에서 연산을 담당하는 것이 바로 서블릿이다. 이러한 서블릿은 WAS내의 서블릿 컨테이너(웹 컨테이너)에서 관리된다.




✅ 서블릿 컨테이너 (웹 컨테이너)

서블릿 컨테이너는 말그대로 서블릿을 담고 관리해주는 컨테이너 이다. 일반적으로 홈페이지에 들어가면 굉장히 많은 기능을 제공하는데 예를 들어 쇼핑몰 페이지만 봐도 구매, 장바구니 등록, 게시판, 회원가입 등 기능이 굉장히 많다. 이런 기능들은 데이터를 주고받으며 사용자에 따라 각기 다른 정보를 제공해야 하므로 동적 데이터, 즉 서블릿을 통해 작동되는데 하나의 서버 안에 수많은 서블릿이 존재하면, 이를 전부 컨트롤하기는 어려운 일이다. 따라서 서블릿 컨테이너가 모든 서블릿을 제어함으로써 효율적인 서버 관리가 가능하다.



앞서 서블릿은 일종의 자바 클래스 혹은 패키지라고 얘기 한 바 있다. 서블릿을 실제로 작성해보면 자바 언어로 쓰이고 자바 클래스 형태를 띄고 있는걸 알 수 있다. 그리고 이러한 서블릿은 javax.servlet.http 라는 패키지 안에 포함되어 있다. javax.servlet은 서블릿 구현을 위한 다양한 인터페이스와 클래스가 포함된 꾸러미이다. 우리가 쓰는 서블릿 클래스는 이 패키지 안에서 하나를 빌려와서 구현한 것이다.



우리가 servlet 클래스의 규칙에 맞게 구현을 하고 클라이언트가 요청을 하면 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성하고 POST,GET 여부에 따라 동적인 페이지를 생성하여 응답을 보낸다.

  • HttpServletRequest
    http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용하며 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와 Body의 Stream을 읽어 들이는 메서드를 가지고 있습니다.

  • HttpServletResponse
    WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체를 생성하여 서블릿에게 전달하고 이 객체를 활용하여 content type, 응답 코드, 응답 메시지 등을 전송합니다.





✅ 서블릿 컨테이너의 실행 순서

1️⃣ 클라이언트의 요청

HTTP프로토콜을 통해 Request 받은 요청이 정적 페이지라면 WEB서버를 통해 바로 처리해주고, 동적 페이지라면 서블릿 컨테이너로 넘긴다.


2️⃣ HttpServletRequest, HttpServletResponse 객체 생성

요청이 들어오면 서블릿 컨테이너에서는 HttpServletRequest, HttpServletResponse 객체를 생성한다. HttpServletRequest는 요청에 대한 데이터 처리과정을 담당하고, HttpServletResponse는 요청에 대한 결과물 반환을 담당한다.


3️⃣ Web.xml 파싱

Web.xml은 서블릿의 위치(주소)는 어디인지, 어떤 이름으로 mapping 할 것인지 찾을 수 있도록 도와주는 문서이다. Web.xml을 참조해서 Servlet으로 접근한다고 보면 된다. 서블릿 컨테이너는 Web.xml 문서에 따라 그에 맞는 서블릿 주소를 찾고 서블릿에 접근한다.


4️⃣ 서블릿 초기화 Web.xml 문서에 따라 실행할 서블릿을 찾았다면 해당 서블릿 클래스를 로드한다. 그리고 서블릿에서 사용할 객체를 만든다. 그리고 이 객체를 이용해 init()메서드를 호출해서 서블릿을 사용할 수 있도록 초기화한다.


5️⃣ Service 실행 서블릿 초기화 이후에는 요청을 처리하는 service() 메서드가 실행 된다. 그리고 service()는 요청이 get방식인지, post방식인지에 따라 맞는 메서드를 실행한다.

요청이 get이라면 doGet()을, 요청을 post라면 doPost()를 실행한다.


6️⃣ destroy() 실행 더이상 사용되지 않는다고 판단하거나 서버가 종료될 때 컨테이너는 destroy() 메서드를 실행하여 서블릿을 제거한다.




댓글남기기