본문 바로가기

Spring Boot/4. SpringMVC part1

2-1. 서블릿(Servlet)

서블릿이란 개발자가 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메세지 요청을 받은 서버측에서는 해야 할 업무가 다음과 같다.


  1. TCP /IP 연결 대기, 소켓연결
  2. HTTP요청 메시지를 파싱해서 읽기
  3. HTTP Method판별(GET인지 POST인지...)
  4. URL판별
  5. HTTP 메세지 바디의 내용 파싱
    • username, age 데이터 파싱
  6. 비즈니스 로직 수행
  7. HTTP 응답 메세지 작성
  8. TCP/IP에 응답 전달, 소켓 종료

HTTP메세지 하나를 받는데에 개발자가 신경써야할 부분이 너무나도 많다는 것을 쉽게 인지 할 수 있을것이다.

하지만, 개발자고 수행하고 싶은 비즈니스로직관련 업무는 6번 단 한가지 밖에 없다.

 

따라서, 앞서 위에서도 말했듯이 서블릿이란 개발자가 HTTP스펙을 편리하게 사용할 수 있게 도와주는 역할을 수행하기 때문에 6번을 제외한 모든 업무를 Servlet이처리해준다.


 

*서블릿을 지원하는 WAS를 사용할 시 개발자가 수행할 업무는 6번 한가지 밖에 없게 된다.

  1. TCP /IP 연결 대기, 소켓연결
  2. HTTP요청 메시지를 파싱해서 읽기
  3. HTTP Method판별(GET인지 POST인지...)
  4. URL판별
  5. HTTP 메세지 바디의 내용 파싱
    • username, age 데이터 파싱
  6. 비즈니스 로직 수행
  7. HTTP 응답 메세지 작성
  8. 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요청, 응답 흐름

HTTP 요청에 대한 WAS처리 수행 순서

  1. Cliet측에서 WAS측으로 HTTP요청메세지를을 보낸다.
  2. WAS는 HTTP요청메세지를 기반으로 Request, Response객체를 생성한다. (HTTP요청시 매번 객체를 생성)
  3. 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객체를 미리 만들어 둔다.
  4. Servlet에서 로직 수행 후 값을 반환한다.
  5. Response객체를 활용하여 HTTP응답 메세지를 만든다.
  6. 웹브라우저에 응답 메세지를 전달한다.

'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