인프런 커뮤니티 질문&답변

박민성님의 프로필 이미지

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

SpringMemberControllerV3 질문입니다!

24.01.06 21:32 작성

·

119

0

    public ModelAndView save(HttpServletRequest request, HttpServletResponse response) {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        ModelAndView mv = new ModelAndView("save-result"); //데이터를 직접 view에 전달하는방식
//        mv.getModel().put("member", member);
        mv.addObject("member", member);
        return mv;
    }

 

    @GetMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();

        model.addAttribute("members", members);
        return "members";
    }
}

 

위 2개의 코드는 결국 HandlerAdapter에 역할을 수행하여 반환값을 돌려받는 값의 차이가 있다고 생각합니다. 첫번째코드는 ModelandView로 반환이 되는거고 두번째 코드는 String으로 반환이 된다는점에서 차이가있다고 생각합니다.

여기서 제가 질문인사항이 위 2개의 코드를 호출한 코드가 각각메서드가 다르게 설정이 되어있어야 맞다고 생각합니다. viewname을 직접반환한거와 ModelView를반환한거에서 차이가있다고 생각들어 dispatcherservlet를 찾아봤는데 rendering에 대한 코드는 찾아볼수있었습니다만 저 두코드를 실행시킨 코드는 찾아볼수가 없었는지 아니면 제가 코드를 읽을수있는 능력이부족햇는지 잘모르겠습니다

저번섹션부터 코드를 하나하나 분석해보니까 저 두코드를 실행시킨 부분도 궁금해서 제 능력으로는 찾아볼수가없어서 어디부분에 있는지 알려주시면 감사하겠습니다

 

답변 2

0

David님의 프로필 이미지

2024. 01. 09. 00:55

안녕하세요. 박민성님, 공식 서포터즈 David입니다.

질문 주신 내용을 추적하려면 직접 디버깅 해보시는 게 가장 정확하고 빠릅니다.

DispatcherServlet.doDispatch() 내 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 에서 모델뷰를 반환 받습니다.

컨트롤러에서 String(템플릿 엔진에서 지원하는 뷰 이름)을 반환하면 RequestMappingAdapterHandler.getModelAndView() 내에서 ModelAndView를 생성하여 반환하게 됩니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 01. 08. 21:37

안녕하세요, 인프런 AI 인턴입니다.
박민성님의 질문에 답변 드리겠습니다.

먼저, HandlerAdapter의 역할에 대해 말씀드리겠습니다. HandlerAdapter는 DispatcherServlet이 Controller를 호출할 때 사용하는 인터페이스로서, Controller에서 반환된 값을 HTTP 응답과 연결하는 역할을 합니다. 각기 다른 형태의 Controller가 있을 수 있기 때문에, 반환 값에 따라서 HandlerAdapter의 구현체가 다를 수 있습니다.

첫 번째 코드인 ModelAndView를 반환하는 방식은 주로 Spring MVC의 @Controller에서 사용됩니다. 이 방식은 Controller에서 View 이름과 이를 렌더링하기 위해 필요한 모델 데이터를 함께 포함하는 객체를 반환합니다.

두 번째 코드는 String을 반환하는 방식으로, 주로 @RestController에서 사용되며, 반환된 String은 View의 이름을 나타냅니다. 이때 모델 데이터는 인자로 받은 Model 객체에 추가하게 됩니다.

두 코드 모두 결국 DispatcherServlet에서 적절한 View를 찾아서 렌더링 과정을 거치게 됩니다. 하지만 두 방식의 차이점은, ModelAndView를 사용할 경우 Controller에서 View와 모델 데이터를 함께 제공한다는 점이고, String 반환 방식에서는 View는 String으로 제공하고, 모델 데이터는 별도로 Model 객체에 담아 제공한다는 점입니다.

DispatcherServlet의 내부 작동 방식은 모든 Controller 메서드 호출 후에 일어나는 일련의 과정으로 모든 Controller에 공통적으로 적용됩니다. 실제로 이러한 과정을 수행하는 코드는 일반적으로 개발자가 작성하는 부분이 아니며, Spring Framework 내부에서 처리됩니다.

DispatcherServlet 내부의 렌더링 과정이나 핸들링 로직을 찾으시려면 Spring MVC의 구현체 코드를 분석해야 합니다. 단순히 사용자 레벨에서는 이러한 내부 구현을 세세하게 알 필요 없이, Spring MVC의 추상화된 동작 원리와 사용 방법을 이해하는 것이 중요합니다. 즉, ModelAndView를 반환하든, String과 Model을 사용하든, DispatcherServlet이 적절한 View를 해석하고 렌더링하는 과정은 동일합니다.

추가적으로 궁금하신 내용이 있다면 스프링 MVC 관련 도움말을 참고하실 수 있습니다:
- 스프링 MVC 구조: Spring MVC 가이드
- @RestController 사용법: Spring Web MVC Framework

도움이 되셨길 바라며, 추가적인 질문이 있으시면 언제든 문의해주시기 바랍니다.