• HTTP요청/응답 기본 흐름

    Untitled

    • 스프링은 웹서버로서의 기능(port할당, 진입점관리)을 위해 tomcat을 was로 사용(서블릿 컨테이너 포함)
    • 서블릿컨테이너는 서블릿객체(HttpServletRequest객체, HttpServletResponse객체)를 생성, 초기화, 호출, 종료하는 생명주기 관리
      • 클라이언트에서 HTTP 요청이 서버로 들어오면 서블릿컨테이너에 의해 스레드(자원) 할당
      • 서블릿 컨테이너는 HTTP요청을 HttpServletRequest객체로 변환하고, HttpServletResponse객체를 생성하여 HTTP응답 생성
      • HttpRequest, Response관련 서블릿 객체들은 매 요청마다 생성하여 스레드를 할당하여 작업수행
    • 사용자의 요청은 DispatcherServlet 객체에 의해 요청 URL과 HTTP 메서드(GET, POST 등)을 분석
      • DispatcherServlet은 SpringMVC에서 핵심적인 역할을 수행하는 애플리케이션의 모든 요청을 처리하는 중앙 집중식 컨트롤러
      • DispatcherServlet은 싱글톤으로 생성하여 재사용
      • 경로에 맞는 컨트롤러와 메서드에 사용자의 http요청을 전달
  • 쓰레드(Thread)

    • 쓰레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미(자원)
      • 즉, 실제 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드
      • 여러 사용자의 요청이 동시에 들어올때, 동시처리가 필요하다면 쓰레드를 멀티로 만들어서 사용자마다 할당
      • 즉, 사용자마다 1개의 쓰레드가 생성되고, 할당이 되어야 원활히 프로그램이 실행가능
    • 멀티쓰레드
      • 멀티쓰레드를 생성하고 관리하는 것은 WAS(서블릿컨테이너)

        image.png

      • 멀티쓰레드의 장단점

        • 장점
          • 리소스(CPU, 메모리)가 허용할 때까지 동시요청 처리가능
          • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작
        • 단점
          • 쓰레드는 생성 비용이 매우 비쌈
            • CPU사용량이 많음
            • 고객의 요청이 올때마다 쓰레드를 생성하면, 처리 속도로 인해 응답속도가 늦어짐
          • 컨텍스트 스위칭 비용 발생
            • 1번 스레드가 하나의 코어를 사용하다가, 2번 스레드가 다시 코어를 사용하게 될때 전환의 지연시간이 발생
            • 쓰레드가 많으면 이 비용자체가 굉장히 커짐
          • 쓰레드 생성에 제한이 없다면, 고객 요청이 너무 많을때 하드웨어 임계치를 넘어 서버가 죽을 가능성
        • 쓰레드풀
          • 멀티쓰레드의 단점을 해결하기 위한 WAS의 아키텍처
          • 쓰레드의 사용이 종료되면 쓰레드를 종료시키는 것이 아니라, 쓰레드 풀에 반납하여 재사용
          • Default 쓰레드 개수인 200개를 넘어서는 요청이 올 경우, 요청을 거절하거나 특정숫자만큼 대기하게 설정
            • 실무에서는 적정 쓰레드 풀의 숫자를 찾아 결정
  • 서블릿

    • 서블릿은 request,response객체를 통해 HTTP요청/응답을 쉽게 처리, 조립 해주는 기술

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

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

      Untitled

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

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