개발일기
서블릿 본문
https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1&unitId=71161
학습 페이지
www.inflearn.com
HTML Form 데이터 전송
POST 전송 - 저장
==========================
username : kin age: 20 전송
==========================
<form action= "/save" method="post">
<input type="text" name="username" />
<input type="text" name="age" />
<button type="submit"> 전송 </button>
</form>
url이 /save가 되고 method는 post방식으로 데이터 전송
웹 브라우저가 생성한 요청 HTTP 메시지
=====================================
POST /save HTTP/1.1
Host: localhost:8080
Content-Type : application/x-www-form-urlencoded
username=kim&age=20
=====================================
실제 Content-Body에는 username=kim & age=20으로 데이터를 보낸다. content에 대한 방법에 대한 설명은 aplication/ ~~~~ urlencoded방식으로 데이터를 보내겠다고 하는 것이다.
이렇게 했을 때, 만약에 우리가 웹 애플리케이션 서버를 직접 다 구현해야하는 경우 위에 있는 HTTP 메시지를 쭉 다 풀어헤쳐야한다.
서버에서 처리해야 하는 업무
웹 애플리케이션 서버 직접 구현
- 서버 TCP/IP 연결 대기, 소켓 연결
- HTTP 요청 메시지를 파싱해서 읽기
- POST 방식, /save URL 인지
- Content-Type 확인
- HTTP 메시지 바디 내용 파싱
- username, age 데이터를 사용할 수 있게 파싱
- 저장 프로세스 실행
=================================
- 비즈니스 로직 실행
- 데이터베이스에 저장 요청
==================================
- HTTP 응답 메시지 생성 시작
- HTTP 시작 라인 생성
- Header 생성
- 메시지 바디에 HTML 생성에서 입력
- TCP/IP에 응답 전달, 소켓 종료
웹 브라우저가 생성한 요청 HTTP 메시지 -- 회원 저장
=====================================
POST /save HTTP/1.1
Host: localhost:8080
Content-Type : application/x-www-form-urlencoded
username=kim&age=20
=====================================
서버에서 HTTP 응답 메시지 생성
=====================================
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length:3423
<html>
<body>...</body>
</html>
=====================================
HTTP 메시지가 위에 있는 과정을 거쳐 사용함
기본적으로 서버에서 TCP/IP연결에 대기하도록 코드를 짜놓은다.
HTTP 요청 메시지는 단순 텍스트이다. 단순 텍스트이기 때문에 단순히 다 짜르면 됨 몇글자씩 다 짤라서 파싱을함.
POST방식인지 /save URL을 인지해준다.
content-type을 파싱을해서 읽어들여옴. 그 다음에, /save가 있으니깐 저장 프로세스 실행
그 다음 비즈니스 로직을 실행하여 데이터베이스에 저장을 요청함.
정상적으로 데이터베이스에 저장이 잘되어 있는지 HTML 결과를 웹브라우저에게 전달을 해준다.
HTTP 시작라인 (start-line)을 생성을 하고, Header생성, 메시지 바디에 HTML 직접 다넣고 TCP/IP 응답에 전달해서 소켓을 종료해야한다.
비즈니스로직은 그냥 회원 아이디, 비밀번호를 가지고 데이터베이스에 저장을 요청하는 것이 끝이다. 그런데 그 전 단계, 후 단계가 너무 많다. 전 세계 개발자가 이것을 똑같이 개발하는 것이 너무 비효율적이다. 그래서 서블릿이라는 것이 나온다.
서블릿은 눈에 보이는 =====을 제외한 모든 기능을 지원해준다.
즉, TCP/IP를 요청하고 데이터를 읽어들여오고 웹 브라우저에 HTTP 응답메서드 생성 하는 과정까지 모두다 해준다.
서블릿
특징)
@WebServlet(name="helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
//애플리케이션 로직
}
}
- urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HTTP 요청 정보를 편히라게 사용할 수 있는 HttpServletRequest
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
- 개발자는 HTTP 스펙을 매우 편리하게 사용
urlPattern에다가 /hello라고 하면 localhost:~~/hello 이렇게 붙으면 클라이언트에서 서버로 요청이 왔을 때, 서블릿 코드에 있는 서비스라인이 실행이 된다.
이거를 그냥 다해준다.
class를 만들고 HttpServlet이라는 것만 그냥 상속받으면 된다.
service 함수가 호출되면서 HttpServletRequest, HttpServletResponse가 호출된다. 이 두개가 뭐냐면 HTTP 메시지를 직접 파싱하려면 이 노가다가 굉장히 힘들다. 그래서 HTTP요청 정보를 굉장히 편리하게 사용할 수 있도록 Servlet이라는게 이 요청정보를 다 만들어준다.
우리는 이 Request 객체를 사용하면 된다.
서블릿을 통해서 HTTP 스펙을 매우 손쉽게 사용할 수 있다. 중요한 것은 HTTP 스펙을 어느정도 알아야한다.
기본은 알아야 Request에서 꺼낼 때 이게 꺼내지는 구나, Response에서 Writer를 HTTP를 꺼낼 때 이게 꺼내지는 구나를 알 수 있다.
HTTP 요청 메시지를 기반으로 생성 실행(request, response) 서블릿 컨테이너
웹 브라우저 =======================> (request) ==================================> helloServlet
(response)
웹 애플리케이션
hello world 종료
웹 브라우저 <======================= (reponse) <=================================== helloServlet
Response 객체 정보로 HTTP 응답 생성
was 서버에서 요청 메시지를 기반으로 방금 본 request, response객체를 만들어준다. 우리가 만들어준 helloServlet을 실행해준다. 애가 끝나고 리턴을 하면 우리가 만들었던 Response객체 안을 뒤져가지고 HTTP 응답 메시지를 만들어준다.
그러고 웹 브라우저에 응답 메시지가 그려짐 html 랜더링해서 우리에게 보여줌
서블릿 HTTP 요청, 응답 흐름
- HTTP 요청시
- WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
- 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
- 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
서블릿 컨테이너
웹 애플리케이션 서버
========================================================
|| || ===================================================
|| || || 서블릿 컨테이너 ||
|| || || 생성, 호출, 관리 ||
|| || || helloServlet ||
|| || || saveServlet ||
|| 웹 애플리케이션 서버 || || ||
|| || || ||
|| || || ||
|| || || ||
|| || || ||
|| || || ||
|| || ===================================================
========================================================
was안에는 서블릿 컨테이너라는게 있다. 이 서블릿 객체를 이 서블릿 컨테이너가 자동으로 생성을 해준다.
생명주기도 있다. was가 내려갈 때, 이 서블릿을 같이 종료해준다.
서블릿이 여러개가 있으면 안에 여러개가 들어간다. helloServelt, saveServlet안에 들어감.
서블릿
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
- 서블릿 객체는 싱글톤으로 관리
- 고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
- 공유 변수 사용 주의
- 서블릿 컨테이너 종료시 함께 종료
- JSP도 서블릿으로 변환 되어서 사용
- 동시 요청을 위한 멀티 쓰레드 처리 지원
서블릿 객체는 싱글톤으로 관리된다. 싱글톤은 객체를 하나만 생성하고 공유해서 생성한다. 현재 나의 JVM안에는 하나만 생성되는 것이다. 여러개가 생성되는 것이 아닌 처음에 딱 하나만 생성하고, 모두가 다 공유해서 사용하는 것이다.
이렇게 사용하는 이유는 내가 서버에 요청하는 거랑, 다른 사람이 서버에 요청하는 거랑 데이터가 달라야한다.
request, response 나의 username과 다른 사람의 username은 다르다. 들어가는 데이터도 다 다르다. response,request객체는 그래서 항상 새로 생성된다. 하지만 HelloServelt이라는 객체는 항상 새로 생성될 필요가 없다.
메서드 안에다가 애플리케이션 로직만 생성하면 된다. new해서 새로 생성하는 것은 비효율적이다. 요청이 올때마다 새로 생성하면 의미없이 만들어진다.
내가 접근을 하든, 누군가가 접근을 하든 같은 Servlet로직을 실행한다.
멤버 변수 사용할 때, 주의해야함.
동시에 여러 요청이 있어도 처리 되는 이유가 멀티쓰레드가 제공되기때문이다.
'Spring > (김영한님)스프링 MVC 1편 - 백엔드 웹 개발 핵심기술' 카테고리의 다른 글
Session2. 서블릿 정리및 회고 ( request, response) (2) | 2024.02.27 |
---|---|
자바 백엔드 기술의 역사 (0) | 2023.05.26 |
HTML, HTTP API, CSR, SSR (0) | 2023.05.23 |
스프링 - 동시 요청 멀티스레드 (0) | 2023.05.23 |
웹 서버, 웹 애플리케이션 서버 (0) | 2023.05.04 |