DispatcherServlet

  • HttpServlet을 상속 받아서 서블릿으로 동작 (프론트 컨트롤러 역할)
  • 서블릿 호출 시, HttpServlet 이 제공하는 service()를 시작으로 DispacherServlet.doDispatch()가 실행
  • 스프링 MVC의 큰 강점은 DispatcherServlet 코드의 변경 없이, 원하는 기능을 변경하거나 확장할 수 있다 (인터페이스 제공)
 

 

DispacherServlet.doDispatch()

  • 핸들러 조회
  • 핸들러 어댑터 조회 -> 핸들러를 처리할 수 있는 어댑터
  • 핸들러 어댑터 → 핸들러 실행
  • ModelAndView 반환
  • View Resolver 실행 (View 조회)
  • View 렌더링

 

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

 

스프링 MVC는 이미 내부적으로 구현되어 있다.

  • 가장 우선순위가 높은 RequestMappingHandlerMapping,RequestMappingHandlerAdapter
  • RequestMappingHandler은 @RequestMapping 또는 @Controller가 붙어있는 스프링 빈을 보고 매핑 정보로 인식

 

View Resolver

  • 스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록
  • application.properties에 등록한 spring.mvc.view.prefix , spring.mvc.view.suffix 설정 정보를 사용해서 등록
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

그 외 간단 정리

  • @Controller : 컨트롤러는 반환 값이 String이면 뷰 이름으로 인식, 그래서 뷰를 찾고 뷰가 랜더링
  • @RequestMapping : URL 요청 정보를 매핑 (메서드단에 적용해서 컨트롤러 클래스를 유연하게 통합 가능)
  • @RequestParam : HTTP 요청 파라미터를 애노테이션으로 받을 수 있음 (생략 가능)
  • @PathVariable : URL 경로를 템플릿화하여 조회 가능 (members/{memberId})
  • @ModelAttribute : 요청 파라미터를 전달 받고, 객체를 생성해서 Model에 저장하는 과정을 자동화 (생략 가능)

 

 

HTTP 메시지 컨버터

  • view를 사용하지 않고, HTTP 메시지 컨버터를 통해서 HTTP 메시지를 직접 입력
  • RequestMapping 핸들러 어댑터에서 핸들러(컨트롤러)로 넘어가기 전 ArgumentResolver 에서 HTTP 메시지 컨버터 호출
  • ArgumentResolver컨트롤러의 파라미터, 애노테이션을 기반으로 필요한 데이터를 생성하고 컨트롤러에 전달
  • ReturnValueHandler컨트롤러 응답 값을 전달 받아 변환하고 처리
  • @RequestBody : HTTP 메시지 컨버터가 HTTP 메시지 바디를 원하는 문자나 객체 등으로 변환 (json도 객체로 변환 가능)
  • @ResponseStatus(HttpStatus.OK) 애노테이션으로 응답 코드도 설정 가능하지만 동적으로 응답 코드를 생성하는 경우 ResponseEntity를 사용
  • 컨트롤러에서 @ReqeustBody 사용 시, Message Converter가 해당 메시지를 읽을 수 있는지 확인하기 위해 canRead() 또는 canWrite()를 호출하고 가능하면 read() 또는 write() 호출

 

 

[참고]인프런 김영한님 강의를 공부한 내용입니다.

+ Recent posts