서블릿(Servlet)
서블릿이란?
- 웹 애플리케이션을 만드는데 사용하는 기술이다
- 클래스와 인터페이스를 제공하는 인터페이스다
- 서블릿을 만들기 위해 구현되어야 하는 인터페이스다
- 서버의 요청을 수용하고 요청에 대한 응답하는 클래스다.
- 동적 웹 페이지를 생성하기 위해 서버에 배포된 웹 컴포넌트이다
웹-클라이언트 구조
서블릿을 이해하기 전에 클라이언트와 웹 서버가 어떻게 요청과 응답을 주고 받는지 알아야한다.
- 클라이언트가 웹 서버로 HTTP 요청을 보낸다
- 서버는 컨테이너에 있는 서블릿으로 요청에 대한 서비스를 수행한다
- 응답을 만들고 HTTP 응답을 클라이언트에게 보낸다.
서블릿 동작 방식
- 사용자가 웹 서버에 HTTP 요청을 보낸다.
- 웹 서버는 웹 컨테이너(서블릿 컨테이너)로 요청을 포워딩 시킨다.
- 웹 컨테이너는 Servlet이 컨테이너에 있는지 확인하고, 없으면 서블릿을 새로 생성한다.
- 컨테이너는 또한 요청과 응답을 위한 HttpServletRequest, HttpServletResponse객체를 생성하여 서블릿으로 전달한다.
- 서블릿에서 service()를 호출하여 doGet() 혹은 doPost()를 실행한다.
- service가 완료되면 응답(HttpServletResponse)를 반환한다.
- 웹 컨테이너는 HTTP 형식에 맞게 응답값을 바꾸어 웹 서버로 보낸다
- 웹 서버는 요청한 클라이언트에게 HTTP 응답값을 보낸다.
서블릿의 생명주기
- 클라이언트의 요청이 들어오면 서블릿이 메모리에 있는지 확인한다. 없을 경우 init()를 호출하여 메모리에 적재한다. 실행 중 서블릿이 변경될 경우, 기존 서블릿을 파괴하고 init()으로 새로운 내용을 다시 메모리에 적재한다.
- init() 이후 클라이언트 요청에 따라 service() 메소드를 통해 응답이 doGet() 혹은 doPost()로 분기된다. 서블릿 컨테이너에서 생성한 HttpServletRequest, HttpServletResponse 객체가 제공된다.
- 컨테이너가 서블릿에 종료 요청을 하면 destroy() 메소드가 호출된다. 한번만 실행되며 종료시 처리해야하는 것은 destroy()로 오버라이딩 하면 된다.
서블릿 컨테이너/웹 컨테이너
웹 컨테이너는 서블릿 컨테이너라고도 한다. Java EE 환경에서 제공하고 있다. 클라이언트는 단순히 웹 서버에 정적인 요소 뿐만 아니라 데이터베이스 등을 참조하는 동적인 정보도 요구한다.
서블릿 컨테이너는 이러한 요청에 대해 서블릿을 생성하고 요청에 대한 객체(HttpServletRequest)와 응답(HttpServletResponse)를 생성하는 역할을 한다. 또한 서블릿이 종료되면 객체를 제거하는 역할도 하는 서블릿 관리를 담당한다.
CGI(Common Gateway Interface)
CGI는 웹서버와 프로그램간의 교환 방식이다. 웹 서버가 HTTP 요청 정보를 외부 프로그램에 전달하여 요청을 처리할 수 있게 한다. 각 요청에 대해서는 새로운 프로세스가 할당되어 처리하게 된다.
CGI의 단점은 다음과 같다
- 클라이언트 수가 증가하면 응답을 보내는 데 많은 시간이 걸린다
- 각 요청에 대해 제한된 수의 프로세스를 사용한다.
- C, C++, Perl과 같은 플랫폼 종속 언어를 사용한다.
서블릿의 이점
서블릿을 사용하면 CGI에 비해 더 좋은 이점이 있다. 웹 컨테이너가 다수의 요청을 처리하기 위해 서블릿으로 보내느 서블릿을 만든다. 스레드는 프로세스로 실행하는 것보다 더 적은 자원을 사용하기 때문에 경량화 및 커뮤니케이션 비용이 적다.
- 성능 향상: 프로세스가 아닌 스레드 기반 요청을 사용
- 이식성: Java언어를 사용 (OS에 구애받지 않음)
- 견고함: JVM은 서블릿을 관리하기 때문에 메무리 누수에 대해 걱정할 필요가 없다
- 보안: Java언어를 사용
참고
[Learn Servlet Tutorial - javatpoint](https://www.javatpoint.com/servlet-tutorial)
[[JSP\] 서블릿(Servlet)이란? - MangKyu's Diary (tistory.com)](https://mangkyu.tistory.com/14)
[Understanding Java Servlet Architecture | by Kewal Kothari | codeburst](https://codeburst.io/understanding-java-servlet-architecture-b74f5ea64bf4)
'웹 개발' 카테고리의 다른 글
리액티브 프로그래밍(Reactive Programming) (0) | 2021.04.01 |
---|---|
블로킹(Blocking)과 논블로킹(NonBlocking) 그리고 동기(Synchronous)와 비동기(Asynchronous) (0) | 2021.03.27 |
[Apache MPM] Prefork, Worker, Event (0) | 2021.03.25 |
아파치에 대한 설정 Httpd.conf (0) | 2021.03.25 |
오라클 쿼리 힌트 (0) | 2021.03.14 |