자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램이다.
쉽게 말해 클라이언트가 서버에 요청을 보낼 때와 응답을 받을때 필요한 HTTP 작업을 도와주는 프로그램
HttpServlet 클래스를 확장하고, doGet, doPost 등을 오버라이딩해 요청을 처리
예시
예를 들어form action="/save" method = "post"> <input type = "text" name="username" /> <input type = "text" name="password" /> <button type = "submit">전송</button> </form>위의 코드를 클라이언트가 HTTP Request를 보내면 웹 브라우저는
POST /save HTTP/1.1 Host: localhost:8080 Content-Type: application/x-www-form-urlencoded라는 요청 HTTP를 생성한다.
그리고 서버는 웹브라우저가 만든 요청 메시지를 다음과 같은 과정으로 처리
- 서버 TCP/IP 연결 대기, 소켓 연결
- HTTP 요청 메시지를 파싱해서 읽기
- POST 방식, /save URL 인지
- Content-Type 확인
- HTTP 메시지 바디 내용 파싱
- 저장 프로세스 실행
- 비즈니스 로직 실행 → 데이터베이스에 저장 요청
- HTTP 응답 메시지 생성
- TCP/IP에 응답 전달, 소켓 종료
하지만 우리는 그동안 로직만 구현하였지 위의 내용은 구현하지 않았다. 바로 서블릿이 대신 처리해 주기 때문
서블릿은 추상 클래스 HttpServlet을 extend 해서 생성
HttpServlet doc 이 문서를 보는것을 추천한다. 메서드 종류를 보면 직관적이라 이해가 갈것이다.
이 HttpServlet에는 생명주기 관리를 위한 init(), service(), destory()메서드가 있고, 각 메서드의 요청을 처리하기 위한 doGet(), doPost(), doPut(), doDelete() 등의 메서드가 있다.
서블릿을 관리하는 서블릿 컨테이너가 service 메서드를 호출하면 내부 로직에 따라 알맞은 메서드로 연결지어 처리한다.
사용자가 URL을 클릭하면 HTTP Request를 서블릿 컨테이너로 전송한다.
HTTP Request를 전달 받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
web.xml에는 어떤 URL에 어떤 서블릿 컨테이너에 mapping할지 쓰여있고 이에 따라 서블릿으로 이를 전달해준다. @WebServlet어노테이션을 이용해서도 매핑을 할 수 있다.
해당 서블릿에서 service 메서드를 호출하고 클라이언트의 요청 종류(Get,Post..)에 따라 doGet, doPost ... 를 호출한다.
doGet, doPost ... 메서드는 동적으로 페이지를 생성한 후 HttpServletResponse 에 응답을 보낸다.
응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
역활
1. 웹 서버와의 통신지원
- 서블릿과 웹서버가 쉽게 통신할 수 있게 해준다.
2.서블릿 생명주기 관리
- 서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다.
- 요청이 들어왔을 때 서블릿이 로드되어있지 않으면, init() 메서드를 호출하여 서블릿을 인스턴스화 한다.
- 그리고 서블릿의 service()를 호출하여 처리한다.
- 이후에 서블릿이 더이상 요청을 받지 않을 때 destroy() 메서드를 호출하여 서블릿을 제거한다.
3.멀티쓰레드 지원 및 관리
- 서블릿 컨테이너에서는 쓰레드를 만들어 서블릿 객체를 호출하도록 한다.
- 서블릿 컨테이너는 여러 클라이언트가 서버에 요청을 보내게 되면 여러개의 쓰레드를 생성하고 각 쓰레드는 서블릿 객체를 호출하여 작업을 처리한다.
- 하지만 모든 요청마다 쓰레드를 생성하게 되면 동시 요청은 처리할 수는 있지만 쓰레드 생성 비용과 쓰레드의 컨텍스트 스위칭 비용이 발생할 수 있다.
그리고 너무 많은 요청이 들어오면 쓰레드를 무한정 생성해야 하기 때문에 CPU의 한계를 넘어서서 서버가 다운될 수 있는 상황까지 초래하게 된다.- 그래서 WAS는 아래처럼 쓰레드 풀이라는 개념을 사용한다.
쓰레드 풀은 처음에 일정한 수의 쓰레드를 미리 생성해놓고 클라이언트의 요청이 오면 쓰레드 풀 안에 있는 쓰레드를 할당하고 요청을 처리하고 나면 해당 쓰레드를 다시 반납 받는다.
https://velog.io/@on5949/Spring-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A7%81Spring-%EC%84%9C%EB%B8%94%EB%A6%BF-%ED%95%84%ED%84%B0Filter-%EC%B4%9D%EC%A0%95%EB%A6%AC#%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%98-%EC%83%9D%EC%84%B1