본문 바로가기
3층 개발관/Spring

[Spring] 서블릿(Servlet)이란??

by 개발관 2023. 6. 30.
반응형

서블릿의 등장 배경

  • 과거 서버는 정적인 자료(주로 HTML)만 주고받을 수 있었다.
  • 인터넷 사용자가 많아지면서 다양한 기능을 필요에 맞게 웹사이트를 제공받고 싶어 했다.
  • 사용자 요구에 맞춰 동적으로 반응하는 페이지를 만들기 위해 만들어진 것이 서블릿이다.

 

서블릿(Servlet)

  • 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다 - 위키피디아-
  • 서블릿은 WAS(Web Application Server)내의 서블릿 컨테이너 안에서 동작하게 되며, 요청(Request)을 받으면 요청에 맞는 로직을 실행하고 클라이언트에게 HTTP 형식으로 응답(Response)하게 된다.

 

서블릿 특징

  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
  • MVC 패턴의 Controller 역할을 맡는다
  • JAVA의 쓰레드를 이용한다.
  • 클라이언트의 요청에 동적으로 응답하는 웹 애플리케이션 컴포넌트
  • HTML을 사용하여 응답한다.
  • HTML변경 시 서블릿을 재 컴파일해야 한다는 단점이 존재한다.

 

Servlet Life-Cycle Method

  • init() : 웹 컨테이너에 의해 호출되어 서블릿이 서브시에 위치할 수 있도록 초기화하는 메서드, 서블릿 생명 주기 중 단 한번 init() 메서드를 호출한다. init() 메서드가 완료되어야 service() 메서드에 배치 가능
  • doGet() : GET방식으로 data전송 시 호출
  • doPost() : POST방식으로 data전송 시 호출
  • service() : init()메소드가 성공적으로 실행된 이후 호출, 요청에 따른 메서드를 실행 ex) doGet, doPost 등 또한 서비스 실행 시 새로운 스레드에서 service() 메서드를 실행하기 때문에 다중 요청이 들어와도 서블릿을 매번 로드하지 않음.
  • destroy() : 수명이 다한 서블릿을 서비스에서 제외되도록 하는 메서드, 웹 컨테이너(Servlet Container)에 의해 자동으로 수행된다.

 

서블릿 컨테이너(Servlet Container)

  • 서블릿을 담고 관리해주는 컨테이너
  • 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리하며 클라이언트의 요청을 받으면 HttpServletRequest와 HttpServletResponse객체를 생성하여 post, get여부에 따라 동적인 페이지를 생성하여 응답한다.

 

1. 서블릿의 생명주기

  • 서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다.
  • 서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 찾아 동작한다.
  • 서블릿의 생명이 다하면 가비지 컬렉션(Garbage Collection)을 통해 메모리에서 제거한다.

 

2. 통신 지원

  • 웹 서버와 소켓을 만들어서 클라이언트의 요청을 받고 응답할 수 있는 통신을 지원
  • 통신을 하기위한 과정을 API로 제공하여 복잡한 과정을 생략하기 때문에 개발자가 비즈니스 로직 개발에 집중할 수 있게 도와준다.

 

3. 멀티쓰레드 지원 및 관리

  • 서블릿 컨테이너는 클라이언트의 요청을 받을 때마다 새로운 자바 스레드를 생성한다.
  • 동시에 여러 요청이 들어와도 멀티쓰레딩 환경에서 동시다발적인 작업을 관리할 수 있다.

 

4. 선언적인 보안 관리

  • 보안관련 기능을 제공하기 때문에 개발자는 서블릿에 보안 관련 메서드를 구현하지 않아도 된다.

 

서블릿 동작 과정

1. 클라이언트 요청

  • Http 프로토콜을 통해서 원하는 데이터를 요청(Request) 한다.
  • 이때, 고객의 요청이 정적페이지면 Web서버를 통해서 바로 처리한다.
  • 동적 페이지의 요청이면 고객의 요청은 웹 컨테이너(서블릿 컨테이너)로 넘긴다.

2. HttpServletRequest, HttpServletResponse 객체 생성

  • HttpServletRequest 객체는 고객의 요청 정보를 담고 해당 정보가 처리될 때까지 웹 컨테이너를 돌아다닌다.
  • HttpServletResponse 객체는 요청에 따른 처리정보를 담은 객체로 최종적으로 고객의 요청에 응답한다.

3. Web.xml

  • 서버를 초기화 할때 어떤 서블릿이 프로젝트 폴더 내에 있다면 어느 위치에 존재하고 어떤 URL로 접속해야 하는지 알려준다.
  • 컨테이너는 Web.xml문서에 따라 그에 맞는 서블릿 주소를 찾는다.

4. 서블릿 초기화

  • 서블릿 주소를 찾았다면 해당 서블릿 클래스를 로드하게 된다.
  • 서블릿에서 사용할 객체를 만들고 이 객체를 이용하여 init()메서드를 호출하여 서블릿을 사용할 수 있도록 초기화한다.(클래스 로드, 서블릿 인스턴스 생성, init()은 서블릿 생명 주기에서 단 한 번만 수행)
  • 최초 요청에 따라 초기화 및 실행된 이후의 고객의 요청에는 새로운 스레드를 만들어서 service() 메서드를 실행하는 식으로 이루어진다.

5. service() 실행

  • 고객의 요청을 실질적으로 처리하는 service()메서드가 초기화가 진행된 후 실행
  • 고객의 요청이 get일 경우 : doGet()메서드 실행
  • 고객의 요청이 post일 경우 : doPost()메서드 실행

6. destroy() 실행

  • 더이상 사용되지 않는 서블릿 컨테이너는 destroy()를 실행
  • 초기화되어 실행 중인 servlet을 제거하는 역할

 


** 참고자료 **

 
반응형