[Spring]Spring Web MVC

무1민·2023년 4월 23일
0

Spring

목록 보기
3/9

MVC(Model-View-Controller) Pattern

  • Model

    • 어플리케이션 상태의 캡슐화
    • 상태 쿼리에 대한 응답
    • 어플리케이션의 기능 표현
    • 변경을 view에 통지
  • View

    • 모델을 화면에 시각적으로 표현
    • 모델에게 업데이트 요청
    • 사용자의 입력을 컨트롤러에 전달
    • 컨트롤러가 view를 선택하도록 허용
  • Controller

    • 어플리케이션의 행위 정의
    • 사용자 액션을 모델 업데이트와 mapping
    • 응답에 대한 view 선택

  • 어플리케이션의 확장을 위해 Model, View, Controller 세가지 영역으로 분리

  • 컴포넌트의 변경이 다른 컴포넌트에 영향을 미치지 않음(유지보수 용이)

  • 컴포넌트 간의 결합성이 낮아 프로그램 수정이 용이(확장성이 뛰어남)

  • 장점

    • 화면과 비즈니스 로직을 분리해서 작업 가능
    • 영역별 개발로 인하여 확장성이 뛰어남
    • 표준화된 코드를 사용하므로 공동작업이 용이하고 유지보수성이 좋음
  • 단점

    • 개발과정이 복잡해 초기 개발속도가 늦음
    • 초보자가 이해하고 개발하기에 다소 어려움

  • Model2 (Web MVC) 요청 흐름

Spring MVC 특징

  • Spring은 DI나 AOP같은 기능뿐만 아니라, Servlet 기반의 WEB 개발을 위한 MVC Framework를 제공.
  • Spring MVC는 Model2 Architecture와 Front Controller Pattern을 Framework 차원에서 제공
  • Spring MVC Framework는 Spring을 기반으로 하고 있기 때문에 Spring이 제공하는 Transaction 처리나 DI 및 AOP등을 손쉽게 사용

Spring MVC 구성요소

  • DispatcherServlet (Front Controller)
    • 모든 클라이언트의 요청을 전달받음
    • Controller에게 클라이언트의 요청을 전달하고, Controller가 리턴한 결과값을 View에게 전달하여 알맞는 응답을 생성
  • HandlerMapping
    • 클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정
    • URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며, DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있음
  • Controller
    • 클라이언트의 요청을 처리한 뒤, Model을 호출하고 그 결과를 DispatcherServlet에 알려준다.
  • ModelAndView
    • Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
  • ViewResolver
    • Controller가 리턴한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정
  • View
    • Controller의 처리 결과를 보여줄 응답화면을 생성

Spring MVC 요청 흐름

Spring MVC 실행 순서

  1. DispatcherServlet이 요청을 수신
  • 단일 Front Controller Servlet
  • 요청을 수신하여 처리를 다른 컴포넌트에 위임
  • 어느 Controller에 요청을 전송할지 결정
  1. DispatcherServlet은 Handler Mapping에 어느 Controller를 사용할 것인지 문의
  • URL과 Mapping
  1. DispatcherServlet은 요청을 Controller에게 전송하고 Controller는 요청을 처리한 후 결과 리턴
  • Business Logic 수행 후 결과 정보(Model)가 생성되어 JSP와 같은 view에서 사용됨
  1. ModelAndView Object에 수행결과가 포함되어 DispatcherServlet에 리턴
  2. ModelAndView는 실제 JSP정보를 갖고 있지 않으며, ViewResolver가 논리적 이름을 실제 JSP이름으로 변환.
  3. View는 결과정보를 사용하여 화면을 표현함

Spring MVC 구현

  • web.xml - DispatcherServlet 설정

  • DispatcherServlet을 여러 개 설정 가능

  • 각 DispatcherServlet마다 각각의 ApplicationContext 생성

  • web.xml - 최상위 Root ContextLoader 설정

    • Context 설정 파일들을 로드하기 위해 web.xml 파일에 리스너 설정(ContextLoaderListener)

  • 리스너 설정이 되면 /WEB-INF/spring/root-context.xml 파일을 읽어서 공통적으로 사용되는 최상위 Context를 생성.

  • 그 외의 다른 컨텍스트 파일들을 최상위 어플리케이션 컨텍스트를 로드하기 위해서는...//

  • Application Context 분리

    • 어플리케이션 레이어에 따라 어플리케이션 컨텍스트 분리

  • Controller Class

  • Context 설정파일에 Controller 등록 (servlet-context.xml)

  • Controller와 response page 연결을 위한 ViewResolver 설정

