핸들러 매핑 과 핸들러 어댑터
어노테이션 기반의 스프링이 되기 전 자주 사용
Controller 인터페이스와 어노테이션 @Controller는 다르다
핸들러 매핑
- 핸들러 매핑에서 찾을 수 있어야 한다.
- ex ) 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다
- 0순위 RequestMappingHadnlerMapping : 어노테이션 기반의 @RequestMapping에서 사용한다
- 1순위 BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다.
들어온 url과 완전 동일한 컴포넌트를 찾는다.
핸들러 어댑터
- 핸들러 매핑을 통해서 실행할 수 있는 핸들러 어댑터가 필요
- ex ) “Controller” 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 한다.
- 0순위 : RequestMappingHadlerAdapter : 어노테이션 기반 컨트롤러 @RequestMapping에서 사용
- 1순위 : HttpReqeustHadlerAdapter : HttpRequestHandler 처리용
- 2순위 : SimpleControllerHandlerAdapter : Controller 인터페이스 ( 과거의 유산 어노테이션 기반 스프링 이전)
스프링은 이미 필요한 핸들러 매핑과 어댑터를 구현해두었다.
View Resolver :: 뷰 리졸버
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
- 핸들러 어댑터가 실행되고 어댑터가 찾으면 실제 핸들러가 수행된다.
- 핸들러어댑터는 핸들러가 반환하는 정보를 ModelAndView으로 변환해서 반환한다.
- ViewResolver를 호출해 실행한다.
( JSP는 InternalResourceViewResolver가 자동으로 등록되어 사용된다 )
- 뷰 리졸버가 뷰의 논리적인 이름 ( ” new-fomr ” )을 물리적인 위치로 변환 후 랜더링을 담당하는 뷰 객체로 반환한다.
- JSP , 타임리프 각각의 뷰 객체가 따로 있다.
- JSP는 InternalResourceView(JstlView)를 반환하는데 내부의 forward()로직이 같이 있다.
- 뷰 객체를 통해 뷰를 랜더링한다.
스프링 MVC
- 기존 스프링 MVC의 단점인 불편함이 @어노테이션 기반으로 변경되며 매우 편해졌다.
- 스프링이 @RequestMapping 을 찾아서 매핑하고 연결해주는 방식
- RequestMappingHandlerMapping
- RequestMappingHandlerAdapter
@Controller
두 가지 역할을 수행한다
- 스프링이 자동으로 스프링 빈으로 등록한다
- @Controller내부에 @Component 어노테이션이 있다
- 스프링 MVC에서 어노테이션 기반의 Controller로 인식한다.
@ RequestMapping
- 요청 정보 (URL)을 매핑한다. 어노테이션 기반이여서 메서드 이름은 상관 없다.
ModelAndView
스프링 빈들 중에서 @RequestMapping , @Controller가 클래스 레벨로 있어야 된다
@Componet
@RequestMapping
@Controller
@Override
protected boolean isHandler(Class<?> beanType) {
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
- 핸들러인지 구분하는 인터페이스 구현체.
- 컨트롤러 클래스를 조합도 가능하다.
편하게 사용
- 문자를 반환해도 자동으로 뷰로 전달된다.
@RequestParam(”파라미터 네임”) String 변수명
으로 파라미터를 받을 수도 있다.
- Model에 addAttribute으로 값을 편하게 전달할 수 있다.
- RequestMapping( url패턴 , http메서드 ) : GET , POST
- PostMapping , GetMapping 이 더 편하다.
- PUT , PATCH , DELETE는 @어노테이션으로
- postMapping , getMapping도 까고 보면 RequestMapping을 해두었다.