스프링 MVC 1편 - 스프링MVC 구조이해
스프링 MVC
- 전 시간에 만들었던 패턴과 SpringMVC 구조 비교
FrontController → DispatcherServlet
handlerMapping → HandlerMapping
MyHandlerAdapter → HandlerAdapter
ModelView → ModelAndView
viewResolver → ViewResolver
MyView → view
- DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
스프링 MVC의 핵심 코드
handler 조회 → handlerAdapter 조회해 처리 → processDispatchResult(render) → ModelAndView 반환 → viewResolver → View반환 → 뷰 렌더링
- 핸들러 매핑
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component("/springmvc/old-controller") //스프링 빈 이름 지정
public class OldController implements Controller {
//@Controller랑 다른것 이건 예전에 쓰던 구버전 Controller
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handleRequest");
return null;
}
}
0순위 → RequestMappingHandlerMapping : @RequestMapping
1순위 → BeanNameUrlHandlerMapping : 스프링 빈 이름으로 핸들러를 찾음
- 핸들러 어댑터
0순위 → RequestMappingHandlerAdapter : @RequestMapping
1순위 → HttpRequestHandlerAdapter : HttpRequestHandler interface 처리. 서블릿과 거의 유사
2순위 → SimpleControllerHandlerAdapter : Controller interface
현재는 대부분 @RequestMapping 방식 컨트롤러를 사용한다.
스프링부트는 자동으로 핸들러매핑&핸들러어댑터를 등록한다.
- ViewResolver
application.properties에 아래 설정정보 추가
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
스프링부트가 InternalResourceViewResolver 를 자동으로 등록해 spring.mvc.view.prefix, suffix를 설정정보를 사용해서 등록한다. InternalResourceViewResolver는 forward()해 반환한다.
1순위 → BeanNameViewResolver 빈 이름으로 뷰를 찾아서 반환
2순위 → InternalResourceViewResolver
- Spring MVC
@Controller : 스프링이 자동으로 빈으로 등록함. 내부에 @Component 가 붙어있음. 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.
@RequestMapping : RequestMappingHandlerMapping은 @Controller나 @RequestMapping이 클래스 레벨에 설정되어있으면 스캔의 대상이 된다
- 컨트롤러 통합
@RequestMapping은 메소드 단위이기 때문에 한 Controller클래스에 통합할 수 있다.
- 실용적인 방식
ModelAndView를 반환하지 않고 ViewName(String)을 반환하는것으로 수정
@RequestParam 파라미터 request, response를 파라미터를 직접 받는 방식으로 변경
@RequestMapping → GetMapping, PostMapping으로 변경
Leave a comment