스프링 MVC 1 - 서블릿
서블릿
위와같은 HTML Form이 있다고 가정해보자.
회원 이름과 나이를 넣고 전송버튼을 누르면, 회원이 가입되는 폼이다.
이러한 폼이 있을 때,
HTML Form을 POST로 데이터를 저장하려면,
form action="/save" method="post"
그리고 username과 age 값을 넣어서 데이터를 전송한다.
전송을 누르면, 웹브라우저가
요청 HTTP메시지를 만들어준다.
각종 정보를 넣고,
실제 Content Body에는 username=kim&age=20 이라고 데이터를 보내고,
이 Content에 대한 내용은, Content-Type에 x-www-form-urlencoded 방식으로 보내겠다고 표시해서 생성한다.
이러한 방식으로 HTTP메시지를 만들어서 서버에 전송을 한다.
이렇게 했을 때,
만약에 웹 애플리케이션 서버를 밑바닥부터 직접 다 구현해야 한다면 어떻게 해야할까?
우선은 HTTP메시지를 쭉 다 풀어헤쳐야 할 것이다.
- 서버에서 TCP/IP 연결을 대기하도록 코드를 짜놓고, 소켓을 연결한다.
- 그다음, HTTP 요청 메시지를 파싱해서 읽기
- POST 방식, /save URL 인지 인식
- Content-Type확인
- HTTP 메시지 바디 내용 파싱
- username, age 데이터를 사용할 수 있게 파싱
- 저장 프로세스 실행
- 비즈니스 로직 실행
- 데이터베이스에 저장 요청
- HTTP 응답 메시지 생성 시작
- HTTP 시작 라인 생성
- Header 생성
- 메시지 바디에 HTML 생성에서 입력
- TCP/IP에 응답 전달, 소켓 종료
중요한 비즈니스 로직은 회원 이름과 나이를 가지고 데이터베이스에 저장 요청을 하면되는 것이 전부이다.
그런데, 전단계와 후단계가 너무 많다.
그러면, 전세계의 개발자들이 이것을 똑같이 개발하고있기에는 너무 비효율적이다.
그래서 서블릿이라는게 나온다.
서블릿은 어떤 것을 해주냐면,
초록색으로 표시한 것을 제외한 모든 일을 다 지원 해준다.
서블릿을 지원하는 WAS들이 해당 기능을 다 지원해준다.
서블릿은 이렇게 생겼다.
urlPatterns = "/hello" 라고 해놓으면,
웹브라우저에서 서버로 요청이 왔을 때, 해당 서블릿 코드에 있는 service라는 것이 실행된다.
그래서 이렇게 우리는, 클래스를 만들고, HttpServlet을 상속받아서,
애플리케이션 로직만 작성하면 된다.
그리고 service 로직이 호출되면서 파라미터 2개가 들어오는데,
HttpServletRequest, HttpServeltResponse 가 있다.
우리가 HTTP메시지를 직접 파싱하려면 굉장히 귀찮고번거로울 것이다.
그래서 HTTP에 대한 요청 정보를 굉장히 편리하게 사용할 수 있도록 서블릿이 다 만들어준다.
응답정보도 마찬가지다.
그래서 우리는 request객체, response객체를 사용하면 된다.
- urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
- 개발자는 HTTP 스펙을 매우 편리하게 사용
개발자는 HTTP 스펙을 매우 편리하게 사용할 수 있다고는 하나,
기본적인 HTTP스펙은 알고 써야한다.
전체 그림을 살펴보자.
웹 브라우저에서 localhost:8080/hello라고 요청을 하면,
WAS서버에서 어떤 일이 벌어지냐면,
HTTP 요청 메시지를 기반으로 request, response 객체를 새로 만든다. 이때 request객체는 HTTP요청 메시지를 기반으로 생성한다.
그리고 요청 메시지를 기반으로 만든 request객체와, response 객체를 파라미터로 넘기면서,만든 helloServlet이라는 것을 실행해준다.
helloServlet이 끝나고 리턴을 하면,
우리가 파라미터로 넘긴 response객체를 찾아서 이것을 바탕으로 HTTP응답 메시지를 만든다.
그리고 웹브라우저에 응답메시지가 전달이 되는 것이다.
HTTP 요청, 응답 흐름
- HTTP 요청시
- WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
- 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
- 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
서블릿 컨테이너는,
서블릿 객체를 우리가 직접 생성하는게 아니라,
우리는 이런식으로 코드만 만들면,
서블릿(helloServlet)을 WAS안에있는 서블릿 컨테이너가 서블릿 객체를 자동 생성해준다. 호출도 해준다.
그리고 서블릿객체의 생명주기는, WAS가 종료될때 서블릿도 종료된다.
서블릿 컨테이너는 이런식으로 서블릿의 생명주기도 다 관리해준다.
서블릿이 여러개 있으면 서블릿 컨테이너에 서블릿이 여러개가 들어가는 셈이다.
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
- 서블릿 객체는 싱글톤으로 관리
(request객체, response객체는 요청이 올때마다 항상 새로 생성, 이것을 담을 서블릿 객체는 싱글톤으로 관리)- 고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
- 공유 변수 사용 주의
- 서블릿 컨테이너 종료시 함께 종료
- JSP도 서블릿으로 변환 되어서 사용
- 동시 요청을 위한 멀티 쓰레드 처리 지원
'Spring' 카테고리의 다른 글
스프링 MVC 1 - HTML, HTTP API, CSR, SSR (0) | 2022.06.29 |
---|---|
스프링 MVC 1 - 동시 요청 - 멀티 쓰레드 (0) | 2022.06.29 |
스프링 MVC 1 - 웹 서버, 웹 애플리케이션 서버 (0) | 2022.06.23 |
스프링 기본 - 스코프와 프록시 (0) | 2022.06.13 |
스프링 기본 - 스코프와 Provider (0) | 2022.06.13 |
댓글
이 글 공유하기
다른 글
-
스프링 MVC 1 - HTML, HTTP API, CSR, SSR
스프링 MVC 1 - HTML, HTTP API, CSR, SSR
2022.06.29 -
스프링 MVC 1 - 동시 요청 - 멀티 쓰레드
스프링 MVC 1 - 동시 요청 - 멀티 쓰레드
2022.06.29 -
스프링 MVC 1 - 웹 서버, 웹 애플리케이션 서버
스프링 MVC 1 - 웹 서버, 웹 애플리케이션 서버
2022.06.23 -
스프링 기본 - 스코프와 프록시
스프링 기본 - 스코프와 프록시
2022.06.13