[spring] spring MVC 구조

공수정·2022년 5월 17일
1

spring

목록 보기
24/32
post-custom-banner

패턴

FrontController 패턴

  • 도입 전

  • 도입 후

개요

  • controller 코드 중복
    : MVC 패턴을 적용해서 controller가 비즈니스 로직에만 집중 할 수 있게 되었지만,
    여러 기능에 맞추어 controller를 작성하다보면 controller마다 중복되는 코드가 존재함
    ex) view 주소, 해당 view로 forward 하는 부분 등
  • 모든 controller 공통 처리하기의 어려움

설명

클라이언트 요청 ( 모든 요청 )
-> FrontController에서 각 요청에 맞는 controller 호출

특징

  • FrontController에서 공통으로 처리해야하는 부분 처리 가능
  • 여러 controller 중복 코드 제거
  • FrontController외에 다른 controller는 서블릿을 사용하지 않아도 됨

Adapter 패턴

개요

FrontController에서 한 가지 패턴의 controller를 정의 해놓으면, 그 패턴의 controller만을 사용할 수 있는데, 이것을 다양한 패턴으로 사용할 수 있도록 하기 위해 사용이 되었다.

설명

여기서 핸들러란 controller로 두고 이해하면 이해하기 좀 더 쉽다.
어댑터가 지원하기만하면 어떤 것이라도 URL에 매핑해서 사용할 수 있기에 이름을 controller -> handler로 변경

핸들러 어댑터 : 다양한 controllerFrontController 중간에 어댑터 역할
핸들러 어댑터 역할

  • 핸들러 어댑터를 통해 핸들러(=컨트롤러)를 호출
  • 핸들러(=컨트롤러)가 ModelAndView를 반환하지 못하면 핸들러 어댑터가 생성해서라도 반환해야함

특징

  • 어댑터 패턴으로 인해 좀 더 유연하고 확장성이 있게 설계 할 수 있다.

spring MVC 구조

DispatcherServlet

DispatcherServlet

스프링 MVC도 FrontController 패턴으로 구현, FrontController => DispatcherServlet

특징

  • DispatcherServletHttpServlet을 상속 받아서 사용하고 서블릿으로 동작
    : DispatcherServlet가 바로 상속하는 것은 아니고
    DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet
  • DispatcherServlet은 모든 경로(urlPatterns="/")에 대해 매핑
    : 다만 다른 controller에서 매핑한 것이 우선 순위가 더 높다.

요청 흐름

서블릿이 호출되면 HttpServlet 이 제공하는 serivce() 가 호출 ( 이때 serivce()
DispatcherServlet의 부모인 FrameworkServlet 에서 오버라이드 )
-> DispacherServlet.doDispatch() 호출

DispacherServlet.doDispatch() : 요청에 맞는 처리를 하는 핵심 로직


동작순서

여기서 핸들러란 controller로 두고 이해하면 이해하기 좀 더 쉽다.

1. 핸들러 조회

먼저 요청이 들어왔을 때, 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(=컨트롤러)를 조회

핸들러 매핑 : /test라는 요청이 왔을 떄는 어떤 controller로 처리를 할건지 매핑되어있는 것
{(/save, SaveController), (/select, SelectController) ,,,} 대략 이런식

2. 핸들러 어댑터 조회

1. 핸들러 조회를 통해 조회된 핸들러(=컨트롤러)를 실행할 수 있는 핸들러 어댑터를 조회

3. 핸들러 어댑터 실행

핸들러 어댑터를 실행

4. 핸들러 실행

핸들러 어댑터가 실제 핸들러(=컨트롤러)를 실행

5. ModelAndView 반환

핸들러 어댑터핸들러(=컨트롤러)가 반환하는 정보를 ModelAndView로 변환해서 반환

6. viewResolver 호출

뷰 리졸버를 찾고 실행

7. View 반환

뷰 리졸버는 뷰의 논리 이름물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환

논리 뷰 이름: test
물리 뷰 경로: /WEB-INF/jsp/test.jsp
뷰 리졸버 : 논리 이름물리 이름으로 변경하고, 변경된 물리 이름으로 뷰 객체를 찾아 반환 함
논리 이름물리 이름을 구분하는 이유 : 앞에 /WEB-INF/jsp/ 부분이 공통이라 중복이 되기도하고, 유지보수를 진행하면서 jsp파일이 있는 경로가 변경되었을 때 한 곳만 수정하면 되기 때문에 구분하여 사용

뷰 리졸버 - InternalResourceViewResolver
spring boot는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이떄 application.properties에서 등록한 spring.mvc.view.prefix, spring.mvc.view.suffix 설정 정보를 사용해서 등록!

8. 뷰 렌더링

를 통해서 뷰를 렌더링

출처
1. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

profile
계속해서 공부하는 개발자입니다 :)
post-custom-banner

0개의 댓글