• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • HttpHandler 생성과 동작
        2024년 03월 15일
        • starryeye
        • 작성자
        • 2024.03.15.:16

         

         

        이전 포스팅에서 Netty 서버를 구동하기 위해 ..

        Spring 은 project reactor 의 Netty, Reactor Netty 를 의존하고

         

        Reactor Netty 의 HttpServer 를 생성하기 위해 HttpServer 에는

        HttpServer::handler 메서드가 있는데

        Spring 에서는 HttpServer::handler 의 파라미터(함수형 인터페이스)에 사용할 

        구현체를 ReactorHttpHandlerAdapter 로 만들어 놨다.

         

        그리고..

        Spring 의 ReactorHttpHandlerAdapter 를 생성하기 위해서는

        HttpHandler 를 주입받아야 하는 것을 확인했다.

         

         

        이번 포스팅에서는

        HttpHandler 의 생성과 동작에 대해 다뤄보겠다.

         

        HttpHandler 생성

        HttpHandler 는 HttpHandlerAutoConfiguration 에 의해 빈으로 등록된다.

        WebHttpHandlerBuilder 에 applicationContext 메서드를 이용하여 생성된다.

         

        applicationContext 메서드는 이전 포스팅에서 본 것 처럼

        빈으로 등록된 WebHandler, WebFilter, WebExceptionHandler 등을

        WebHttpHandlerBuilder 가 가지도록 한다.

         

         

        WebHttpHandlerBuilder 의 build 메서드이다.

        여기서 눈여겨 보고 싶은건 391, 392, 394 line 이다.

         

        394 line..

        HttpWebHandlerAdapter 는 생성자 파라미터(WebHandler) 를 받아 HttpHandler 를 생성하는 클래스이다.

        HttpWebHandlerAdapter 는 WebHandler, HttpHandler 를 모두 구현한다.

        HttpWebHandlerAdapter::handle 에서는..

        HttpHandler::handle 의 파라미터인 ServerHttpRequest, ServerHttpResponse 를 가지고

        WebHandler::handle 의 파라미터인 ServerWebExchange 을 만들고 있으며,

        HttpWebHandlerAdapter 의 생성자에서 주입된 WebHandler 의 handle 메서드를 호출한다.

         

        즉, 앞서 WebHttpHandlerBuilder::applicationContext 에서 받은 WebHandler 를 이용해

        HttpHandler 를 생성한 것이다.

         

        참고

        HttpWebHandlerAdapter::handle 은..

        Spring 과 Reactor Netty 의 adapter 인 ReactorHttpHandlerAdapter::apply 가 호출한다.

         

         

        391 line..

        WebHandler, WebFilter 를 이용해 FilteringWebHandler 를 생성하는데,

        FilteringWebHandler 는 내부에서 DefaultWebFilterChain 을 생성한다.

        FilteringWebHandler 는 WebHandler 를 구현한 클래스이며,

        handle 메서드 호출 시, DefaultWebFilterChain 의 filter 메서드를 호출한다.

         

        DefaultWebFilterChain 의 filter 메서드이다.

        ServerWebExchange 를 파라미터로 받고

        처리할 WebFilter 가 존재하면 WebFilter 를 수행하고

        더이상 없으면 WebHandler 를 수행한다.

         

         

        392 line..

        ExceptionHandlingWebHandler 를 생성할 때도 WebHandler, WebExceptionHandler 가 필요한데

        동작 방식은 FilteringWebHandler 와 비슷하다.

         

        ExceptionHandlingWebHandler 의 handle 메서드이다.

        ServerWebExchange 를 파라미터로 받고

        try-catch 로 감싸서 WebHandler 의 handle 메서드를 호출해주고

        예외가 발생하면 ExceptionHandler 가 처리하도록 publisher 를 만들어 수행시키고 있다.

         

         

        391, 392, 394 line 정리

        Decorator pattern 이 쓰였다.

        원본 WebHandler 를 ConcreteComponent 로 하고

        ExceptionHandlingWebHandler, FilteringWebHandler 는 Decorator 가 된다.

        WebExceptionHandler, WebFilter 는

        각각 ExceptionHandlingWebHandler, FilteringWebHandler 에 의해

        WebExceptionHandler -> WebFilter -> WebHandler 순으로 수행하도록 구현되어있는 것이다.

        최종 decorated 는 HttpWebHandlerAdapter 에 의해 HttpHandler 가 되고 리턴된다.

         

         

        동작 방식을 구체적으로 알아보았다.

        사용자가 사용할 땐..

        Spring 에서는 front handler 의 역할을 하는 WebHandler 인 DispatcherHandler 를 

        이미 등록하고 있으므로, 사용자는 DispatcherHandler 와 같이 묶여서 동작할

        WebExceptionHandler, WebFilter 를 빈으로 등록만 해주면 된다...

        'Spring Reactive Stack > Webflux' 카테고리의 다른 글

        WebHandler 와 Spring  (0) 2024.03.10
        WebHandler 와 Netty 의 관계  (0) 2024.03.09
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바