ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서블릿 동작원리
    Java 2021. 9. 16. 19:59

    서블릿

    서블릿의 동작원리

    1. 클라이언트가 URL 요청 시 HttpRequest 객체를 생성하여 서블릿 컨테이너로 전송한다.
    2. HttpRequest 요청을 받은 서블릿 컨테이너는 HttpServletReq, HttpServletResp 두 객체를 생성한다.
    3. 사용자의 요청을 분석하여 맞는 서블릿을 생성 후(init() ) 요청을 전송한다.
      • 이 과정은 Web.xml 에서 직접 서블릿 매핑 설정을 해주어야 한다.
      • Spring boot 에서는 자동으로 매핑 설정을 해줌
    4. 해당 서블릿에서 service() 메소드를 호출하며, GET / POST 요청에 맞는 doGet(), doPost() 메소드를 호출한다.
    5. 개발자가 잘 처리해서 만든 동적페이지를 HttpServletResponse 담아 클라이언트 요청에 응답한다.
    6. 응답이 끝난뒤 HttpServletRequest, HttpServletResponse 객체를 소멸시킨다.
    서블릿은 요청을 처리하기 까지 서블릿 컨테이너의 도움을 받게 되는데, 여기서 서블릿 컨테이너는 사용자의 요청을 처리하기 위하여
    서블릿 내부에 존재하고 있는 스레드풀에서 스레드를 꺼내어 해당 스레드로 요청을 처리하고 다시 스레드를 스레드 풀로 반납한다.
    이 과정에서 서블릿 컨테이너는 최초에 한번만 init() 메서드를 통해 초기화가 이루어지며, 애플리케이션이 종료 될 시 그때 반납된다.

    서블릿 동작 매핑 설정

    <servlet>
        <servlet-name>jiw</servlet-name>
        <servlet-class>com.abc.def</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>jiw</servlet-name>
        <url-pattern>/member</url-pattern>
    </servlet-mapping>
    
    @WebServlet("/어떤")
    public class 어떤Serlvlet

    서블릿 컨테이너는

    1. 웹 애플리케이션 서버중 HTTP 요청을 받아 처리하는 역할을 하고 있으며 웹 프레임워크에서 서블릿 컨테이너 위에서 동작하는 서블릿, 필터, 이벤트리스너 등을 구현할 수 있는 기능을 제공한다. 따라서 사용자가 프레임워크로 작성한 웹 애플리케이션은 결국 서블릿 컨테이너 위에서 동작한다.

      • 서블릿 컨테이너는의 종류로는 톰캣, 제티 등이 있다.
    2. 서블릿 컨테이너로 프로그램을 실행하려면 표준 Servlet(interface)를 구현해야 한다.

      • 사용자 정의 서블릿은 컨네이너 등록 후 생성, 호출, 반환이 이루어진다.
    3. 보통 HttpServlet 추상 클래스를 상속받아 Servlet을 구현한다.

      • 지원하는 메서드로 get, post, put, head, delete, option, trace 가 있다.

        // 추상 클래스인 HttpServlet 클래스를 상속받아 사용 (HttpServlet -> GenericServlet(추상 클래스) -> (Servlet(인터페이스))
        public class ServletClass extends HttpServlet {
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
        
        @Override
        protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
        
        @Override
        protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
        
        @Override
        protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //HEAD 메서드는 GET 메서드의 요청과 동일한 응답을 요구하지만, 응답 본문을 포함하지 않습니다.
        }
        
        @Override
        protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //OPTIONS 메서드는 목적 리소스의 통신을 설정하는 데 쓰입니다.
        }
        
        @Override
        protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //TRACE 메서드는 목적 리소스의 경로를 따라 메시지 loop-back 테스트를 합니다
        }
        

    }

    
    ### Spring boot
    - spring boot 는 내장 톰캣을 가지고 있어 실행될 때 내부적으로 서블릿 컨테이너인 내장 톰캣이 실행된다.
    - 스프링 부트에서 프로그래머가 구현하는 서블릿은 DispatcherServlet 이며, FrontController 역할을 한다.
    
    #### DispatcherServlet
    스프링 MVC는 모든 요청을 받아 실제 작업은 다른 컴포넌트로 위임하는 DispatcherSerlvet을 두어 프론트 컨트롤러 패턴으로 디자인 되어있다. (스프링과 스프링 부트는 서로 다른 초기화 과정을 거친다.)

    스프링 : ServletContainer 의 생명 주기에 Listner로 연결
    부트 : 스프링 설정을 이용하여 애플리케이션에 내장된 ServletContainer를 실행

    
    #### DispatcherServlet 구조
    
    
    1. 구조로는 계층 구조를 가지고 있으며, Servlet WebApplicationContext, Root WebApplicationContext 로 나뉘어져 있다. 2. 많은 응용 프로그램에서는 단일의 WebApplicationContext를 가지고 있으며, 이는 사용하기 충분하고 간단하다.(?) 단일 Root WebApplicationContext는 여러 DispatcherSerlvet(또는 다른 Servlet)들이 공유할 수 있는 컨텍스트 계층 구조를 가지고 있으며, - 각각의 고유한 하위 WebApplicationContext를 구성하고 있다. 여기서 말하는 ApplicationContext 개념은 Spirng ApplicationContext 개념을 말하는거 같다. 3. Root WebApplicationContext 에는 여러 일반적 Serlvet 인스턴스에서 공유하는 데이터 저장소 및 서비스와 같은 빈을 포함하고 있다. ```@Repository, @Service 친구들``` - 다른 DispatcherServlet이 등록되면 Service, Repository 등을 공유해서 사용할 수 있는단 의미인거 같다.

    'Java' 카테고리의 다른 글

    이펙티브 자바 [2] 객체 생성과 파괴  (0) 2022.11.08
    냄새와 휴리스틱  (0) 2021.07.22
    메서드 메모리관리  (0) 2020.06.17
    jMeter 사용하기 (with MQTT)  (2) 2020.05.12
    소켓 통신 I/O Stream  (0) 2020.05.07

    댓글

Designed by Tistory.