가정
- POST 방식으로 Form 데이터를 전송한다고 가정한다.
이때 서버에서 처리해야 할 업무는 다음과 같다
- TCP/IP 연결 대기, 소켓 연결 (3-Way Handshaking)
- HTTP 요청 메시지를 파싱해서 읽기
- POST 방식, /save URL 인지
- Content-Type 확인
- HTTP 메세지 바디 내용 파싱 -> username, age 데이터를 사용할 수 있도록 파싱
- 저장 프로세스 실행
- 비즈니스 로직 실행 -> 데이터베이스에 저장요청
- HTTP 응답 메세지 생성 시작 -> HTTP 시작 라인, 헤더 생성 및 메세지 바디에 HTML 생성해서 입력
- TCP/IP에 응답 전달, 소켓 종료
위 항목들 중에서 비즈니스 로직 실행파트만 의미있는 비즈니스 로직이고 그 외는 모두 처리과정임.
서블릿을 지원하는 WAS를 사용하면 개발자는 비즈니스 로직에만 집중할 수 있고 그 외 여타 처리과정은 모두 서블릿이 처리해줌.
서블릿의 특징
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response){
//애플리케이션 로직
}
}
다음과 같은 코드가 있다고 가정하자
urlPatterns(/hello)의 경우 www.example.com/hello 처럼 뒤에 /hello가 따라오는 url이 호출될 경우 서블릿 코드가 실행됨
이때 HTTP 요청/응답 정보를 편리하게 사용할 수 있도록 서블릿은 객체를 생성하여 이를 관리할 수 있도록 보조하는데
요청정보를 다룰때는 HttpServletRequest 객체
응답정보를 다룰때는 HttpServletResponse 객체
각각 크게 두 가지를 사용함으로써 HTTP 스펙을 편리하게 다룰 수 있음
서블릿 객체는 다음과 같은 방식으로 호출되며 사용됨.
링크 요청이 들어오면 내부 WAS에 의해 HTTP 메세지를 기반으로
request 객체가 생성되고 생성된 request 값은 helloServlet 객체로 전달됨.
helloServlet은 들어온 요청을 토대로 비즈니스 로직을 수행하고 response 객체 정보를 통해 HTTP 응답을 생성함
따라서 helloServlet은 각각 요청과 응답에 관한
HttpServletRequest, HttpServletResponse 두가지 타입의 객체를 argument로 받아와야 함.
톰캣 WAS와 스프링 WAS의 차이
-> 모든 스프링 컨테이너는 WAS에 해당하지만, 모든 WAS가 스프링 컨테이너에 해당하는 것은 아님.
https://www.inflearn.com/questions/667363/서블릿-컨테이너-was-차이
서블릿 요청 흐름
- HTTP 요청 시
1) WAS는 Request, Response 객체를 새로 만들고 서블릿 객체 호출(Argument로 넘김)
2) 개발자는 Request 객체에서 HTTP 요청정보를 꺼내서 사용하고 Response에 응답할 정보 입력
-> 물론 그 와중에 비즈니스 로직이 수행될 수 있음 (요청 -> 가공 -> 응답)
3) WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보 생성
서블릿 객체를 직접 생성하는 것이 아니고, WAS의 Container에 의해 자동생성되고 호출되며 생명주기가 관리되는 것임
서블릿 객체를 직접 생성하는 것이 아님!!
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 전체를 관리한다.
- 서블릿 객체는 싱글톤으로 관리된다.
-> 고객의 요청이 올때마다 객체를 계속 생성하게 되면 비효율적이다
Because, Response/Request 객체는 모든 시도마다 다 다른데 애플리케이션 로직이 같기 때문이다
그렇기 때문에 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.
모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
싱글톤 특성상 공유변수 사용에 주의해야한다 -> 잘못하면 로그인했는데 다른 사용자 정보 보이고 난리남.
서블릿 컨테이너가 종료되면 서블릿도 함께 동시에 종료된다.
- JSP도 서블릿으로 변환되어서 사용함.
- 동시요청 처리를 위한 멀티스레딩도 지원함.
'스프링 공부 (인프런 김영한 선생님) > 스프링 MVC 1편' 카테고리의 다른 글
[스프링 웹 MVC 1편] 6. HTTP 요청 데이터 (0) | 2023.05.20 |
---|---|
[스프링 웹 MVC 1편] 5. HttpServletRequest - 개요/기본사용법 (0) | 2023.05.19 |
[스프링 웹 MVC 1편] 4. Hello 서블릿 (0) | 2023.05.17 |
[스프링 웹 MVC 1편] 3. 동시요청 - 멀티스레드 (0) | 2023.05.17 |
[스프링 웹 MVC 1편] 1. 웹 서버, 웹 애플리케이션 서버 (0) | 2023.05.16 |