서블릿 등장 배경
웹 클라이언트와 웹서버(또는 WAS)는 HTTP로 통신한다. 요청 메세지로부터 응답 메세지를 만들려면 웹서버는 다음의 처리 과정을 거쳐야 한다.
처리 과정이 복잡하기에 프로그래머는 비즈니스 로직에만 집중할 수 있도록 만들어줄 필요가 있다. 이를 위해 서블릿이 등장했다. 프로그래머는 서블릿 클래스만을 작성해 비즈니스 로직에 집중하고 서블릿을 지원하는 WAS(ex 톰캣)가 위 작업을 대신한다.
서블릿
서블릿이란 클라이언트 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 규현 규칙을 지킨 자바 웹 프로그래밍 기술이다.
- /hello 경로로 요청
- WAS는 요청을 받으면 HTTP 요청 메시지를 기반으로 Request 객체와 HTTP 응답을 위한 Response 객체 생성
- 서블릿 컨테이너의 web.xml 설정에서 요청 url에 해당하는 서블릿을 선택
- 쓰레드에서 선택한 서블릿의 service() 메서드를 호출, 이때 메서드 인자로 Request, Response 객체가 넘겨짐
- service() 메서드에서 HTTP 응답 정보를 Response 객체에 넣고 반환
- WAS는 Response 객체로부터 HTTP 응답 정보를 생성해 응답
서블릿 컨테이너
서블릿을 지원하는 WAS 안에는 서블릿 컨테이너가 있는데 서블릿 컨테이너 속 서블릿 객체가 관리 된다.
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명 주기를 관리한다.
- 서블릿 객체는 싱글톤으로 관리된다. 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다. 요청에 대해 동일한 서블릿 객체에 접근하므로 서블릿 객체는 thread-safe이어야 한다.
- 멀티 쓰레드 처리가 지원된다.
- JSP도 서블릿으로 변환된다.
동시 요청을 처리하기 위한 멀티 스레드
동시 요청을 처리하기 위해 WAS는 요청마다 대기 중인 쓰레드가 요청에 대응하는 서블릿 객체의 service() 메서드를 호출한다. 따라서 요청이 동시에 들어와도 처리할 수 있다.
쓰레드를 효과적으로 사용하기 위해 쓰레드 풀을 사용한다. 쓰레드 풀의 사용이유는 아래 링크를 살펴보자.
https://gunjoon.tistory.com/118
[OS - 5] 스레드
스레드 예전의 프로세스는 단일 실행 스레드(single thread of execution)을 가졌다면 지금의 프로세스는 여러 개의 스레드를 가져 여러 개의 실행 흐름을 가지게 되었다. 예전에는 프로세스가 여러 개
gunjoon.tistory.com
WAS의 주요 튜닝 포인트는 쓰레드 풀의 최대 쓰레드이다. 이 값을 낮게 설정할경우 서버 리소스는 여유롭지만 많은 요청이 들어올시 응답이 지연될수 있다. 반대로 높게 설정할경우 응답 지연을 해결할 수 있지만 서버 리소스가 고갈되어 서버가 다운될 수 있다. 때문에 자신의 시스템에 맞는 최대 쓰레드 개수를 찾기위해 성능 테스트가 필요하다.
Servlet 인터페이스
Servlet 인터페이스는 아래와 같다.
package jakarta.servlet;
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public void destroy();
}
- init() : 서블릿이 생성된 후 초기화 작업을 진행하는 메서드
- service() : 비즈니스 로직 수행 메서드
- destory() : 서블릿 해제 (자원의 해제, 데이터 저장, 마무리 작업)
웹에서 사용되는 서블릿은 HttpServlet이다. HttpServlet은 Servlet 인터페이스를 구현한 GenericServlet를 상속 받은 추상 클래스이다.
public abstract class HttpServlet extends GenericServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String msg = lStrings.getString("http.method_get_not_supported");
sendMethodNotAllowed(req, resp, msg);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String msg = lStrings.getString("http.method_post_not_supported");
sendMethodNotAllowed(req, resp, msg);
}
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String msg = lStrings.getString("http.method_put_not_supported");
sendMethodNotAllowed(req, resp, msg);
}
protected void doDelete(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
String msg = lStrings.getString("http.method_delete_not_supported");
sendMethodNotAllowed(req, resp, msg);
}
}
아래의 메서드 중 필요한 메서드를 오버라이딩 해야 한다. service 메서드는 따로 오버라이딩 해줄 필요가 없다. HttpServlet의 service 메서드가 HTTP 요청을 보고, doMethod 꼴의 메서드를 실행하기 때문이다.
- doGet() : HTTP GET 요청에 대한 처리
- doPost() : HTTP POST 요청에 대한 처리
- doPut() : HTTP PUT 요청에 대한 처리
- doDelete() : HTTP DELETE 요청에 대한 처리
- init() : 서블릿 초기화
- destory() : 서블릿 해제
실습
사전 준비) 톰캣 9.0.71 버전 설치
프로젝트 구성
- IDE : Intellj
- JDK 8
- Maven Project (archetype-webapp)
- 톰캣 서버와 연동
- Dependency (javax.servlet-api)
HelloServlet 생성
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
public void init() {
System.out.println("init...");
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse rep) throws ServletException, IOException {
System.out.println("doGet here");
rep.setContentType("text/html");
PrintWriter out = rep.getWriter();
out.println("<html><body>Hello Servlet!</body></html>");
}
@Override
public void destroy() {
System.out.println("destroy!");
}
}
web.xml에 HelloServlet 등록
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
![](https://blog.kakaocdn.net/dn/bWWS8L/btrZoqlDZNx/H5MKmbMH90Q7yn4yh4kYz0/img.png)
참고)
저는 서블릿이 처음이라니까요?
안녕하세요! 조엘입니다! "처음이라니까요" 시리즈 여덟 번째 토픽은 서블릿입니다. 🎯🎯 자바로 웹 개발을 하다 보면 서블릿이라는 말을 많이 듣게 되는데요! 스프링에서는 "디스패처 서블릿
joel-dev.site
IntelliJ JAVA 웹 개발 환경 구축 방법 (+ Maven, Tomcat)
IntelliJ JAVA 웹 개발 환경 구축 방법 (+ Maven, Tomcat) 이전에 작성했던 [JAVA 웹 개발환경] IntelliJ + Tomcat 연동 방법 글을 생각보다 많은 분들이 봐주셔서 이번 글에서 내용을 보강하려고 합니다. IntelliJ
atoz-develop.tistory.com
https://diaryofgreen.tistory.com/112
Tomcat :: web.xml의 load-on-startup
1. 정의web.xml 에서 서블릿 설정시 들어가는 숫자해당 서블릿의 init() 메소드가 호출되는 시기와 순서를 정하는 것 보통의 서블릿은 반드시 '해당 서블릿'에 최초 요청이 들어올 때에만 해당 인스
diaryofgreen.tistory.com
https://catsbi.oopy.io/defe6c4d-1d74-4a5e-8349-ff9077dda184
웹 애플리케이션 이해
목차
catsbi.oopy.io
'Spring > Spring MVC' 카테고리의 다른 글
스프링 검증 (1) (0) | 2023.03.27 |
---|---|
스프링 MVC 기본 기능 (0) | 2023.02.28 |
스프링 MVC (2) (0) | 2023.02.21 |
스프링 MVC (1) (0) | 2023.02.17 |
Spring Boot에서 Servlet 사용하기 (0) | 2023.02.16 |