Programming/Spring

Spring - 스프링 MVC - 구조 이해

잇(IT) 2023. 6. 18. 11:44

servlet, jsp를 이용한 MVC 프레임워크 구조
spring MVC 구조

- FrontController -> DispatcherServlet

- handlerMappingMap -> HandlerMapping

- MyHandlerAdapter -> HandlerAdapter

- ModelView -> ModelAndView

- viewResolver -> ViewResolver

- MyView -> View


- DispacherServlet

 

- 스프링 부트는 DispacherServlet 을 서블릿으로 자동으로 등록하면서 모든 경로( urlPatterns="/" )에 대해서 매핑한다.


- 동작 순서

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

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

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

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

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

6. viewResolver 호출: 뷰 리졸버를 찾고 실행한다. JSP의 경우: InternalResourceViewResolver 가 자동 등록되고, 사용된다.

7. View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. JSP의 경우 InternalResourceView(JstlView) 를 반환하는데, 내부에 forward() 로직이 있다.

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


- 주요 인터페이스 목록

1. 핸들러 매핑: org.springframework.web.servlet.HandlerMapping

2. 핸들러 어댑터: org.springframework.web.servlet.HandlerAdapter

3. 뷰 리졸버: org.springframework.web.servlet.ViewResolver

4. 뷰: org.springframework.web.servlet.View


- @RequestMapping

1. RequestMappingHandlerMapping

2. RequestMappingHandlerAdapter

 

@Controller
public class SpringMemberFormControllerV1 {
    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process() {
        return new ModelAndView("new-form");
    }
}

- @Controller :

1. 스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨)

2. 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.

- @RequestMapping :

1. 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지으면 된다.

- ModelAndView :

1. 모델과 뷰 정보를 담아서 반환하면 된다.

 

- @RequestMapping이 클래스단에 있으면 메서드 전체에 RequestMapping이 적용된다.


- 실무에서 주로 사용하는 방식

/**
 * v3
 * Model 도입
 * ViewName 직접 반환
 * @RequestParam 사용
 * @RequestMapping -> @GetMapping, @PostMapping
 */
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
    private MemberRepository memberRepository = MemberRepository.getInstance();
    @GetMapping("/new-form")
    public String newForm() {
        return "new-form";
    }
    @PostMapping("/save")
    public String save(
            @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";
    }
    @GetMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();
        model.addAttribute("members", members);
        return "members";
    }
}

- Model 파라미터

1. save() , members() 를 보면 Model을 파라미터로 받는 것을 확인할 수 있다. 스프링 MVC도 이런 편의 기능을 제공한다.

- ViewName 직접 반환

1. 뷰의 논리 이름을 반환할 수 있다.

- @RequestParam 사용

1. 스프링은 HTTP 요청 파라미터를 @RequestParam 으로 받을 수 있다.

2. @RequestParam("username") 은 request.getParameter("username") 와 거의 같은 코드라 생각하면 된다.

3.물론 GET 쿼리 파라미터, POST Form 방식을 모두 지원한다.

- @RequestMapping -> @GetMapping, @PostMapping

1. @RequestMapping 은 URL만 매칭하는 것이 아니라, HTTP Method도 함께 구분할 수 있다.

2. 예를 들어서 URL이 /new-form 이고, HTTP Method가 GET인 경우를 모두 만족하는 매핑을 하려면 다음과 같이 처리하면 된다.

@RequestMapping(value = "/new-form", method = RequestMethod.GET)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (스프링 핵심원리 - 기본 편)

728x90

'Programming > Spring' 카테고리의 다른 글

Spring - 타임리프 - 기본 기능  (0) 2023.06.20
Spring - 스프링 MVC - 기본 기능  (0) 2023.06.18
Spring - RequestBodyJsonController  (0) 2023.06.16
Spring - 웹 애플리케이션 이해  (0) 2023.06.13
Spring - 빈 스코프  (0) 2023.06.11