요청 매핑 핸들러 어댑터 구조

바그다드·2023년 5월 4일
0
post-thumbnail
  • 우리가 컨트롤러에서 사용하던 매개변수를 확인을 해보자
    @PostMapping("/{itemId}/edit")
    public String edit(@PathVariable Long itemId, @ModelAttribute Item item, Model model) {
        itemRepository.update(itemId, item);
        return "redirect:/basic/items/{itemId}";
    }
    /*
  • 우리는 당연하게 컨트롤러에서 어노테이션을 이용해 필요한 매개변수를 받아 사용하였다. 위의 코드에서는 하나의 예시만을 보여주지만, 컨트롤러의 메서드마다 각각 필요로 하는 인자 값들이 다를 수 있다. 또한 http 메세지를 통해 직접 데이터를 주고 받을 경우에는 http 메세지 컨버터가 필요하다.
  • 하지만 앞서 확인했던 spring mvc구조에서는 이런 컴포넌트들이 확인되지 않는데, 이러한 기능을 RequestMappingHandler에서 한다.

RequestMappingHandler 동작 방식


1. Dispatcher Servlet에서 RequestMappingHandler에게 요청을 보낸다.
2. RequestMappingHandler는 요청에 매핑되는 핸들러를 호출하는데, 이때 핸들러에서 필요로 하는 파라미터를 ArgumentResolver에서 생성을 한다.
- 만약 파라미터가 HTTP 메세지를 통해서 온 값들이라면(@RequestBody나 HttpEntity등이 사용될 때) http 메시지 컨버터에서 파라미터를 생성한다.
3. 핸들러가 리턴한 값은 ReturnValueHandler에서 값을 변환하고 처리한다.
- 만약 리턴 값이 http 메세지로 보내는 값일 때(@ResponseBody나 HttpEntity등이 사용될 때) http 메시지 컨버터를 이용해 응답 값을 생성한다.

  • 그럼 http 메세지 컨버터는 어디에서 동작을 할까?
    요청의 경우 @RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity를 처리하는 ArgumentResolver가 있다. 이 ArgumentResolver 들이 http 메세지 컨버터를 사용해서 필요한 객체를 생성하는 것이다.
    반대로 응답의 경우 @ResponseBody를 처리하는 ReturnValueHandler가 있고, HttpEntity를 처리하는 ReturnValueHandler가 있다. 또한 이 ReturnValueHandler들이 http 메세지 컨버터를 호출해서 응답 결과를 생성한다.
profile
꾸준히 하자!

0개의 댓글