서블릿은 웹 서버의 요청을 받아서 동적인 페이지를 생성하고 반환하는 과정을 편리하게 처리할 수 있도록 지원하는 자바 웹 프로그래밍 기술이다.
What Is a Servlet?
A servlet is a Java programming language class that is used to extend the capabilities of servers that host applications accessed by means of a request-response programming model. Although servlets can respond to any type of request, they are commonly used to extend the applications hosted by web servers. For such applications, Java Servlet technology defines HTTP-specific servlet classes.
The javax.servlet and javax.servlet.http packages provide interfaces and classes for writing servlets. All servlets must implement the Servlet interface, which defines life-cycle methods. When implementing a generic service, you can use or extend the GenericServlet class provided with the Java Servlet API. The HttpServlet class provides methods, such as doGet and doPost, for handling HTTP-specific services.
This chapter focuses on writing servlets that generate responses to HTTP requests.
서블릿은 인터페이스를 구현해서 사용해야 하는데 init(), destroy()와 같이 생명 주기를 관리하는 메서드가 있으며 일반적으로 기본적인 틀을 제공하는 GenericServlet을 상속 받아서 service() 추상 메서드를 구현한다.
HTTP 요청과 관련된 메소드를 제공하는 HttpServlet을 보면 GenericServlet을 상속 받아서 service()를 Override했다.
서블릿은 독립적으로 생성, 실행될 수 없고 관리를 해주는 무언가가 있어야 하는데 이러한 역할을 해주는 것이 서블릿 컨테이너이며 대표적으로 서블릿 컨테이너를 구현한 WAS(Web Application Server)인 톰캣이 있다. (Tomcat = Web Server + Servlet Container)
서블릿 컨테이너는 서블릿의 생명 주기를 관리하고 웹서버와 소켓으로 통신하며 요청을 받아서 응답을 전달하는 다양한 기능을 제공한다.
멀티 스레드를 지원하는 서블릿 컨테이너는 요청을 받으면 스레드를 생성하고 Request, Response 객체를 생성해서 서블릿의 service()를 실행한뒤 스레드를 종료시킨다. 이때, 서블릿은 요청 시마다 생성 되지 않고 최초 1회만 생성이 된다.
위에 사진은 GenericServlet의 service() 추상 메서드로 HttpServlet은 GenericServlet을 상속 받아서 이 service() 메서드를 Http 요청을 처리하도록 구현하였다.
정리를 하면 서블릿 컨테이너가 웹 서버로부터 요청을 받으면 Request, Response 객체를 생성하고 매핑된 서블릿을 찾아서 service 메서드를 실행한다.
ServletWebServerFactory servletWebServerFactory = new TomcatServletWebServerFactory();
WebServer webServer = servletWebServerFactory.getWebServer(servletContext -> {
servletContext.addServlet("myServlet", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//...
}
}).addMapping("/hello");
});
이렇게 각각의 서블릿에 url 매핑을 하면 중복되는 코드도 많고 비즈니스 로직과 뷰 로직이 결합 되어 있어서 유지보수 하기 어려운 코드가 된다. 그래서 MVC 패턴과 스프링MVC가 나오게 되는데 모든 요청을 받아서 공통 로직을 처리하고 컨트롤러의 핸들러 역할을 하는 프론트 컨트롤러인 DispatcherServlet이 있다.
처음 스프링 부트로 개발을 하면 기본적으로 톰캣이 내장되어 있고 서블릿 관련 설정을 지원해주기 때문에 이해가 부족한 경우가 많은데 코드 몽키가 되지 않으려면 잘 알아야 될 것 같다..!
다음에는 DispatcherServlet에 대해 정리를 해야겠다.
[참고]
인프런 김영한님, 토비님 강의
망나니개발자님 블로그
'Spring' 카테고리의 다른 글
[Spring] 트랜잭션과 @Transacional 사용하는 이유 (0) | 2023.05.02 |
---|---|
[Spring] 댓글 더보기 기능 구현 (LIMIT) (0) | 2023.04.28 |
[Spring Boot] 스프링 시큐리티 OAuth2.0 로그인 (KAKAO) (0) | 2023.02.15 |
[Spring Rest Docs] Rest API 문서화 (0) | 2023.01.28 |
[Spring] 템플릿 메서드 패턴, 팩토리 메서드 패턴 (0) | 2022.10.04 |