Servlet 이란?
- JAVA를 사용하여 웹을 만들기 위해 필요한 프로그래밍 기술이다. (Servlet 클래스의 구현 규칙을 지켜야합니다.)
- 또한, 이러한 웹 기반의 요청에 대해 동적으로 처리해주는 역할로서 Server Side에서 작동(WAS)한다.
- 웹 페이지 개발 시, 웹 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현하여 조화롭게 사용한다.
- 클라이언트가 요청을 하면 그 결과를 다시 전송해주는 프로그램이다.
- HttpServlet이라는 Java의 클래스를 상속받는다.
Servlet Life Cycle
1. Servlet 객체 생성 (1회)
2. init() 호출 (1회)
3. service(), doGet(), doPost() 호출 (요청시 매번)
4. destory() 호출 (1회)
Servlet Container 란?
- 서블릿은 요청을 받거나 내보낼 때 자신이 알아서 하는 것이 아니라, 서블릿을 실행시키는 주체인 서블릿 컨테이너(Servlet Container)라는 것을 이용한다.
- 즉, Servlet을 관리한다는 Servlet Container는 어떤 요청에 대해 어떤 Servlet을 실행할 것인지 제어하는 것이다.
- 더 쉽게 말하면, 서블릿이 웹서버와 통신할 수 있도록 해준다.
- 대표적인 서블릿 컨테이너는 바로 Tomcat (EJB의 기능을 지원해주지 않는 Tomcat을 완전한 WAS라고 보기엔 무리가 있다고 생각합니다.)이 있다.
Servlet 동작 과정
그렇다면, Dispatcher Servlet 이란 무엇일가?
- 클라이언트가 요청을 주면, Servlet Container가 요청을 받는데, 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는Front Controller라는 것을 Spring에서 정의하였고, 이를 Dispatcher Servlet이라고 한다.
- 기존에는 모든 Servlet에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야 했지만, dispatcher servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주면서 작업의 효율을 높였다.
(Spring Boot에서는 @SpringBootApplication 이라는 어노테이션으로 web.xml 파일을 대체할 수 있습니다.)
- 즉, Controller로 향하는 모든 웹 요청의 진입점으로써 웹 요청을 처리하고 결과 데이터를 Client에게 응답한다.
- Dispatcher Servlet을 이용한다는 것은 스프링에서 제공하는 MVC 모델을 이용하겠다는 것으로 생각하면 된다.
Dispathcer Servlet 동작 과정
ex)
1. user/register에 요청이 오면, Spring의 Dispatcher Servlet으로 전달됩니다.
2. Dispatcher Servlet이 UserContoller에 있는 registerUser()과 같은 적절한 Method를 찾습니다.
3. 해당 Method는 @PostMapping('/user/register'), @RequestMapping(value="/user/register", Request.Method=Post) 와 같은 어노테이션(Handler Mapping)을 보고 찾습니다.
4. 함수를 수행하고나서 적절한 view를 Response 합니다.
Web 동작 과정
출처 : taes-k.github.io/2020/02/16/servlet-container-spring-container/
Server start 단계
- Web server init
- Root WebApplicationContext 로딩
- Web server start
Client 호출 단계
- Client -> Web server 으로 request 보냄
- 동적 Web server -> Servlet container로 전달
- Servlet container 쓰레드 생성
- DispatcherServlet init (서블릿 생성 안되어 있을경우)
- 생성된 쓰레드에서 DispatcherServlet service() 메서드 호출
- HandlerMapping을 통해 매핑 컨트롤러 조회
- HandlerAdapter를 통해 매핑 컨트롤러에 request 전달
- 개발자가 구현한 Controller -> Service -> Repository … 동작
'Java' 카테고리의 다른 글
[Java/Spring] 빌드 관리 도구 Maven vs Gradle (0) | 2022.11.09 |
---|---|
[Java] Java Bean (0) | 2022.11.03 |
[Java] String StringBuffer StringBuilder 비교 (1) | 2022.10.15 |
[Java] 정규 표현식 - String.replaceAll() 메서드를 활용한 String 치환 (0) | 2022.07.27 |