• 서블릿
    • 서블릿은 request,response객체를 쉽게 조립, 완성하도록 해주는 java의 기술(클래스)

    • 만약 개발자가 이를 직접 개발해야 한다면 의미있는 비즈니스 로직 외에 너무 많은 개발 로드

      • 그래서 서블릿이 등장하고, 핵심에서 벗어난 개발로드를 서블릿이 간편하게 처리
      • 이후 등장한 Controller는 내부적으로 서블릿 기능을 사용하여 사용자 요청을 더 간편하게 처리
    • 서블릿을 통한 사용자 요청 처리

      Untitled

      • urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
      • HTTP 요청/응답 정보를 쉽게 사용할 수 있는 HttpServletRequest와 HttpServletResponse 객체 생성
        • HttpServletRequest객체
          • ServletRequest인터페이스 상속
          • 클라이언트 요청 데이터에 접근하는 메서드를 제공
          • 사용자의 http 요청 header, body 등을 담고 있는 객체
        • HttpServletResponse객체
          • ServletResponse상속
          • 해당객체에 응답값에 필요한 값만 세팅해주면 http스펙에 맞게 서블릿이 간편히 사용자에게 응답값 전달
    • WebServlet와 Controller의 차이

      • webservlet 어노테이션
        • class단위로만 url을 지정해야 함
        • 기존의 url 맵핑은 web.xml을 사용하여 별도 매핑 파일을 만들어야 했으나, servlet 3.0이후부터는 어노테이션으로 대체 가능
      • Controller
        • 클래스 뿐만아니라, 메서드 단위로도 url지정가능
        • Spring MVC에서의 모든 요청은 Servlet에 매핑하고 있으므로, 서블릿 기술은 Controller의 근간이고, Controller는 더 많은 편의를 제공
      • 서블릿(Servlet) 기술은 코드상에서 사용하는 방식만 달라졌을 뿐 Spring MVC 및 RESTful API 서비스를 개발하는 데 중요한 근간이 되는 기술
    • 서블릿컨테이너

      Untitled

      • 서블릿 컨테이너는 서블릿객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
        • 정적 리소스는 Webserver에서 처리하고, WebApplicationServer(웹애플리케이션서버)에서 동적 리소스 처리
        • 스프링부트는 tomcat프로그램을 was로 사용하고, 이 was는 서블릿 컨테이너 역할 수행하고 있다고 볼수 있음
      • DispatcherServlet
        • SpringMVC에서 핵심적인 역할을 수행하는 애플리케이션의 모든 요청을 처리하는 중앙 집중식 컨트롤러
        • DispatcherServlet은 싱글톤으로 생성하여 재사용
        • DispatcherServlet은 웹 요청을 받을때 요청정보를 담은 HttpServletRequest와 HttpServletResponse 객체를 생성
        • HttpRequest, Response관련 서블릿 객체들은 매 요청마다 생성하여 스레드를 할당하여 작업수행
        • 이후 작업은 Handler에 위임하여 비즈니스 로직 처리를 완료한뒤 response객체를 사용자에게 return
  • 쓰레드(Thread)
    • 쓰레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미(자원)
      • 즉, 실제 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드
      • 그래서, 여러 사용자의 요청이 동시에 들어올때, 동시처리가 필요하다면 쓰레드를 멀티로 만들어서 사용자마다 할당되어야함
      • 즉, 사용자마다 1개의 쓰레드가 생성되고, 할당이 되어야 원활히 프로그램이 실행가능
    • 쓰레드의 역할
      • 생성된 쓰레드가 request, response객체를 처리
    • 멀티쓰레드
      • 멀티쓰레드를 생성하고 관리하는 것은 WAS(서블릿컨테이너)
      • 멀티쓰레드의 장단점
        • 장점
          • 동시 요청을 처리
          • 리소스(CPU, 메모리)가 허용할 때까지 처리가능
          • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작
        • 단점
          • 쓰레드는 생성 비용이 매우 비쌈
            • CPU사용량이 많음
            • 고객의 요청이 올때마다 쓰레드를 생성하면, 처리 속도로 인해 응답속도가 늦어짐
          • 컨텍스트 스위칭 비용 발생
            • 1번 스레드가 하나의 코어를 사용하다가, 2번 스레드가 다시 코어를 사용하게 될때 전환의 지연시간이 발생
            • 쓰레드가 많으면 이 비용자체가 굉장히 커짐
          • 쓰레드 생성에 제한이 없다면, 고객 요청이 너무 많을때 하드웨어 임계치를 넘어 서버가 죽을 가능성
        • 쓰레드풀
          • 멀티쓰레드의 단점을 해결하기 위한 WAS의 아키텍처
          • 쓰레드의 사용이 종료되면 쓰레드를 종료시키는 것이 아니라, 쓰레드 풀에 반납하여 재사용
          • Default 쓰레드 개수인 200개를 넘어서는 요청이 올 경우, 요청을 거절하거나 특정숫자만큼 대기하게 설정
            • 실무에서는 적정 쓰레드 풀의 숫자를 찾아 결정