Servlet
1. Servlet
- Dynamic web page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다.
- 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해준다.
- 웹 브라우저에서 서버에 request를 하면 요청에 맞는 동작을 수행하고 웹 브라우저에 HTTP 형식으로 response한다.
1.1 Servlet 주요 특징
- 클라이언트의 request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트이다.
- HTML을 사용하여 response한다.
- Java의 스레드를 이용하여 동작한다.
- MVC pattern에서 Controller로 이용된다.
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
- UDP보다 속도가 느리다.
- HTML 변경 시 servlet을 다시 컴파일해야 하는 단점이 있다.
2. Servlet Container
- 서블릿을 담고 관리해주는 컨테이너이다. 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리한다.
- 클라이언트에서 request를 하면 HttpServletRequest, HttpServletResponse 객체를 생성해서 POST, GET 등 여부에 따라 동적인 페이지를 생성하여 response한다.
2.1 HttpServletRequest, HttpServletResponse
- HttpServletRequest: HTTP request 정보를 서블릿에게 전달하기 위한 목적으로 사용하며 Header 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽는 메서드와 Body의 Stream을 읽는 메서드를 가지고 있다.
- HttpServletResponse: 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체를 서블릿에게 전달하고, 이 객체를 활용하여 Content-Type, response 코드, response 메시지 등을 전송한다.
2.2 Servlet Contatiner 주요 기능
종류 | 설명 |
생명주기 관리 | - 서블릿의 생명주기를 관리한다. - 서블릿 컨테이너가 기동되는 순간 서블릿 클래스를 로딩해서 인스턴스화하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 찾아서 동작한다. - 서블릿의 생명이 다하는 순간 가비지 컬렉션을 통해 메모리에서 제거한다. |
통신 지원 | - 클라이언트의 request를 받아주고 response를 보낼 수 있도록 web server와 socket을 만들어 통신을 해준다. socket을 만들고, 특정 port를 리스닝하고, 연결 요청이 들어오면 스트림을 생성해서 요청 받는 일을 대신 해주는 것이다. - listen, accept 등의 기능을 API로 제공하기 때문에 복잡한 과정을 생략할 수 있다. |
멀티스레딩 관리 | - 서블릿 컨테이너는 해당 서블릿의 요청이 들어오면 스레드를 생성해서 작업을 수행한다. - 동시에 여러 요청이 들어와도 멀티스레딩 환경으로 동시다발적인 작업을 관리할 수 있다. - 이렇게 한 번에 메모리에 올라간 스레드는 다시 생성할 필요가 없기 때문에 메모리 관리에 효율적이다. |
선언적인 보안관리 | 보안 관련 기능을 제공하기 때문에, 서블릿 또는 자바 클래스 안에 보안 관련된 메서드를 구현하지 않아도 된다. |
3. Servlet 동작 과정
① Servlet Request, Servlet Response 객체를 생성한다.
② 설정 파일을 참고하여 매핑할 Servlet을 확인한다.
③ 해당 서블릿 인스턴스 존재의 유무를 확인하여 없으면 init() 메서드를 호출하여 생성한다.
④ Servlet Container에 스레드를 생성하고 service를 실행한다.
⑤ 응답을 처리했으면 distory() 메서드를 실행하여 Servlet Request, Servlet Response 객체를 소멸시킨다.
3.1 Servlet Method
종류 | 설명 |
init() | - 서블릿이 처음으로 요청될 때 초기화를 하는 메서드이다. - 초기화된 서블릿은 싱글톤으로 관리되어, 이후 해당 서블릿 클래스가 다시 호출되면 초기화가 일어나는 것이 아니라 기존 서블릿 클래스가 호출된다. |
service() | - 서블릿 컨테이너가 요청을 받고 응답을 내려줄 때 필요한 서블릿의 service 메서드이다. - Servlet Interface를 구현한 HttpServlet 클래스의 doGet, doPost 같은 메서드들이 호출된다. |
destroy() | - 더 이상 사용되지 않는 서블릿 클래스는 주기적으로 서블릿 컨테이너가 destroy() 메서드를 호출하여 제거한다. - 제거된 클래스를 다시 사용하기 위해서는 init()을 다시 해야한다. |
// Servlet 예시
@WebServlet(name = "ServletTest", urlPatterns = "/hello")
public class ServletTest extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init method 호출");
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("HTTP GET 요청 처리를 위한 doGet service method 호출");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("HTTP POST 요청 처리를 위한 doPost service method 호출");
}
@Override
public void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("HTTP PUT 요청 처리를 위한 doPut service method 호출");
}
@Override
public void doDelete(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("HTTP DELETE 요청 처리를 위한 doDelete service method 호출");
}
@Override
public void destroy() {
System.out.println("destroy method 호출");
}
}
참고
- https://coding-factory.tistory.com/742
- https://jojoldu.tistory.com/28
- https://jusungpark.tistory.com/15
- 『스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술』