Servlet이란
동적인 웹페이지를 만들기 위해 WebApplication Server에 붙이는 프로그램 중 하나
web.xml -> servlet 설정파일
Servlet Container
Servlet의 생명주기를 관리함
예) Tomcat..
요청이 들어오면
1. Servlet Request / Servlet Response 객체 생성
2. 설정 파일을 참고하여 매핑할 Servlet을 확인
3. 해당 Servlet 인스턴스 존재 유무를 확인하여 없으면 생성한다(init() 메소드 호출)
4. Servlet Container에 스레드를 생성하고, res, req를 인자로 service 실행됨
5. Request, Response 객체를 소멸시키고 끝남!
- Servlet객체는 소멸되지 않는다! Servlet은 싱글톤으로 관리가 되기 때문. ServletContainer에 의해 Servlet의 생명주기가 관리된다. 적절한 시점에 호출하고, 적절한 시점에 소멸시키는 것!
- 여러개의 요청이 온다면 멀티 쓰레드를 이용하여 요청마다 서블릿을 생성!
- Handler의 공통 로직이 매번 중복된다.
Dispatcher Servlet
Spring Web MVC에서 사용하는 Servlet
HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러
클라이언트로부터 어떠한 요청이 오면 서블릿 컨테이너가 요청을 받게됨.
이후 모든 요청을 프론트컨트롤러인 dispatcher servlet이 가장 먼저 받게 된다. 디스패처 서블릿은 Handler공통 로직 작업을 처리 후, 해당 요청을 처리해야 하는 컨트롤러를 찾아서 작업을 위임한다.
SpringWebMVC 가 없을때 -> 매 요청마다 해당하는 Servlet을 생성해줘야함
- Web.xml로 매 URL마다 Servlet을 생성하고 매핑
SpringWebMVC를 적용하고 난 뒤 -> Dispatcher Servlet이라는 한개의 Servlet을 통해서 요청을 관리
- Web.xml의 역할 축소
- 컨트롤러를 구현해두기만 하면, Dispatcher Servlet이 적합한 컨트롤러로 위임을 해주는 구조
정적 자원의 처리
이미지나 HTML/CSS/Javascript 등과 같은 정적 파일에 대한 요청도 다 처리하는 까닭에, 정적자원을 불러오지 못하는 상황이 발생.
1. 정적자원 요청과 애플리케이션 요청을 분리한다.
2. 애플리케이션 요청을 탐색하고 없으면 정적 자원 요청으로 처리
DispatcherServlet이 요청을 처리할 컨트롤러를 먼저 찾고, 찾을 수 없는 경우에 2차적으로 설정된 자원 경로를 탐색하여 자원을 탐색하는 것. 영역을 분리함으로써 효율적으로 리소스 관리를 지원할 뿐 아니라 추후에 확장을 용이하게 해준다는 장점이 있다.
Dispatcher Servlet의 동작과정
Spring으로 인해서 개발자가 집중해야할 범위가 초록색 범위(Handler Logic)로 줄어든 것!
클라이언트의 요청이 Dispatcher Servlet으로 들어왔을때!!
1. 요청 정보를 통해 요청을 위임할 컨트롤러를 찾는다 (Handler Mapping - 요청 Handler)
HandlerMapping의 구현체 - RequestMappingHandlerMapping
: @Controller와 @RequestMapping로 조합된 컨트롤러를 찾아준다.
2. Dispatcher Servlet이 요청을 위임할 Handler Adapter를 찾는다.
3. HandlerAdapter가 컨트롤러로 요청을 위임
: 컨트롤러로 요청을 넘기기전에 공통적인 처리 과정이 필요하다.
: 요청에 매칭되는 인터셉터들도 실행
: @RequestParam, @RequestBody 등으로 파라미터를 준비하는 ArgumentResolver도 실행
4. 비즈니스 로직 처리
개발자들이 작성하는 부분 (초록색)
5. 컨트롤러가 값 반환
비즈니스 로직 처리 후 컨트롤러가 값을 반환한다.
응답 데이터를 사용하는 경우 : ResponseEntity를 반환
응답 페이지를 보여주는 경우 : String으로 View의 이름을 반환
6. Handler Adapter가 반환값을 처리
Controller가 ResponseEntity를 반환하면 HttpEntityMethodProcessor가 MessageConverter를 사용해 응답 객체를 직렬화하고 응답 상태(HttpStatus)를 설정한다. String을 반환하면, View를 반환하기 위한 준비 작업을 처리한다.
7. 핸들러 어댑터가 반환값을 처리
ReturnValueHandler가 후처리한 후에 디스패치 서블릿으로 돌려준다. 컨트롤러 (ResponseEntity) 반환하면, HttpEntityMethodProcessor가 MessageConverter를 사용해, 응답 객체를 직렬화하고 응답 상태 (HttpStatus) 를 설정합니다. 만약 컨트롤러가 View 이름 반환하면 View를 반환하기 위한 준비 작업을 처리한다.
8. 서버의 응답을 클라이언트로 반환함
디스패처 서블릿을 통해 반환되는 응답을 다시 필터들을 거쳐 클라이언트에 반환된다. 이때 응답이 데이터라면 그대로 반환되지만, 응답이 화면이라면 ViewResolver가 적절한 View를 찾아 화면을 내려준다.
Spring으로 웹 요청을 처리한다는 것은
스프링 MVC에서 제공하는 디스패처서블릿과 웹 요청 처리 관련 구현체들을 사용할 수 있음
스프링 컨테이너, 스프링 IoC(Inversion of Control) 를 사용해서 개발을 할 수 있다는 것!
개발자들이 Handler 로직 (요청처리 로직들) 에만 신경을 쓸 수 있도록 하기 위함)
'Server🧤' 카테고리의 다른 글
[Server] Paging, Transaction (0) | 2022.05.18 |
---|---|
[Spring] intelli J와 데이터베이스 연결하기 (0) | 2022.04.28 |
[Linux] 리눅스 환경 구축 (0) | 2022.04.27 |
[MySQL] ERROR 1046 (3D000): No database selected (0) | 2022.04.05 |
[Server] AqueryTool 사용하여 인스타그램 erd 설계 (0) | 2022.04.05 |