[Spring] DispatcherServlet

Jeini·2023년 5월 23일
0

🍃  Spring

목록 보기
12/33
post-thumbnail

💡 Spring MVC 요청 처리 과정


  1. 클라이언트가 서버에 요청을 하면, front controller인 DispatcherServlet 클래스가 요청을 받는다.

  2. DispatcherServlet 는 프로젝트 파일 내의 servlet-context.xml 파일의 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾아 매핑(mapping)된 컨트롤러가 존재하면 @RequestMapping을 통해 요청을 처리할 메서드로 이동한다.

  3. 컨트롤러는 해당 요청을 처리할 Service(서비스)를 받아 비즈니스로직을 서비스에게 위임한다.

  4. Service(서비스)는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야한다면 DAO에 요청하여 처리를 위임한다.

  5. DAO는 DB정보를 DTO를 통해 받아 서비스에게 전달한다.

  6. 서비스는 전달받은 데이터를 컨트롤러에게 전달한다.

  7. 컨트롤러는 Model(모델) 객체에게 요청에 맞는 View(뷰) 정보를 담아 DispatcherServlet 에게 전송한다.

  8. DispatcherServletViewResolver 에게 전달받은 View정보를 전달한다.
    ViewResolver는 응답할 View에 대한 JSP를 찾아 DispatcherServlet에게 전달한다.

  9. DispatcherServlet 는 응답할 뷰의 Render를 지시하고 뷰는 로직을 처리한다.

  10. DispatcherServlet 는 클라이언트에게 Rendering된 뷰를 응답하며 요청을 마친다.

💡 DispatcherServlet 소스 분석


  1. 기본 전략 초기화
  2. doService()가 doDispatch()를 호출
  3. doDispatch()가 processDispatchResult()를 호출
  4. processDispatchResult()가 render() 호출
  5. 응답 결과를 클라이언트에게 보냄

📎 기본 전략

  • DispatcherServlet이 기본적으로 사용하는 클래스들을 의미

  • 사용자의 요청을 처리하기 위해 협력한 클래스들 그 종류가 여러개가 있다.
    ➡️ 기본적으로 무엇을 쓸껀지가 결정되어 있다. 그 정보가 프로퍼티안에 있다.

  • 우리가 언제든지 바꿀 수도 있다.

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

// LocaleResolver: 지역(한국, 미국 등)에 대한 정보를 처리하는 클래스를AcceptHeaderLocaleResolver로 쓰겠다.
// 요청에 대한 헤더 정보를 가지고 지역 정보를 알아내는 것.
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

// HandlerMapping: HandlerAdapter가 요청이 오면 HandlerMapping에게 어떤 메서드가 처리할 수 있는지 물어본다. 이때, BeanNameUrlHandlerMapping, RequestMappingHandlerMapping 이 둘이 사용된다. (순서가 있다.)
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

// HttpRequestHandlerAdapter: 실제로 요청을 처리할 객체가 꼭 Controller만 있는 것이 아니다. Servlet이 될 수도 있다. 그래서 여러개가 등록이 되어있다.
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

// HandlerExceptionResolver: 예외 처리 담당
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

// RequestToViewNameTranslator: 요청 URL을 가지고 어떤 View를 사용할지 알아내는 역할
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

// ViewResolver: Controller가 반환될 수도 실제 어떤 View인지 알려줌
// InternalResourceViewResolver을 기본 전략으로 쓰고 있다.
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

// FlashMapManager: 데이터를 맵 형태로 저장할 수 있다. 
// 기본적으로 session을 이용하는 SessionFlashMapManager이 기본 전략으로 쓰이고 있다.
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
  • 등호 표시를 구분자로 key랑 value가 연결되어 있다.
  • 이 전략에 실제로 어떤 클래스가 쓰일 지 다 적혀져 있다.

✏️ LoginController를 통해 디버그해서 소스 분석해 보기

  • HandlerAdapter가 요청이 오면 HandlerMapping에게 어떤 메서드가 처리할 수 있는지 RequestMappingHandlerMapping 이 처리해 주고 있다.

✏️ consol창의 Mapped

✔️ mapping 정보에 map 형식으로 등록 저장

  • {[/ex]} 같은 것과 어떤 메서드와 연결되어 있는지 쭉 나온다.

  • @RequestMapping 정보를 읽어서 mapping 정보에 map형식으로 등록을 한다.
    ➡️ "{[/ex]}" : java.lang.String kr.ac.jipark09.ExceptionController.main
    ➡️ "{[/ex2]}" : java.lang.String kr.ac.jipark09.ExceptionController.main2()
    : 이런식으로 연결되어 저장된다.

  • 매핑이 잘못되면 consol창에 나오지 않는다. 매핑이 되지 않으면 404에러가 뜬다.

✏️ HandlerMapping 요청

  • 우리가 만든 Controller의 메서드가 loginForm 메서드의 호출이 되고 결과가 ModelAndView로 만들어져서 온다.

  • 결과를 보여줄 것을 처리해야 되니까 ModelAndView를 가지고 처리를 한다.
    ➡️ 실제로의 처리는 render

  • 에러가 있으면 에러 처리를 하고 에러페이지를 보여준다.

  • 에러가 없으면 render라는 메서드가 그에 대한 처리를 한다.

Reference
: https://fastcampus.co.kr/dev_academy_nks

profile
Fill in my own colorful colors🎨

0개의 댓글