BackEnd 학습/Spring Framework

Spring(스프링) - 스프링MVC 구조이해

잉아당 2023. 6. 16. 15:53
728x90

스프링 MVC 전체 구조

  • DispatcherServlet
    • 프론트 컨트롤러 패턴으로 구현
    • 스프링 MVC의 핵심
    • HttpServlet을 상속
    • 서블릿으로 등록하면서 모든 경로에 대해서 매핑
      • urlPatterns=”/”
  • 요청 흐름
    • 서블릿이 호출되면 HttpServlet이 제공하는 service() 메서드 호출
    • 스프링MVC는 DispatcherServlet의 부모인 FrameworkServlet에서 service() 메서드를 오버라이드 해 둠
    • FrameworkServlet.service()를 시작으로 여러 메서드가 호출되면서 DispatcherServlet.doDispatch()가 호출 됨
  • 동작 순서
    • 핸들러 조회
      • 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회
    • 핸들러 어댑터 조회
      • 핸들러를 실행할 수 있는 핸들러 어댑터 조회
    • 핸들러 어댑터 실행
      • 핸들러 어댑터 실행
    • 핸들러 실행
      • 핸들러 어댑터가 실제 핸들러 실행
    • ModelAndView 반환
      • 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환
    • viewResolver 실행
      • 뷰 리졸버를 찾고 실행
    • view 반환
      • 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고 렌더링 역할을 담당하는 뷰 객체를 반환
    • 뷰 렌더링
      • 뷰를 통해서 뷰를 렌더링
  • 주요 인터페이스 목록
    • 핸들러 매핑
    • 핸들러 어댑터
    • 뷰 리졸버

핸들러 매핑과 핸들러 어댑터

  • 과거 버전의 스프링에서는 Controller 인터페이스를 제공 했음
  • HandlerMapping(핸들러 매핑)
    • 핸들러 매핑에서 컨트롤러를 찾을 수 있어야 함
    • ex)스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요
  • HandlerAdapter(핸들러 어댑터)
    • 핸들러 매핑을 통ㅎ애서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요
    • ex) Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 함
  • Controller 인터페이스 호출 순서
    • 핸들러 매핑으로 핸들러 조회
      • HandlerMapping을 순서대로 실행해서 핸들러 찾음
      • 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 BeanNameUrlHandlerMapping 가 실행에 성공하고 핸들러인 OldController를 반환
    • 핸들러 어댑터 조회
      • HandlerAdapter의 supports()를 순서대로 호출
      • SimpleControllerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상이 됨
    • 핸들러 어댑터 실행
      • 디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨줌
      • SimpleControllerHandlerAdapter는 핸들러인 OldController를 내부에서 실행하고 그 결과를 반환
  • HttpRequestHandler 인터페이스 호출 순서
    • 핸들러 매핑으로 핸들러 조회
      • HandlerMapping을 순서대로 실행해서 핸들러 찾음
      • 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 BeanNameUrlHandlerMapping 가 실행에 성공하고 핸들러인 MyHttpRequesstHandler를 반환
    • 핸들러 어댑터 조회
      • HandlerAdapter의 supports()를 순서대로 호출
      • HttpRequestHandlerAdapter가 HttpRequestHandler 인터페이스를 지원하므로 대상이 됨
    • 핸들러 어댑터 실행
      • 디스패처 서블릿이 조회한 HttpRequestHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨줌
      • HttpRequestHandlerAdapter는 핸들러인 MyHttpRequesstHandler를 내부에서 실행하고 그 결과를 반환
  • 현재는 @RequestMapping을 주로 사용

뷰 리졸버

  • 스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록
  • application.properties에 등록한 suffix와 prefix 설정 정보를 사용
  • 뷰 리졸버 동작 방식
    • 핸들러 어댑터 호출
      • 핸들러 어댑터를 통해 new-form 이라는 논리 뷰 이름 휙득
    • ViewResolver 호출
      • new-form 이라는 뷰 이름으로 viewResolver를 순서대로 호출
      • BeanNameViewResolver는 new-form 이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없을 경우 InternalResourceViewResolver가 호출
    • InternalResourceViewResolver
      • 이 뷰 리졸버는 InternalResourceView를 반환
    • InternalResourceView
      • JSP처럼 forward()를 호출해서 처리할 수 있는 경우 사용
    • view.render()
      • view.render()가 호출되고 InternalResourceView는 forward()를 사용해 JSP 실행

스프링 MVC - 시작하기

  • 애노테이션을 이용하는 컨트롤러
  • 현재 사용하는 방식
  • @RequestMapping
    • 요청 정보를 매핑
    • 애노테이션 기반으로 동작하기 때문에 메서드 이름은 임의로 지을 수 있음
    • 공통된 요청 정보는 클래스 레벨에 지정하여 처리할 수 있음
    • get과 post 모두 사용 가능
    • @GetMapping, @PostMapping으로 대체하여 사용
  • @Controller
    • 자동으로 스프링 빈으로 등록 해 줌
    • 애노테이션 기반 컨트롤러로 인식

 

출처 : https://www.inflearn.com/course/스프링-mvc-1

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com