서블릿(Servlet)

황희윤·2023년 8월 23일

CGI(Common Gateway Interface)

웹이 처음 등장했을 때는 정적인 데이터(HTML, 이미지)만을 전달해주는 웹서버 밖에 없었다. 하지만 CGI가 탄생한 이 후 동적으로 사용자와 상황에 따라 다른 페이지를 보여줄 수 있게 되었다.

하지만 CGI는 요청이 들어올 때마다 프로세스 단위로 실행이 되어 사용자가 많아지면 서버가 힘들어진다.

서블릿(Servlet)

동적 웹 페이지를 만들 때 멀티스레드 방식으로 처리하기 위한 자바 기반의 웹 애플리케이션 프로그래밍 기술

서블릿은 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해주는 기술이다.

서블릿은 각 요청 마다 프로세스를 생성해 처리하는 것이 아니라, 프로세스 1개 안에 Thread Pool이라는 thread들이 생성될 수 있는 공간을 만들어 멀티스레드로 처리한다.
또한 Thread Pool은 thread의 개수를 지정하여 일정 이상의 요청이 들어왔을 때는 대기하도록 만들어서 대량의 요청이 들어왔을 때도 조금 더 안정적으로 운영할 수 있다.

클라이언트가 웹 서버에 요청하면 웹 서버는 톰캣과 같은 WAS에 요청을 전달한다. 그러면 WAS는 각 요청에 해당하는 서블릿을 실행시켜 처리한다. 그 후 결과를 HTTP형식으로 응답한다.

서블릿 컨테이너의 기능

서블릿을 담고 관리해주는 컨테이너

  1. HttpServletRequest, HttpServletResponse 객체 생성

    • HttpServletRequest
      • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적
      • 헤더 정보, 파라미터, 쿠키, URI 정보를 가지고 있음
    • HttpServletResponse
      • 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성하여 서블릿에게 전달
      • content type, 응답 코드, 응답 메시지 등을 전송
  2. 서블릿 생명주기 관리

    • 서블릿 객체를 생성시키고 동작시키며, 생명이 끝난 객체는 가비지 컬렉션을 통해 메모리에서 제거
    • 서블릿 객체는 싱글톤으로 관리
  3. 통신 지원

    • 서블릿과 웹 서버가 통신할 수 있도록 도와준다.
    • 소켓 연결, Content-type 확인, 연결 요청 왔을 시 스트림을 생성
    • 개발자는 비즈니스 로직 개발에만 몰두하면 된다.
  4. 멀티스레딩 관리

    • 요청이 들어올 때마다 thread를 생성
    • HTTP 서비스 메서드를 실행하고 나면 thread는 자동으로 종료
    • 서버가 다중 thread를 관리해주기 때문에 thread 안정성은 따로 고려해주지 않아도 된다.

서블릿의 요청 처리 단계

  1. 클라이언트 요청을 WAS의 웹 서버가 받음

  2. WAS의 웹 서버가 HTTP 요청을 서블릿 컨테이너에게 전달

  3. 서블릿 컨테이너는 HttpServletRequest / HttpServletResponse 객체를 생성

  4. 서블릿 컨테이너는 web.xml (설정 파일)을 참고하여 매핑할 서블릿을 찾고 요청 처리에 필요한 서블릿 인스턴스가 컨테이너에 존재하는 지 확인

  5. 존재하지 않는다면 서블릿 인스턴스를 생성하고 해당 서블릿 인스턴스의 init() method를 호출하여 서블릿 객체를 초기화

    • 이 때 생성된 서블릿 객체는 싱글톤으로 관리하기 때문에 메모리에 남겨두어, 동일한 서블릿에 대해 요청이 온다면 다시 init() 부터 수행하는 것이 아니라 이전에 메모리에 남겨두었던 것을 재사용한다.
    • 재사용하기 때문에 다음 요청부터는 응답이 더 빠르다.
  6. 해당하는 서블릿에서 service() 메소드 호출 후 요청 처리

  7. 동적 페이지 생성 후 ServletResponse 객체에 응답 전송

  8. 처리한 결과를 웹 서버에게 전달한 후 HttpServletRequest / HttpServletResponse 객체를 소멸

  9. 웹 서버는 받은 응답을 클라이언트에게 전달


서블릿 라이프사이클

  1. 서블릿은 생성 이후에 init() 메서드를 통해 초기화된다.

    • init 메서드는 서블릿을 처음 메모리에 올릴때 실행되며 서블릿을 초기화하며 처음에 한번만 실행
  2. service() 메서드 호출

    • 요청/응답(request/response)를 처리하는 메서드
    • 요청이 GET인지 POST인지 구분하여 doGet() 또는 doPost() 메소드로 분기
  3. destroy()

    • 서블릿 종료요청이 있을때 destroy() 메소드가 실행
profile
HeeYun's programming study

0개의 댓글