Network

Servlet

kmkunk 2021. 10. 20. 18:22

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

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 Process

① 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편 - 백엔드 웹 개발 핵심 기술』