스프링 MVC - 구조 이해

byeol·2022년 12월 21일
0

스프링 웹 MVC 1

목록 보기
5/6
post-thumbnail

(수업 내용을 ppt에 정리하다보니 그림이 작으니
확대해서 봐야한다.)

앞서 배웠던 version 5와 똑같은 구조를 갖는다.
하지만 명칭이 달라졌고 안에 있는 세부적인 내용들이 조금씩 수정되었다.

저 빨간색 네모칸에 있는 것이 스프링 MVC이다. 앞서 내가 직접 만들었던 MVC와 비교해서 생각해보자.

Spring MVC의 구조 살펴보기

일단 내가 알아둬야할 것은
이제 스프링의 MVC로 인해서 내가 FrontController, 핸들러 어댑터, View, 뷰리졸버를
손보는 일은 없다.

나는 그냥 Controller와 jsp파일을 잘 설계해서 올리면 되는 것이다.

일단 왜 그게 가능해졌는지 오늘 배운 내용을 정리해본다.

스프링 MVC가 제공하는

  • Frontcontroller
    모든 경로가 들리도록 설정해놓았다
    즉 utlPatterns가 "/"이기 때문에 모든 요청 HTTP는 저 프런트 컨트롤러 지나게 되어있으며
    이름은 DispatcherServlet이다.
    • Handler Mapping은 두개가 있으면 순위가 높은 걸 먼저 검색한다.
      애노테이션 기반 컨트롤러는 RequestMapping의 매핑정보를 갖는다,
    • 그 다음 순위가 BeanName으로 검색하는 매핑정보이다.
    • HpptServlet의 Overriding으로 service()함수를 호출할 때 내부에 있는 doDispatch()
      를 호출하는데 doDispatch는
    1. 핸들러를 매핑정보에서 조회해서 구체적인 Controller를 얻고
    2. 1번에서 얻었던 Controller(핸들러)가 내부 리스트 목록에 있는 핸들러 어댑터인지 다시 한번 확인한다.
    3. 핸들러 어댑터를 실행하면 이 핸들러 어댑터는 Controller(핸들러)를 실행한다.
    4. 3번의 결과로 ModelAndView의 형태를 갖는 결과를 반환받게 되고
    5. viewresolver를 호출해서 jsp파일의 물리적인 경로를 얻는다.
    6. 이를 렌더링 하여 View를 반환받는다.
  • 핸들러 어댑터
    핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터
    개발자가 실행할 때마다 프런트 컨트롤러를 수정하는 일이 적도로 말그대로 어댑터 역할을 하는 것이다.
    핸들러 어댑터는 3개의 종류가 있는데
    • RequestMappingHandlerAdapter 는 애노테이션 기반이며 0순위로 먼저 검색해본다.
    • HttpRequestHandlerAdapter는 HttpRequestHandler를 처리하며 두번째로 검색
    • SimpleControllerHandlerAdapter는 Controller인터페이스 즉 아주 과거에 사용했다.
  • 뷰 리졸버 : 논리적인 이름 -> 물리적인 경로의 파일로 바꿔주는
    스프링 부트가 자동 등록하는 뷰 리졸버는 더 많지만 많이 사용하는 2개에 대해서 배운다.
    • 1 순위는 BeanNameViewResolver로 빈 이름으로 뷰를 찾아서 반호나
    • 2 순위로 InternalResourceViewResolver로 JSP를 처리할 수 있는 뷰를 반환한다.
      application.properties에
      spring.mvc.view.prefix =/WEB-INF/views/
      spring.mvc.view.suffix =.jsp
      를 추가한다.

Spring MVC 시작하기

@RequestMapping

가장 우선순위가 높은 RequestMappingHandlerMapping 핸들러 매핑과
RequestMappingHandlerAdapter 핸들러 어댑터의 앞글자를 딴 @RequestMapping 애노테이션.
이 앞글자를 딴 애노테이션이 저 우선순위가 높은 핸들러 매핑과 핸들러 어댑터를 지원하는 애노테이션 기반의 컨트롤러 이다.

1.@Controller와 @RequestMapping

  • @Controller는 내부에 @Component 애노테이션이 있어서 컴포넌트 대상이 된다.
  • @RequestMapping 괄혼 안에 있는 url이 호출되면 process()가 호출된다. 메소드의 이름은 임의로 지은다.
  • ModelAndView에 담아서 반환

2.@Component와 @RequestMapping

  • 클래스 레벨에 @Controller 혹은 @RequestMapping이 있어야 RequestMappingHandlerMapping이 매핑 정보로 인식한다!
  • 그러나 @RequestMapping은 @Component가 내부에 저장되어 있지 않기 때문에 별도로 @Component 애노테이션을 선언해줘야 한다.

3.스프링 빈 직접 등록과 @RequestMapping

@Bean 
SpringMemberFormControllerV1 springMemberFormControllerV1() {
   return new SpringMemberFormControllerV1();
}

컴포넌트 스캔 없이 별도로 스프링 빈을 직접 등록해도 된다.

4.번외) addObject() : 스프링이 제공하는 ModelAndView를 통해 Model데이터를 추가할 때 사용

Controller 통합


클래스와 메서드 레벨과의 조합도 가능하다.
메소드 레벨에서 발생하는 중복된 url을 제거하여 클래스 레벨에 선언하였다.

실용적인 방식


1. Model 파라미터
save()와 members()는 Model을 파라미터로 받는다.
2. @RequestParam
request.getParameter("username")과 거의 같은 코드로 HTTP 요청 파라미터의 데이터를 받는다.
3. @RequestMapping-> @GetMapping, @PostMapping

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

에서 단순히 @GetMapping과 @PostMapping을 통해서 더 편리해졌다.

profile
꾸준하게 Ready, Set, Go!

0개의 댓글