• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

스프링 MVC 구조에서 핸들러 어댑터는 어디 있나요?

23.05.28 18:28 작성 23.05.28 19:43 수정 조회수 736

2

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

안녕하세요 영한님. 강의 아주 재밌고 유익하게 보고 있습니다. 감사합니다!


16분 25초에 스프링 MVC 구조가 완성되었다고 말씀하셨습니다.

@Controller, @RequestMapping 애노테이션을 사용해서 빈 객체로 등록하고 해당 URL로 요청객체가 들어오면 해당 빈 객체의 process 메서드를 호출하는 과정 즉, 핸들러매핑이 된 것은 이해가 갔습니다.

하지만 핸들러 어댑터 목록을 조회하고 그 어댑터가 핸들러를 지원하는지 확인하는 로직은 구현하지 않으신 것으로 이해했습니다. 심지어 V5처럼 List<MyHandlerAdapters> handlerAdapters를 사용하여 V3, V4 두 버전을 지원하기 위한 과정도 없었기 때문에 ModelAndView 참조타입으로 변환해주는 핸들러어댑터가 필요없다고 생각했습니다. 그럼에도 불구하고 영한님께서 왜 핸들러어댑터 그림을 포함시켜서 스프링 MVC 구조가 만들어졌다고 말씀하셨는지 궁금합니다.

 

 

1.png

답변 3

·

답변을 작성해보세요.

5

스프링 MVC 기본 기능까지 들어보니 자연스럽게 해결이 되었습니다... 답변해주셔서 감사합니다!

제가 깨달은 내용을 다른 분들도 보실 수 있게 정리해보겠습니다.

1. 클라이언트의 요청이 들어오면 DispatcherServlet이 요청을 수신합니다.


2. DispatcherServletHandlerMapping에게 요청을 전달하여 적절한 handler(=controller)를 찾습니다.


3. HandlerMapping은 요청을 기반으로 적절한 handler(=controller)를 찾아 반환합니다.


4. DispatcherServlet은 반환된 handler(=controller)를 실행할 수 있는 적절한 HandlerAdapter에게 전달합니다. 스프링은 HandlerAdapter 인터페이스를 구현한 다양한 클래스들을 갖고 있습니다. 예를 들어 만약 @RequestMapping 애노테이션을 사용하는 handler(=controller)의 경우,  RequestMappingHandlerAdapter에게 전달되고, 만약 @RestController 애노테이션을 사용하는 handler(=controller)의 경우, RequestMappingHandlerAdapter에게 전달됩니다.

 

5. HandlerAdapter 구현체가 handler(=controller)를 실행할 수 있도록 요청 값 변환, 검증, 반환 값 변환 등의 작업을 수행했다면 그 결과를 handler(=controller)에게 하고, handler(=controller)는 비즈니스 로직 수행을 완료하고, 필요한 데이터를 Model에 저장합니다.

 

6. handler(=controller)ModelAndView 객체를 생성하고, ModelModelAndView에 추가합니다.


7. ModelAndView 객체는 ViewResolver에게 전달됩니다.


8. ViewResolver는 논리적인 View(ex. "myForm")를 물리적인 View(ex. "WEB/views/myForm.jsp")로 변환합니다.


9.. 변환된 ViewDispatcherServlet에 반환됩니다.


10. DispatcherServletView를 실행하여 클라이언트에게 응답을 생성합니다.


11. 응답은 클라이언트에게 전송되고, 요청-응답 주기가 완료됩니다.

최원호님의 프로필

최원호

2023.06.11

4번 같은 경우 @RestController 애노테이션을 사용하는 handler(=controller)의 경우, RequestMappingHandlerAdapter에게 전달됩니다.

RequestMappingHandlerAdapter이 아니라 HttpRequestHandlerAdapter이 맞지 않나요?

0

안녕하세요. cjkimhello97님

이번에 진행한 예제가 스프링 MVC 전체를 모두 구현했다기 보다는 스프링 MVC의 핵심 개념을 이해할 정도로 구현했다고 이해하시면 됩니다^^ (전부다 구현한다면 끝이 없겠지요? ㅎㅎ)

감사합니다.

-1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.05.30

안녕하세요, 인프런 AI 인턴이에요.

핸들러 어댑터는 스프링 MVC의 핵심 구성 요소 중 하나로, 핸들러 메서드에서 필요한 파라미터(argument)를 처리하는 역할을 합니다. 핸들러 어댑터 역시 핸들러 매핑과 함께 DispatcherServlet이 초기화될 때 등록되며, 내부적으로 HandlerAdapter 인터페이스를 구현한 다양한 어댑터 클래스들이 존재합니다.

강의에서는 강의의 주제가 되는 핸들러 매핑에 대한 설명과 함께만 언급하고 넘어갔지만, 실제로는 대부분의 컨트롤러에서 핸들러 어댑터가 사용됩니다. 핸들러 어댑터를 이용하여 파라미터를 처리하는 것으로 Spring에서 Controller를 구현할 수 있습니다. 이러한 이유로 핸들러 어댑터는 스프링 MVC에서 중요한 역할을 담당합니다.

그리고, 질문 내용에서 V3, V4, V5 등의 버전을 언급하신것 같은데요, 해당 내용은 저희가 제공해드리는 강의와는 상관이 없습니다. 따라서 해당 내용에 대해서는 답변을 드리기 어렵습니다.

추가적으로 궁금한 점이 있다면 언제든지 댓글이나 다른 게시물로 문의해주세요. 감사합니다.