Servlet(서블릿)

자바 웹 애플리케이션

  • 자바 웹 애플리케이션은 WAS에 설치(deploy)되어 동작한다.
  • 자바 웹 어플리케이션에는 HTML, CSS, 이미지, 자바로 작성된 클래스(Servlet도 포함됨, package, 인터페이스 등), 각종 설정 파일 등이 포함 된다.

Servlet이란?

  • 자바 서블릿은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 러한 사양을 말한다. 흔히 “서블릿”이라고 불린다.
  • 서블릿은 JSP와 비슷하다. JSP가 HTML 문서 안에 java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.
  • 서블릿은 WAS에 의해 동작하는 JAVA 클래스다.
  • 서블릿은 HttpServlet 클래스를 상속 받아야한다.
  • 현재는 웹을 개발할때 서블릿을 직접 사용하지 않는다. 보통 다양한 프레임워크를 사용해서 개발한다.
  • 프레임워크는 서블릿 없이는 동작할 수 없기 때문에 서블릿의 기본적인 작성법과 라이플 사이클을 이해하면 웹 동작을 이해하는데 도움이 된다.

Servlet 생명주기

1_5_3_ServletLifcycle

  • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인한다.
  • 메모리에 없으면, 해당 서블릿 객체를 만들어서 메모리에 올린후 init() 메소드를 실행한다. 그리고 service() 메소드를 실행한다.
  • 메모리에 있으면, 메모리에 있는 서블릿 객체를 통해 service() 메소드를 실행한다.
 if (메모리에 없음) {
 		- 해당 서블릿 클래스를 메모리에 올림
 		- init() 메소드를 실행
 }
 - service()메소드를 실행
  • WAS가 종료되거나 웹 애플리케이션이 새롭게 갱신되면 destroy() 메소드가 실행된다.

서블릿 객체의 service() 메서드

  • HttpServlet의 service 메서드는 템플릿 메서드 패턴으로 구현된다.
  • 클라이언트의 요청이 GET 이라면, doGet(request, response)메소드를 호출한다.
  • 클라이언트의 요청이 POST 라면, doPost(request, response)를 호출한다.
  • PUT, DELETE 요청에 대해서도 대응하는 메서드를 호출한다.

톰캣(Tomcat)과 서블릿

  • 톰캣은 WAS다. WAS의 서블릿 컨테이너는 프로그래머가 구현한 서블릿을 관리한다.
  • 서블릿 컨테이너는 클라이언트가 어떤 요청을 했을 때, 어떤 서블릿을 실행할 것인지 제어한다.
  • 서블릿 컨테이너는 어떤 정보를 바탕으로 어떤 서블릿을 적절히 실행시킬지 알고 있을까?
  • 이에 2가지 방법이 있다.
    • web.xml라는 파일에 서블릿을 등록해준다.
    • Servlet 3.0 spec부터는 web.xml 파일을 사용하지 않고 자바 어노테이션(@WebServlet)을 사용하면 된다.

서블릿 예제

import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ten")
public class TenServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public TenServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        out.println("<h1> 1에서 10까지 출력 </h1>");
        for (int i = 0; i < 10; i++) {
            out.println(i + "<br>");
        }
        out.close();
    }

}
  • 위 코드는 아래 웹 페이지를 동적으로 생성하는 서블릿 클래스다.
  • /ten으로 요청을 하면, 서블릿 컨테이너는 TenServlet 객체를 메모리에 올리고 서비스 메서드를 호출한다. get 요청이므로 위에 작성된 doGet 메서드가 호출되고 아래와 같은 결과를 확인할 수 있다.

2021-04-19 22 04 50

Request, Response 객체이해하기

1_5_4_request_response (1)

  • 클라이언트로부터 요청이 들어오면 WAS는 HttpServletRequest라는 객체와 HttpServletResponse라는 객체를 생성한다.
  • 이 두 객체는 요청 정보에 있는 path로 매핑된 서블릿에게 전달된다. (service 메서드 즉, doGet, doPost 등의 메서드의 인자로 전달된다.)

HttpServletRequest

  • HttpServletRequest 객체에는 클라이언트가 요청하면서 보낸 정보들을 담는다.

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

HttpServletResponse

  • HttpServletResponse 객체에는 클라이언트에게 전송하기 위한 정보들을 담는다.

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

HttpServletRequest 객체에서 헤더정보 가져와보기

@WebServlet(name = "HeaderServlet", value = "/HeaderServlet")
public class HeaderServlet extends HttpServlet {

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");

        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = request.getHeader(headerName);
            out.println(headerName + " : " + headerValue + " <br> ");
        }

        out.println("</body>");
        out.println("</html>");
    }

}

결과

2021-05-02 20 06 49

참고

  • https://www.boostcourse.org/web316/lecture/254273/?isDesc=false

태그: ,

카테고리:

업데이트: