서블릿(Servlet)

What is Servlet?

옛날에 처음 해당 내용을 공부했을 때는 내용 자체가 어렵고 상세한 이해를 하지 않은 상태에서도 개발하는데 큰 문제가 없어서 신경을 못 썻던 기억이 있다. 하지만 프로젝트를 진행할 때 Controller나 interceptor 같은 곳에서 자주 HttpServletRequest나 HttpServletReponse를 사용하게 되었는데 해당 기술에 대해 매우 궁금해졌고 다시 공부하고 싶어졌다. 어떤 기술인지 한번 알아보자

서블릿(Servlet)이란?

서블릿(Servlet)이란 동적인 웹페이지를 생성하기 위한 자바 기반의 웹 프로그래밍 기술이다.

만약 클라이언트쪽에서 회원 저장이라는 요청을 했을 때 웹 애플리케이션 서버(WAS)를 직접 구현하게 되면 이 아래의 과정(연결, 파싱, 확인, 실행, 생성 등)을 개발자가 직접 다 구현해야되는데 반복적이고 비효율적인 작업이다. 하지만 서블릿을 지원하는 WAS를 사용하게 되면 우리는 간단하게 핵심 비즈니스 로직만 작성하면 된다.

img

아래처럼 특정 URL(/hello)이 호출되면 서블릿 코드가 실행되는데 HttpServletRequest를 이용하여 요청 정보를 편리하게 사용하거나 HttpServletResponse를 이용하여 응답 정보를 편리하게 제공할 수 있다. 이처럼 서블릿을 사용하면 개발자는 HTTP 스펙을 매우 편리하게 사용가능하다.

img

서블릿 HTTP 요청, 응답 흐름

img

  1. 클라이언트에서 HTTP 요청 시 WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다.
  2. Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
  3. Response 객체에 HTTP 응답 정보를 편리하게 입력
  4. WAS는 Reponse 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성

서블릿 컨테이너(Servlet Container)란?

img

서블릿 컨테이너란 서블릿을 담고 관리해주는 컨테이너로 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다. 서블릿 컨테이너의 역활을 보자면

  • 웹 서버와의 통신 지원
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
  • 서블릿 객체는 싱글톤으로 관리
  • 동시 요청을 위한 멀티 쓰레드 처리 지원

동시 요청 - 멀티 쓰레드

추가적으로 동시 요청 - 멀티 쓰레드에 대해 알아보자

쓰레드(Thread)

쓰레드는 애플리케이션 코드를 하나하나 순차적으로 실행한다. 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행되는데 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다. 쓰레드는 한번에 하나의 코드 라인만 수행하는데 동시 처리가 필요하면 쓰레드를 추가로 생성해야 한다.

단일 요청 - 쓰레드 하나 사용

하나의 쓰레드가 클라이언트 쪽에서 요청이 들어오면 아래처럼 쓰레드가 할당이 되어 servlet을 호출하고 응답한다. 하지만 만약에 다중으로 요청이 들어오게 된다면 하나의 요청이 끝날때 까지 다른 요청은 기다리게 된다.

img

img

요청 마다 쓰레드 생성

클라이언트쪽에서 요청이 올 때마다 쓰레드를 생성하는 방법으로 앞의 요청이 지연이 되어도 다른 요청에 지장이 없다.

img

  • 장점
    • 동시 요청 처리 가능
    • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드 정상 동작
  • 단점
    • 쓰레드 생성 비용은 매우 비싸고 응답 속도가 늦어짐
    • 컨텍스트 스위칭 비용이 발생
    • 쓰레드 생성에 제한이 없다. -> 고객 요청이 너무 많아지면 서버가 죽어버림

쓰레드 풀

요청 마다 쓰레드 생성의 단점을 보완한 방식으로 필요한 쓰레드를 쓰레드 풀에 미리 생성하여 보관한다. 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용하고 사용을 종료하면 쓰레드 풀에 반납한다. 만약 모두 사용중이여서 쓰레드 풀에 쓰레드가 없으면 기다리는 요청은 거절하거나 특정 숫자만큼 대기시킬 수 있다.

쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용을 절약할 수 있고, 응답 속도도 빠르다. 그리고 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리 가능하다.

img


참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

*틀린 부분이 있으면 언제든지 말씀해 주시면 공부해서 수정하겠습니다.


© 2022. All rights reserved.

Powered by 애송이