WEB/Spring MVC 1

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(스프링 MVC - 구조이해)

Tony Lim 2021. 3. 29. 13:47

1. 핸들러조회 = 핸들러 매핑을 통해 요청 URL 에 매핑된 핸들러(컨트롤러)를 조회한다.

2. 핸들러 어댑터 조회 = 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.

3. 핸들러 어댑터 실행 = 핸들러 어댑터를 실행한다.

4. 핸들러 실행 = 핸들러 어댑터가 실제 핸들러 를 실행한다.

5. ModelAndView반환 = 핸들러 어뎁터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.

6. viewResolver 호출 = 뷰 리졸버를 찾고 실행한다.

  • JSP의 경우 = InternalResourceViewResolver가 자동 등록되고, 사용된다.

7. View 반환 = 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.

  • JSP의 경우 = InternalResourceView(JstlView)를 반환하는데 forward() 로직이 있다.

8. 뷰 렌더링 = 뷰를 통해서 뷰를 렌더링 한다.

 


기본적으로 HandlerMapping 통해 Handler를 찾는다

이러한 우선순위를 가지게 되는데 현재는 @RequestMapping을 사용하지 않고 Controller interface를 구현한 후에 Bean으로 등록하고 이름을 특정 url ("/mynameis") 으로 등록해놓았으니
스프링 빈의 이름 으로 (@Component ="mynameis") 찾게된다.

이후에는 알맞은 어댑터를 찾게되는데

0 = RequestMappingHandlerAdapter = @RequestMapping기반 핸들러를 처리

1 = HttpRequestHandlerAdapter = HttpRequestHandler처리 = 이것을 상속받아 구현한 핸들러들을 처리

2 = SimpleControllerHandleAdapter = Controller 인터페이스 처리

이것 말고도 헨들러어뎁터가 더 있다. 알맞은 어뎁터를 찾게되면 DIspatcherServlet (FrontController) 에서 handle을 호출하고 그안에서 또 handleRequest (우리가 구현 한것) 을 호출하여서 최종적으로 ModelAndVIew를 받아온다.

 

ViewResolver

스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록하는데 appliation.properties 에 있는 spring.mvc.view.prefix, spring.mvc.view.suffix 설정정보를 사용해서 등록한다.

@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {

   public static void main(String[] args) {
      SpringApplication.run(ServletApplication.class, args);
   }

   @Bean
   ViewResolver internalResourceViewResolver() {
      return new InternalResourceViewResolver("/WEB-INF/views/", "jsp");
   }
}

Controller에서 ModelAndView에 viewName을 간단히 return 하면 prefix,suffix알아서 양쪽에 붙여준다.
@Bean ViewResolver를 알아서 작성해준셈이다.

ViewResolver에서 알맞은 View를 return한다. (타임리프 ViewResolver는 타임리프 View를 return함 , 다 매칭되는게 있다.)

 


 

Spring MVC 시작하기 

@RequestMapping 이 의미하는것은 RequestMappingHanlder인 핸들러매핑을 쓰겠다는 것이고
이에 해당하는 RequestMappingHandler 핸들러어댑터를 쓰겠다는 이야기다.

RequestMappingHandler 은 스프링 빈 중에서 @RequestMapping 또는 @ Controller가 클래스 레벨에 붙어있는 경우를 매핑 정보로 인식한다.

 

Spring MVC 컨트롤러 통합

그냥 하나의 @Controller 가 적힌 클래스 밑에 함수형으로 다 떄려넣을 수 있다.

 

Spring MVC - 실용적인 방식

Annotation기반 매핑은 매우 유연하게 설계가되어 있어서 반환 값이 ModelAndView 말고 String이면 알아서 view를 반환하는 것임을 인식하고

인자값으로 Model , HttpServletRequest, HttpServletResponse , @RequestParam("key") 여러가지가 들어와도 다 잘 동작한다.

@RequestMapping 은 어떠한 Http request를 다 받기 떄문에 이것을 제약을 거는 것이 좋은 설계이다. 

@Getmapping , @PostMapping 이러한 annotation 을 사용하는것이 훨씬 좋다.