본문 바로가기
Spring

Servlet 이란?

by seeker00 2021. 7. 1.

Servlet

  • 자바 웹 어플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할
  • 서블릿(servlet)은 WAS에 동작하는 JAVA 클래스로 HttpServlet 클래스를 상속받아야 한다
  • 서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두 가지(JSP, 서블릿)를 조화롭게 사용
    • 예를 들어, 웹 페이지를 구성하는 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현
  • 현재 프로젝트에서 웹을 개발할 때 서블릿을 직접 써서 개발하지는 않는다
  • 편하게 사용할 수 있게 도와주는 다양한 프레임워크를 사용해서 개발하는 경우가 더 많으나, 그런 프레임워크들도 서블릿이 없이는 동작할 수 없기 때문에 서블릿의 기본적인 작성법이나, 서블릿의 라이프 사이클을 이해하고 있다면 웹의 동작을 이해하는 데 많은 도움이 된다

버전에 따른 Servlet 작성 방법

  1. Servlet 3.0 spec 이상에서 사용하는 방법
    • web.xml 파일보다는 자바 어노테이션(annotation)을 사용
  2. Servlet 3.0 spec미만에서 사용하는 방법
    • servlet을 등록할 때 servlet과 그 servlet의 mapping 정보(url)를 web.xml 파일에 등

Servlet 라이프 싸이클(생명주기)

  • 클라이언트가 서버(WAS)로 URL 요청 -> 서버는 URL 매핑을 통해서 해당하는 서블릿 클래스를 확인하고 이 클래스가 메모리에 존재하는지 여부를 확인(서버에 서블릿 객체는 하나만 존재한다) -> 메모리에 없을 시에만 객체 생성, 초기화(init()) 수행 -> service
  • 만약 서블릿이 수정되었다면, 메모리에 올라간 서블릿은 더 이상 이용할 수 없으므로 삭제(destroy())하고 클라이언트에서 요청이 들어오면 새롭게 생성, 초기화 수행 -> service
  1. WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인
    if (메모리에 없음) {
    	해당 서블릿 클래스를 메모리에 올림
        init() 메소드를 실행  
    }
  2. service()메소드를 실행(요청에 대한 응답 구현)
  3. WAS가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행

요청과 응답

  • WAS는 웹 브라우저로부터 Servlet요청을 받으면, 요청할 때 가지고 있는 정보를 HttpServletRequest객체를 생성하여 저장
  • 웹 브라우저에게 응답을 보낼 때 사용하기 위하여 HttpServletResponse객체를 생성
  • 생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에게 전달

HttpServletRequest

  • 클라이언트가 서버에게 보낸 요청을 추상화한 객체
  • 메서드로 요청할 때 가지고 있는 정보들을 모두 담는다
    • path 정보, 클라이언트의 IP, 클라이언트의 다양한 정보를 포함
  • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용
  • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있다
  • Body의 Stream을 읽어 들이는 메소드를 가지고 있다

HttpServletResponse

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

HttpServlet의 service(request, response) 메소드

  • HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현
    • 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출
    • 클라이언트의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response)를 호출
  • HttpServlet을 상속받은 개별 Servlet 클래스들은 service()는 따로 오버라이드하지 않고, doGet(), doPost() 메서드를 오버라이드해서 기능을 구현한다
  • WAS는 service()만 호출한다
    • 부모 클래스 HttpServlet의 service() 메서드가 실행되면서, 오버라이드 된 메서드들이 실행된다.

템플릿 메소드 패턴

  • 참고)
  • 알고리즘의 뼈대(구조)를 구성해두고, 이를 오버라이드(override)하는 등으로 활용
  • 추상 클래스와 훅 메소드를 활용

서블릿 매핑(내용 추가 필요)

  • 와일드카드(*)

출처) 부스트코스 풀스택 강의