스프링 MVC - 구조 이해

slee2·2022년 1월 7일
0

스프링 MVC 전체 구조

FrontController -> DispatcherServlet
handlerMappingMap -> HandlerMapping
MyHandlerAdapter -> HandlerAdapter
ModelView -> ModelAndView
viewResolver -> ViewResolver
MyView -> View

DispatcherServlet 구조

org.springframework.web.servlet.DispatcherServlet

스프링 MVC의 프론트 컨트롤러가 바로 디스패처 서블릿(DispatcherServlet)이다.

DispacherServlet 서블릿 등록

DispacherServlet 도 HttpServlet 을 상속 받아서 사용하고, 서블릿으로 동작한다.

스프링 부트는 DispacherServlet 을 서블릿으로 자동으로 등록하면서 모든 경로( urlPatterns="/" )에 대해서 매핑한다

스프링 MVC는 DispatcherServlet 의 부모인 FrameworkServlet 에서 service() 를 오버라이드 되어있다.

FrameworkServlet.service() 를 시작으로 여러 메서드가 호출되면서
DispacherServlet.doDispatch() 가 호출된다.

동작 순서

  1. 핸들러 조회
  2. 핸들러 어댑터 조회
  3. 핸들러 어댑터 실행
  4. 핸들러 실행
  5. ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
  6. viewResolver 호출: 뷰 리졸버를 찾고 실행한다.
  7. View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
  8. 뷰 렌더링

 

핵심 동작을 알아둬야 하는 이유는 향후에 문제가 발생했을때 어디서 문제가 발생했는지 쉽게 파악할 수 있기 때문

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

Controller 인터페이스

옛날에는 스프링도 컨트롤러를 밑에처럼 딱딱하게 구현했었다.

여기서 말한 Controller는 인터페이스이고, @Controller가 아니다.

스프링은 핸들러 매핑과 핸들러 어댑터를 대부분 구현을 해놨기 때문에 위처럼만 작성해도 알아서 컨트롤러를 찾아 실행해준다.

0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용) 처리

우선순위는 위와 같이 된다.

동작은 모두 비슷하다.

HttpRequestHandlerAdapter의 support메서드를 통해 해당하는 컨트롤러가 있는지 찾는다.

그 후에 있으면 handler로 넘겨서 HttpRequestHandler가 실행된다.

인터페이스 Controller도 마찬가지이다.
즉, 우선순위 순서대로 컨트롤러가 있는지 어댑터가 각각 검사한 후에 있다면 그 컨트롤러를 실행하는 방식이다.

 

사실 구조적인 것을 설명하기 위해 옛날 것 1, 2 순위를 설명하는 것이고
실질적으로 가장 우선 순위가 높은(0순위) @RequestMapping을 가장 많이 사용한다.

참고로 @RequestMapping은 핸들러 매핑과 핸들러 어댑터가 각각
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
이다.

뷰 리졸버

1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.

둘 중에 InternalResourceViewResolver부분을 사용하는데
이 뷰 리졸버는 InternalResourceView를 반환한다.

InternalResourceView는 JSP처럼 forward()를 호출해서 처리할 수 있는 경우에 사용한다.

view.render()에서 앞 뒤로 붙여서 실행해준다.

 

우리는 Thymeleaf 뷰 템플릿을 많이 사용할텐데 라이브러리 추가하면 스프링 부트가 ThymeleafViewResolver도 알아서 등록해준다.

스프링 MVC - 시작하기

스프링이 제공하는 컨트롤러는 에노테이션으로 동작하여 매우 유연한 동작이 가능하다.

@RequestMapping

가장 순위가 높은 RequestMappingHandlerMapping, RequestMappingHandlerAdapter는 어노테이션이 알아서 동작해준다.

SpringMemberFormControllerV1

@Controller 안에는 @Component가 있으므로 컴포넌트 스캔의 대상이 되고 자동으로 빈에 등록된다.
또, 스프링 MVC에서 에노테이션 기반 컨트롤러로 인식하여, 핸들러 매핑은 해당 컨트롤러를 매핑 정보로 인식한다.

SpringMemberFormControllerV1

이렇게 해도 작동하고, 컴포넌트를 빼고 빈을 직접 등록해도 된다.
그냥 깔끔하게 컨트롤러 쓰면 된다.

SpringMemberSaveControllerV1

v3의 내용을 그대로 가져와 매개변수와 ModelView만 바꿔주면 된다.

SpringMemberListControllerV1

스프링 MVC - 컨트롤러 통합

컨트롤러를 하나로 통합해버렷

그냥 하나로 합친것이다.

이런식으로 앞의 공통 부분을 위에서 처리하여 URI가 합쳐지도록 만들 수 있다.

스프링 MVC - 실용적인 방식

엄청 간단해졌다.save의 매개변수가 좀 많이 인상깊었다.
@RequestParam 에노테이션을 이용하면 post로 받은 요청 파라미터를 받을 수 있다.

0개의 댓글

관련 채용 정보