[Spring] 서블릿(Servlet), 쓰레드 풀(Thread pool)

김현수·2024년 5월 8일
0
post-thumbnail

웹 동작 흐름

서블릿에 대해서 알기 전에 웹 동작 흐름에 대해서 알고 가자.

클라이언트가 HTTP 형식으로 Web Server로 요청을 보내면 웹 서버는 이 요청을 풀어 HTML, CSS, JS를 처리해 준다. 애플리케이션 로직과 같은 동적인 처리가 필요하면 Web Server는 WAS에게 요청을 보낸다. WAS는 요청을 받아서 애플리케이션 로직을 처리하고 Web Server로 응답을 넘겨주고 Web Server는 클라이언트의 요청에 대한 응답을 넘겨준다.

WAS는 동적기능을 포함하여 웹서버 기능을 포함하고 있어서 웹서버 없이 클라이언트, WAS 만으로 시스템 구성이 가능하다. 하지만 이렇게 된다면 WAS가 너무 많은 역할을 담당하여 서버에 과부하가 올 확률이 높다. 따라서 웹서버와 WAS를 같이 쓰는 웹 시스템 구성이 제일 많이 선호된다.

이 과정에서 클라이언트가 보내는 요청을 웹 서버가 읽어들이는데 사용 되는 것이 서블릿이다.

서블릿(Servlet)


웹 어플리케이션 서버를 우리가 직접 구현해야 한다면 우리는 다음과 같은 업무를 모두 처리해야 한다.

  • 서버 TCP/IP 대기, 소켓 연결
  • HTTP 요청 메시지를 파싱해서 읽기
  • POST 방식, /save URL 인지
  • Content-Type 확인
  • HTTP 메시지 바디 내용 파싱
  • 저장 프로세스 실행
  • 비즈니스 로직 실행
  • HTTP 응답 메시지 생성 시작
  • TCP/IP에 응답 전달, 소캣 종료

사실 여기서 제일 중요한 로직은 username과 age를 가져와 회원을 저장하는 것이지만 이것을 수행하기 전에 해야하는 단계들이 너무 많다. 이를 해결하고자 의미있는 비즈니스 로직을 제외한 모든 작업들을 지원해 주는 것이 서블릿이다.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response){
 //애플리케이션 로직
 }
}
  • HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
  • HTTP 응답 정보를 편리하게 사용할 수 있는 HttpServletResponse

이를 활용하여 개발자는 HTTP 스펙을 편리하게 사용한다.

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 하며 서블릿을 자동으로 생성해주고 호출하며 생성주기까지 관리해 준다.
  • 서블릿 객체는 고객의 요청마다 일일이 대응할 필요가 없기에 재사용을 위해서 싱글톤으로 관리한다. 그렇기 때문에 공유변수 사용을 주의해야 한다.
  • 그리고 동시 요청을 위한 멀티 쓰레드 처리를 지원하는데 멀티 쓰레드에 관해서 더 알아보자.

멀티 쓰레드

  • 서블릿 객체는 쓰레드가 호출한다. 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드 이다. 자바 main 메서드를 실행하면 main이라는 이름의 쓰레드가 실행되어 코드를 순차적으로 실행한다. 따라서 쓰레드가 없다면 자바 애플리케이션 실행은 불가능하다.
  • 쓰레드는 한번에 하나의 코드 라인만 수행하여 동시처리가 필요하면 쓰레드를 추가로 생성해야 한다. 많은 요청에 응답하기 위해서는 요청마다 쓰레드를 생성할 수 있지만 생성비용도 비싸고 Context Switching 비용이 발생하고 쓰레드 생성에 제한이 없어서 너무 많이 생성되어 서버가 죽을 수도 있다.

❓ Context Switching:
CPU/코어에서 실행 중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것

쓰레드 풀

  • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리하는 개념으로 요청마다 쓰레드를 생성하는 단점을 보완한다.
  • 쓰레드가 필요하면 쓰레드 풀에서 미리 만들어진 쓰레드를 사용하고 다쓰면 다시 반납한다. 만약 쓰레드가 모두 사용중이면 쓰레드 사용 요청을 거절하거나 대기하도록 설정할 수 있다.
  • 생성 종료 비용이 절약되고 응답시간이 빠르다는 점과 너무 많은 요청이 있어도 기존요청을 안전하게 처리할 수 있다는 장점을 가지고 있다.

    WAS를 사용할때 주요 튜닝 포인트는 쓰레드 풀에서 설정하는 최대 쓰레드 수이다. 이를 너무 높게 설정하면 서버가 다운될 수 있고 너무 낮게 설정하면 클라이언트 응답 지연이 많아진다. 따라서 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라서 쓰레드들 적정하게 맞춰야 한다.

0개의 댓글