ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 웹 MVC 3일차
    Spring 2021. 3. 13. 21:18

     

     

    SpringMVC 구조

    Spring MVC 구조

    1. 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.

    2. 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.

    3. 핸들러 어댑터 실행: 핸들러 어댑터를 실행한다.

    4. 핸들러 실행: 핸들러: 어댑터가 실제 핸들러를 실행한다.

    5. ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.

    6. viewResolver 호출: viewResolver를 찾고 실행한다.

    7. View 반환: viewResolver는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 View 객체를 반환한다.

    8. View Rendering: 뷰를 통해 뷰를 렌더링 한다.

     

     

     

     

    과거 버전의 스프링 컨트롤러

    @Component("/springmvc/old-controller")
    public class OldController implements Controller {
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            System.out.println("OldController.handleRequest");
            return new ModelAndView("new-form");
        }
    }

    @Component를 이용해서 "/springmvc/old-controller"라는 이름의 스프링 빈으로 등록해주었다.

     

    위에 구조에서도 살펴보았듯이 이 컨트롤러가 호출되려면 핸들러와, 핸들러 어댑터가 필요하다. 그 역할을 스프링 빈으로의 등록과, 인터페이스인 Controller가 해줄 것이다.(@Controller와 다름) 스프링 부트에서는 자동으로 핸들러 매핑과 핸들러 어댑터를 등록해준다.

     

     

     

    HandlerMapping

    핸들러 매핑을 찾을 때는 제일 처음 @RequestMapping이 있는 핸들러를 찾고 그다음 스프링 빈의 이름으로 된 핸들러를 찾는다. 위에서 스프링 빈으로 등록해주었으므로 BeanNameUrlHandlerMapping에 의해 핸들러 매핑이 되는 것이다.

     

     

    HandlerAdapter
    HandlerAdapter

    핸들러 어댑터의 경우 제일 처음 @RequestMapping에 맞는 어댑터를 탐색하고 두 번째로 HttpRequestHandler에 맞는 어댑터를 탐색하고 마지막에 Controller 인터페이스에 맞는 어댑터를 탐색한다. 위의 경우 Controller 인터페이스를 상속받고 있으므로 SimpleControllerHandlerAdapter에 의해 핸들러 어댑터가 등록이 되는 것이다.

     

     

     

    @RequestMapping을 이용한 컨트롤러

     

    먼저 코드를 살펴보자

    @Controller
    @RequestMapping("/springmvc/members")
    public class SpringMemberController {
    
        private MemberRepository memberRepository = MemberRepository.getInstance();
    
        //@RequestMapping(value = "/new-form", method = RequestMethod.GET)
        @GetMapping("/new-form")
        public String newForm() {
            return "new-form";
        }
    
        //@RequestMapping(value = "/save", method = RequestMethod.POST)
        @PostMapping("/save")
        public String members(
                @RequestParam("username") String username,
                @RequestParam("age") int age,
                Model model) {
            Member member = new Member(username, age);
            memberRepository.save(member);
    
            model.addAttribute("member", member);
            return "save-result";
        }
    
        //@RequestMapping(method = RequestMethod.GET)
        @GetMapping
        public String save(Model model) {
            List<Member> members = memberRepository.findAll();
    
            model.addAttribute("members", members);
            return "members";
        }
    }

    먼저 @Controller에 의해 스프링 빈으로 등록되고, 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식하게 된다.

    그 후 @RequestMapping에 의해 RequestMappingHandlerMapping이 핸들러로 등록되고, RequestMappingHandlerAdapter가 어댑터로 등록된다. 그 후 처리되는 부분은 같다.

     

     

     

    @RequestMapping -> @GetMapping, @PostMapping

    @RequestMapping은 URL 매칭뿐만 아니라, HTTP Method도 함께 구분할 수 있다. 따라서 주석 달린 부분처럼 쓸 수도 있고, 아니면 바로 어노테이션을 이용해서 편하게 사용할 수 있다.

     

    @GetMapping

    실제로 @GetMapping안에 이렇게 등록되어 있는 것을 볼 수 있다. (@PostMapping도 마찬가지)

     

    참고: www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

    'Spring' 카테고리의 다른 글

    스프링 웹 MVC 4일차  (0) 2021.03.14
    스프링 웹 MVC 2일차  (0) 2021.03.11
    스프링 웹 MVC 1일차  (0) 2021.03.09
    스프링 시큐리티 흐름 (1)  (0) 2021.03.04
    Spring boot 로 메일 보내기  (0) 2021.03.04

    댓글

Designed by Tistory.