스프링의 MVC 동작과정

Sejun Park·2022년 5월 16일
0

SPRING

목록 보기
1/2
post-thumbnail

위 그림은 스프링의 mvc 동작과정이 모두 들어가 있는 그림입니다.
위 그림을 기반으로 설명을 드리겠습니다.

📍Model View Controller

dispatcher servlet 은 front controller 라고 불린다. front controller 는 스프링 mvc 의 핵심 기능이고, 모든 요청은 Front Controller 를 통해서 들어온다.

1. 요청 및 핸들러 찾기

요청이 들어오면 서버에서는 servlet container 에 해당하는 url 을 사용하는 컨트롤러가 있는 검색하게 된다.

만약 있다면 dispatcher servlet 에서 요청에 맞는 handler 타입을 검색하게 된다.

보통은 @RequestMapping 이기 때문에 handler mapping 구간에서 RequestMappingHandlerMapping 을 가져오게 된다.

2. 어댑터 찾기

dispatcher servlet 은 가져온 핸들러를 가지고 어떤 어댑터를 사용해야 하는지 어댑터 목록에서 찾아와 가져온다.

어댑터 개념은 미국과 한국의 110v 와 220v 차이를 생각하면 된다.

@RequestMapping 이였다면 RequestMappingHandlerAdapter 를 가지고 오게 된다.

3. 어댑터 실행

위 코드로 핸들러(어댑터)를 실행하게 된다.
찾은 어댑터를 실행시키면 핸들러 어댑터는 url 에 맞는 컨트롤러를 찾는다.
찾은 컨트롤러에 필요한 파라미터를 Argument Resolver 를 통해 가져온다.

자주 사용하는 @RequestMapping 과 HttpEntity 를 사용했을 경우 HTTP Message Converter 를 사용하여 가져오는데 타입(String, Object, ect..)과 미디어 타입(contents-type)을 가지고 판별한 다음 반환한다.

  • BtyeArrayHttpMessageConverter: byte[]
  • StringHttpMessageConverter: String
  • MappingJackson2HttpMessageConverter: Object(application/json)

4. 컨트롤러 실행

우리가 컨트롤러에서 작성한 코드들이 실행되고 나서 return 했을 때 ReturnValueHandler 가 반환 타입에 따라서 다르게 동작한다.

자주 사용하는 @ResponseBody 와 HTTPEntity를 사용했을 경우 Http Message Converter 를 사용한다.

5. 어댑터에서 반환 타입 통일

어댑터를 사용하는 가장 큰 이유가 여기서 나온다. 인터페이스로 만들어진 어댑터는 컨트롤러에서 모두 다르게 응답하였다 하더라도 어댑터에서는 같은 리턴값을 반환한다. 예로 들어 ModelAndView 가 있다.

ModelAndView 가 반환이 되었다고 한다면 View Resolver 에서 thymeleaf 같은 템플릿 엔진으로 model 에 데이터를 담아 넘겨주게 된다.

만약 @ResponseBody를 사용하면 바로 dispatcher servlet에서 응답하게 된다.

참고) modelAndView

profile
백엔드 개발자

0개의 댓글