[Spring MVC] [1] 중간 점검

4545 단어 TILspringMVCTIL


MVC 프레임워크 만들기

Model 추가-v3

프론트 컨트롤러에서 지저분한 일을 모두 처리하게 하고 핵심 로직은 최대한 단순하게!
(프론트 컨트롤러는 하나지만 개발자들이 다룰 컨트롤러는 수백개가 될 수 있으니까)

        Map<String, String> paramMap = new HashMap<>();
        request.getParameterNames().asIterator()
                  .forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName)));

➡️ paramMap이라는 Map에 모든 데이터를 다 집어넣는 코드

✔️ viewResolver는 논리 이름을 물리 이름으로 변환해주는 역할을 수행
new MyView("/WEB-INF/views/" + viewName + ".jsp");
이렇게 해주면 변환


정리

v1 - 일단 프론트 컨트롤러를 도입
v2 - 반복을 없애기 위해 MyView 도입
v3 - HttpRequest, HttpResponse 서블릿 종속성을 없앰. ViewResolver를 사용해 논리 이름을 넣으면 물리 이름을 반환하고 실제 view 까지 만들어줌.
v4 - modelview마저 프론트 컨트롤러에서 생성하도록
v5


스프링 MVC - 구조 이해

스프링 MVC 전체 구조

SpringMVC에서 DispatcherServlet이 가장 중요 (프론트 컨트롤러 패턴을 구현한 프론트 컨트롤러)

그리고 요청 흐름을 봤을 때 결과적으로 DispacherServlet.doDispatch() 가 호출되는데 이것이 가장 핵심 ⭐️

핸들러 조회핸들러 어댑터 조회핸들러 어댑터 실행핸들러 어댑터를 통한 핸들러 실행ModelAndView 반환뷰 리졸버를 통해 뷰 찾기View 반환뷰 렌더링


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

HandlerMapping 핸들러 매핑

핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야 함.
ex. 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요

HandlerAdapter 핸들러 어댑터

핸들러 매핑을 통해서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요.
ex. Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 함.


뷰 리졸버

(기준은 이전 게시물에서 했던 예제)
1. 핸들러 어댑터 호출
: 핸들러 어댑터를 통해 (ex. new-form) 논리 뷰 이름을 획득

2. ViewResolver 호출
: 뷰 이름으로 viewResolver를 순서대로 호출
BeanNameViewResolver의 우선 순위가 InternalResourceViewResolver보다 높으므로 먼저 찾았는데? 없어서 후자를 호출

3. InternalResourceViewResolver
: 이 뷰 리졸버는 InternalResourceView를 반환

4. 뷰 - InternalResourceView
: InternalResourceView는 JSP처럼 포워드 forward()를 호출해 처리할 수 있는 경우에 사용

5. view.render()
: view.render()가 호출되고 InternalResourceView는 forward()를 사용해 JSP실행


스프링 MVC - 기본 기능

요청 매핑

"요청이 왔을 때 어떤 컨트롤러가 매핑 되어야 하지?"

📌 참고
/hello/랑 /hello랑 다른 url이지만 스프링은 같은 요청으로 매핑해줌

메소드 매핑을 @GetMapping 이런 식으로 POST, PUT 등등 축약해줄 수 있으며 ⭐️PathVariable(경로 변수)를 사용할 수 있다. (다중으로 값을 여러개 넣을 수도 있음)

또한, 특정 파라미터, 헤더, 미디어 타입 조건을 매핑시킬 수 있다.


좋은 웹페이지 즐겨찾기