서블릿이란 개발자가 HTTP스펙을 편리하게 사용할 수 있게 도와주는 역할을 수행한다.
예를들어 HTML의 FORM데이터 전송시
<form action="/edit" method="post">
<input type="text" name="username"/>
<input type="text" name="age"/>
<button type="submit">전송</button>
</form>
아래와 같은 HTTP스펙이 전달된다.
POST/edit HTTP/1.1 Host:127.0.0.1 Content-Type: application/x-www-form-urlencoded username=kang&age=32 |
HTTP메세지 요청을 받은 서버측에서는 해야 할 업무가 다음과 같다.
- TCP /IP 연결 대기, 소켓연결
- HTTP요청 메시지를 파싱해서 읽기
- HTTP Method판별(GET인지 POST인지...)
- URL판별
- HTTP 메세지 바디의 내용 파싱
- username, age 데이터 파싱
- 비즈니스 로직 수행
- HTTP 응답 메세지 작성
- TCP/IP에 응답 전달, 소켓 종료
HTTP메세지 하나를 받는데에 개발자가 신경써야할 부분이 너무나도 많다는 것을 쉽게 인지 할 수 있을것이다.
하지만, 개발자고 수행하고 싶은 비즈니스로직관련 업무는 6번 단 한가지 밖에 없다.
따라서, 앞서 위에서도 말했듯이 서블릿이란 개발자가 HTTP스펙을 편리하게 사용할 수 있게 도와주는 역할을 수행하기 때문에 6번을 제외한 모든 업무를 Servlet이처리해준다.
*서블릿을 지원하는 WAS를 사용할 시 개발자가 수행할 업무는 6번 한가지 밖에 없게 된다.
TCP /IP 연결 대기, 소켓연결HTTP요청 메시지를 파싱해서 읽기HTTP Method판별(GET인지 POST인지...)URL판별HTTP 메세지 바디의 내용 파싱username, age 데이터 파싱
- 비즈니스 로직 수행
HTTP 응답 메세지 작성TCP/IP에 응답 전달, 소켓 종료
* Spring에서 활용할 수 있는 Servlet 예시는 다음과 같다.
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
//비즈니스 로직 수행
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("message = " + messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData. = " + helloData.getUserName());
System.out.println("helloData.getAge() = " + helloData.getAge());
resp.getWriter().write("ok");
}
}
* 코드 설명
- HttpServlet을 상속받은 RequestBodyJsonServlet클래스가 HttpServlet클래스의 service메소드를 OverRide한다.
- service메소드에 비즈니스 로직을 수행시킬 코드를 작성하면 된다.
- @WebServlet 어노테이션
- name 속성은 servlet의 이름을 명명해주는 곳이며 유니크해야 한다.
- urlPatterns 속성은 HTTP요청 경로를 명명해 주는 곳이며 유니크해야 한다.
- service메소드에서 parameter로 HttpServletRequest와 HttpServletResponse를 받을 수 있다
- HttpServletRequest : HTTP요청 정보를 편하게 parsing하고 사용할 수 있게 해준다.
- HttpServletResponse : Http응답 정보를 보다 편하게 client에 제공할수 있는 기능을 해준다.
* 서블릿과 HTTP요청, 응답 흐름
- Cliet측에서 WAS측으로 HTTP요청메세지를을 보낸다.
- WAS는 HTTP요청메세지를 기반으로 Request, Response객체를 생성한다. (HTTP요청시 매번 객체를 생성)
- Servlet Container에서 만들어진 Servlet을 호출한다.
- Servlet Container란
- WAS 내부에 Servlet Container가 존재 한다.
- Servlet Container는 Servlet객체를 자동으로 생성해주며, Servlet객체를 호출도 해준다.
- WAS가 종료될때 Servlet Container가 Servlet들을 다같이 종료해준다 (Servlet 생명주기 관리)
- Tomcat과 같이 Servlet을 지원하는 WAS를 Servlet Container라고 한다.
- Servlet Container는 모든 Servlet객체를 싱글톤으로 관리한다.
- 싱글톤으로 관리하기 때문에 Servlet객체를 하나만 만들어놓고 모든 요청에 대해 공유하여 사용하여, 같은 요청에 대해 Servlet을 재사용한다.
- 싱글톤으로 구성되어 있기 때문에 공유변수 사용에 주의하여하 한다.
- 동시요청을 위한 멀티쓰레드 처리를 지원하다. (2-2게시물에 좀더 자세히 작성하겠다.)
- but, Http 요청시 생성되는 Request, Response객체는 매 요청마다 새로운 객체를 만든다.
- Servlet Container가 최초 로딩 시점에 애플리케이션 내의 모든 Servlet객체를 미리 만들어 둔다.
- Servlet Container란
- Servlet에서 로직 수행 후 값을 반환한다.
- Response객체를 활용하여 HTTP응답 메세지를 만든다.
- 웹브라우저에 응답 메세지를 전달한다.
'Spring Boot > 4. SpringMVC part1' 카테고리의 다른 글
4. MVC패턴 (0) | 2021.06.01 |
---|---|
2-3. CSR , SSR (0) | 2021.06.01 |
2-2 Web 동시요청, 멀티쓰레드 (0) | 2021.06.01 |
1. Web Application 이란? (0) | 2021.06.01 |
0. 개요 (0) | 2021.06.01 |