Controller

  • @Controller와 @RequestMapping 선언

    • method 단위의 mapping이 가능

    • DefaultAnnotationHandlerMapping과 AnnotationHandlerAdapter를 사용함

  • Controller Class는 Client의 요청을 처리

  • @Controller 선언

    • Class 타입에 적용

  • Controller Class 자동 스캔

    • context:component-scan 선언
    • base-pachage에 설정된 package내의 class중 @Controller annotation이 적용된 클래스는 자동 스캔대상이 된다.

  • @RequestMapping 선언

    • 요청 URL mapping 정보를 설정
    • 클래스타입과 메소드에 설정 가능

  • Controller method의 HTTP method에 한정
    • 같은 URL 요청에 대하여 HTTP method(GET, POST..)에 따라 서로 다른 메소드를 mapping할 수 있음.

  • Controller method의 parameter type
    • Controller method의 parameter로 다양한 Object를 받을 수 있음



  • HTML form과 Command Object(DTO, VO,...)
    • SpringMVC는 form에 입력한 data를 JavaBean 객체를 이용해서 전송할 수 있음.

  • Command 객체를 List로 받기

  • @CookieValue annotation을 이용한 Cookie mapping

  • @RequestHeader annotation을 이용한 header mapping

  • @RequestBody parameter type

    • HTTP 요청 Body가 그대로 객체에 전달됨
    • AnnotationMethodHandlerAdapter에는 HttpMessageConverter 타입의 메시지 변환기가 기본으로 여러 개 등록되어 있음
    • @RequestBody가 붙은 parameter가 있으면 해당 미디어 타입을 확인 후 처리 가능한 변환기가 자동으로 객체로 변환시켜 줌
    • 주로 @ResponseBody와 함께 사용됨. -> 비동기처리
  • Servlet API 사용

    • HttpSession의 생성을 직접 제어해야 하는 경우
    • Controller가 Cookie를 생성해야 하는 경우
    • Servlet API를 선호하는 경우
      • javax.servlet.ServletRequest / javax.servlet.http.HttpServletRequest
      • javax.servlet.ServletResponse / javax.servlet.http.HttpServletResponse
      • javax.servlet.http.HttpSession

  • Controller Class에서 method의 return type 종류

View

View 지정

  • Controller에서는 처리 결과를 보여줄 View 이름이나 객체를 리턴하고, DispatcherServlet은 View이름이나 View 객체를 이용하여 view를 생성

    • 명시적 지정
    • 자동 지정

  • ViewResolver : 논리적 view와 실제 JSP파일 mapping

    • servlet-context.xml

  • View 이름 명시적 지정

    • ModelAndView와 String 리턴 타입

  • View 자동 지정

    • RequestToViewNameTranslator를 이용하여 URL로부터 view 이름을 지정
    • 자동 지정 유행
      • return type이 Model이나 Map인 경우
      • return type이 void이면서 ServletResponse나 HttpServletResponse 타입의 parameter가 없는 경우

  • redirect view

    • View 이름에 "redirect:" 접두어를 붙이면, 지정한 페이지로 redirect 됨

Model

Model 생성

  • View에 전달하는 데이터

    • @RequestMapping annotation이 적용된 method의 Map, Model, ModelMap
    • @RequestMapping method가 return하는 ModelAndView
    • @ModelAttribute annotation이 적용된 method가 return 한 객체
  • Map, Model, ModelMap을 통한 설정

    • method의 argument로 받는 방식
  • ModelAndView를 통한 Model 설정

    • Controller에서 처리결과를 보여줄 view와 view에 전달할 값(model)을 저장하는 용도로 사용
    • setViewName(String viewname)
    • addObject(String name, Object value);
  • @ModelAttribute annotation을 이용한 model data 처리

    • @RequestMapping annotation이 적용되지 않은 별도 method로 모델이 추가될 객체를 생성

요청 URL 매칭

  • 전체 경로와 Servlet기반 경로 매칭

    • DispatcherServlet은 DefaultAnnotationHandlerMapping Class를 기본으로 HandlerMapping 구현체로 사용
    • Default로 Context 내의 경로가 아닌 Servlet 경로를 제외한 나머지 경로에 대해 mapping

  • Servlet기반 경로 매칭

    • Servlet 경로를 포함한 전체 경로를 이용해서 매칭하려는 경우
    • @RequestMapping("/product/list")

  • @PathVariable annotation을 이용한 URI 템플릿

    • RESTful 방식
    • @RequestMapping Annotation 값으로 {템플릿변수}를 사용
    • @PathVariable Annotation을 이용해서 {템플릿변수}와 동일한 이름을 갖는 parameter를 추가

  • Ant 스타일의 URI패턴 지원

    • ? : 하나의 문자열과 대치
      • : 하나 이상의 문자열과 대치
    • ** : 하나 이상의 디렉토리와 대치

Spring Web MVC 동작 정리

Spring Web Application의 동작 원리

profile
야호

0개의 댓글