Spring MVC Core

DeadWhale·2022년 11월 9일
0

Spring-MVC-Core

목록 보기
4/6
post-thumbnail

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

어노테이션 기반의 스프링이 되기 전 자주 사용

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
  1. 핸들러 어댑터가 실행되고 어댑터가 찾으면 실제 핸들러가 수행된다.
  2. 핸들러어댑터는 핸들러가 반환하는 정보를 ModelAndView으로 변환해서 반환한다.
  3. ViewResolver를 호출해 실행한다.
    ( JSP는 InternalResourceViewResolver가 자동으로 등록되어 사용된다 )
  4. 뷰 리졸버가 뷰의 논리적인 이름 ( ” new-fomr ” )을 물리적인 위치로 변환 후 랜더링을 담당하는 뷰 객체로 반환한다.
    1. JSP , 타임리프 각각의 뷰 객체가 따로 있다.
    2. JSP는 InternalResourceView(JstlView)를 반환하는데 내부의 forward()로직이 같이 있다.
  5. 뷰 객체를 통해 뷰를 랜더링한다.

스프링 MVC

  • 기존 스프링 MVC의 단점인 불편함이 @어노테이션 기반으로 변경되며 매우 편해졌다.
  • 스프링이 @RequestMapping 을 찾아서 매핑하고 연결해주는 방식
    • RequestMappingHandlerMapping
    • RequestMappingHandlerAdapter

@Controller

두 가지 역할을 수행한다

  • 스프링이 자동으로 스프링 빈으로 등록한다
    • @Controller내부에 @Component 어노테이션이 있다
  • 스프링 MVC에서 어노테이션 기반의 Controller로 인식한다.

@ RequestMapping

  • 요청 정보 (URL)을 매핑한다. 어노테이션 기반이여서 메서드 이름은 상관 없다.

ModelAndView

  • 모델과 뷰 정보를 담아서 반환하면 된다.

스프링 빈들 중에서 @RequestMapping , @Controller가 클래스 레벨로 있어야 된다

  • 두개가 동일한 역할을 수행
@Componet
@RequestMapping
@Controller
/**
 * {@inheritDoc}
 * <p>Expects a handler to have either a type-level @{@link Controller}
 * annotation or a type-level @{@link RequestMapping} annotation.
 */
@Override
protected boolean isHandler(Class<?> beanType) {
	return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
			AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
  • 핸들러인지 구분하는 인터페이스 구현체.
  • 컨트롤러 클래스를 조합도 가능하다.

편하게 사용

  • 문자를 반환해도 자동으로 뷰로 전달된다.
  • @RequestParam(”파라미터 네임”) String 변수명 으로 파라미터를 받을 수도 있다.
    • 타입 변환도 받을 수 있다.
  • Model에 addAttribute으로 값을 편하게 전달할 수 있다.
    • VIew 이름만 반환하면 자동으로 찾아간다.
  • RequestMapping( url패턴 , http메서드 ) : GET , POST
    • PostMapping , GetMapping 이 더 편하다.
    • PUT , PATCH , DELETE는 @어노테이션으로
      • postMapping , getMapping도 까고 보면 RequestMapping을 해두었다.

0개의 댓글