본문 바로가기
Spring

서블릿에 대해 알아보자.

by 매트(Mat) 2022. 7. 14.

서블릿에 대해 알아보자.

먼저 MVC 패턴을 알아보기 전에 서블릿이 무엇인지 간단하게 짚고 넘어가겠습니다.

서블릿

stackoverflow1

서블릿이란 무엇인지 희미하게만 알고있어서 stackoverflow에 검색을 해보았는데 역시나 좋은 글들이 많았다. (사실 이 글만 봐서는 이해하기 어려울수도..)

stackoverflow2

서블릿이란 단순히 특정 HTTP 요청에 대한 응답하는 클래스이다. 기본적으로 서블릿은 웹 애플리케이션에 사용된다. 즉, 서블릿은 동적인 웹페이지를 제공할 수 있도록 도와주는 자바 기반의 자바 웹 프로그래밍 기술이다.

만약에 웹 애플리케이션 서버를 직접 구현한다고 가정해보자. - HTTP 요청 메시지와 HTTP 응답 메시지를 잠깐 살펴보면.

HTTP 요청 메시지

POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

username=chae&age=30

HTTP 응답 메시지

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423

<html>
    <body>...</body>
</html>

클라이언트가 요청할 때 쿼리 파라미터로 요청하든, HTML Form으로 POST를 요청하든, HTTP message body에 데이터를 직접 담아서 요청하든 간에 클라이언트가 요청을 보낸 데이터를 해석해야지 정적인 페이지를 동적으로 변환할 수가 있는 것이다.

데이터를 해석하기 위해서는 클라이언트가 요청을 보낸 HTTP 요청 메시지를 개발자가 직접 하나하나 파싱해서 데이터를 가져와야 한다. (POST방식인지, 요청 url이 뭔지, Content-Type이 뭔지 HTTP message body에 있는 데이터가 뭔지..)

HTML Form으로 POST 요청할 경우에 POST이기 때문에 HTTP Message Body에 데이터를 담는데 이 때 데이터 구조가 쿼리 파라미터와 동일하다.
예) username=chae&age=30

웹 서버(WS)는 애플리케이션 로직이 없는 단순 정적 페이지만 만들 수 있다.
웹 애플리케이션 서버(WAS)는 애플리케이션 로직이 들어가서 정적 페이지 뿐만 아니라 동적 페이지로 변환할 수 있다. - DB 연동 가능

그래서 개발자가 HTTP 요청 메시지를 일일이 하나하나 파싱하지 않고 이러한 것들을 대신 해주는게 바로 서블릿이다. 서블릿은 HTTP 요청 메시지를 편리하게 사용할 수 있도록 대신에 HTTP 요청 메시지를 파싱해주는데 그 파싱된 결과값을 HttpServletRequest 객체에 담아서 제공한다. HTTP 응답 메시지 또한 파싱된 결과 값을 HttpServletResponse 객체에 담아서 제공한다. 그래서 HttpServletRequestHttpServletResponse 객체를 이용해서 애플리케이션 로직을 좀 더 쉽게 구현할 수 있다.

위에서 보았듯이 서블릿은 HTTP 스펙을 편리하게 사용할 수 있게 도와주는 기술이기 때문에 기본적으로 HTTP에 대한 지식(스펙)은 알고 있어야 한다.

servlet1

  1. 클라이언트가 localhost:8080/save에 요청하면 HTTP 요청 메시지를 기반으로 HttpServletRequest, HttpServletResponse 객체를 생성한다.
    1. 요청이 올 때 마다 HttpServletRequest, HttpServletResponse 객체를 새로 생성한다.
  2. Web.xml을 기반으로 클라이언트가 요청한 URL이 어느 서블릿에 대한 요청인지 찾는다.
  3. 해당 서블릿에서 service()를 호출해서 실행해준다.
  4. 실행이 끝난 후 리턴하면 HttpServletResponse 객체 정보를 바탕으로 HTTP 응답 메시지를 생성해서 save OK!라는 응답 결과를 클라이언트로 전달된다.

서블릿 컨테이너

서블릿 컨테이너(Servlet Container)는 서블릿 객체를 자동으로 생성해주고, 호출해주고, WAS가 종료될 때 서블릿도 같이 종료해주는 생명주기까지 모두 관리해준다. 쉽게 말해 서블릿 컨테이너는 서블릿의 라이프 사이클을 관리해준다.

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
  • 서블릿 객체는 싱글톤으로 관리한다. -> 그 이유는 클라이언트의 요청이 올 때 마다 서블릿 객체를 계속 생성해주는 것은 비효율적이기 떄문에 최초 로딩 시점에 서블릿 객체를 생성해두고 공유해서 사용한다.
  • 동시 요청을 위한 멀티 스레드를 지원한다.
    • 서블릿 컨테이너는 요청이 올 때 마다 새로운 스레드를 생성하는데 서블릿을 실행하고나면 이 스레드는 죽게된다. 그래서 원래는 이 스레드를 관리해야 하지만 서블릿 컨테이너는 멀티스레드를 지원하기 때문에 스레드의 안정성에 대해 걱정하지 않아도 된다.

References

댓글