스프링 MVC 1편 - 스프링MVC 구조이해

1 minute read

스프링 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으로 변경

Categories:

Updated:

Leave a comment