헤르메스 LIFE

[Spring] 스프링MVC – 개괄 본문

Spring Framework

[Spring] 스프링MVC – 개괄

헤르메스의날개 2012. 3. 12. 14:53
728x90
원문 :  http://blog.lul.kr/47 

DispatcherServlet

  1. 클라이언트 리퀘스트(HTTP request)를 해석해서 이를 처리할 컨트롤러로 넘긴다.

  2. 컨틀롤러에서 출력할 틀(뷰)과 내용(모델)을 받아 응답(HTTP response)을 구성한다.

  3. STS에서 MVC 템플릿으로 프로젝트를 만들 경우, "프로젝트/src/main/webapp/WEB-INF/web.xml" 파일에서 <servlet-name>이 "appServlet"인 엘리먼트에 지정된다.

  4. 모든 요청에 대해 공통적으로 진행해야 하는 전처리 작업을 등록해 이를 먼저 수행할 수 있다. 보안, 파라미터 조작, 인코딩 등.1.

  5. 모델은 이름과 오브젝트 값의 쌍이다.
    public class ModelMap extends LinkedHashMap<String, Object>

  6. 후처리기를 등록해두면 처리 후 응답을 보낸다.

  7. 스프링MVC에서 자동으로 처리하는 작업은 작동 방식을 모르면 파악하기 어렵다.

  8. 사용 전략. 그러니까 DI 할 수 있는 부분.

    1. HandlerMapping : URL과 요청 정보에서 어떤 핸들러를 사용할 것인지 결정.
      기본 등록(2) - 
      BeanNameUrlHandlerMapping, DefaultAnnotationHandlerMapping

    2. HandlerAdapter : DispatcherServlet이 컨틀롤러를 호출할 때 인터페이스를 통일하기 위한 어댑터.
      기본 등록(3) – 
      HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, AnnotationMethodHandlerAdapter

    3. HandlerExceptionResolver : 예외 처리 로직.
      기본 등록(3) – 
      AnnotationMethodHandlerExceptionResolver, ResponseeStatusExceptionResolver, DefaultHandlerExceptionResolver

    4. ViewResolver : 응답시 출력 방식 결정.
      기본등록(2) – 
      InternalResourceViewResolver(JSP), JstlView

    5. LocaleResolver : 지역 정보 결정. 세계화, 지역화 해주려면 필요하겠지.
      기본 등록 (1)– 
      AcceptHeaderLocaleResolver(HTTP 헤더 정보를 기준으로 지역정보 설정)

    6. ThemeResolver : 테마를 사용할 때. 쓸 것 같지 않다.

    7. RequestToViewNameTranslator : 컨트롤러가 뷰/뷰이름을 제공하지 않을 때 자동으로 뷰이름을 만들어준다.
      기본 등록(1) – 
      DefaultRequestToViewNameTranslator

  9. 서블릿 컨테이너가 사용하는 객체로, 스프링 애플리케이션 컨텍스트가 관리하는 스프링빈이 아니다.
    => 
    DispatcherServlet에 직접 DI는 하지 못하고 자체 보유한 서블릿 웹 애플리케이션 컨텍스트를 가지고 사용할 전략을 선택한다.

스프링 웹 테스트

  1. 그냥은 어렵다.
    : 서블릿 컨테이너, HttpServletRequest, HttpServletResponse, HTTP 세션, ServletContext, HTTP 쿠키, HTTP 헤더 등등을 만들어줘야 하니까 귀찮고 어렵다.

  2. 테스트용 목 오브젝트

    1. org.springframework.mock.web.MockHttpServletRequest

    2. org.springframework.mock.web.MockHttpServletResponse

    3. org.springframework.mock.web.MockHttpSession

    4. org.springframework.mock.web.MockServletConfig

    5. org.springframework.mock.web.MockServletContext

  3. DispatcherServlet을 상속해서 테스트용 서블릿을 정의해두면 편리하다.

컨트롤러 / 핸들러 어댑터

  1. 핸들러 어댑터를 빈으로 등록해두면 DispatcherServlet은 자동으로 감지해 기본 핸들러 어댑터를 대신한다.

  2. 여러 개의 핸들러 어댑터를 사용할 수 있다.

  3. 관두고 AnnotationMethodHandlerAdapter 쓰자.

    1. 컨트롤러 타입에 제약이 없다. 특정 클래스를 상속하거나 인터페이스를 구현할 필요가 없다.

    2. 하나의 컨트롤러 클래스가 여러 URL에 매핑될 수 있다. 메서드 단위로 매핑할 수 있다.

    3. 애노테이션을 쓰는데 꽤 많이 쓴다.

    4. 메서드, 파라미터 이름/타입/순서 등으로 기능이 바뀐다.

    5. 규칙과 관례를 따른다.
      : 코드에서 드러나지 않는 정보가 많다.

    6. 기본 핸들러 어댑터이니 따로 등록할 필요 없다.

핸들러 매핑

  1. DefaultAnnotationHandlerMapping : 컨트롤러 코드로 처리할 일을 애노테이션으로 처리할 수 있어서 매우 편리하다.

  2. 핸들러 매핑 전략

    1. 여러 개 등록 가능
      => 적용 손서를 지정하기 위해서는 
      order 속성을 설정해야 한다. 속성을 설정하려면 빈으로 따로 등록해야 가능하다.

    2. 기본 핸들러 : 핸들러 매핑 빈을 등록할 때 defaultHandler 속성을 지정하면 URL을 매핑할 빈을 못 찾을 때 사용한다. HTTP 404 에러에 대응하기 위해서라도 하나 등록해두자.

핸들러 인터셉터

  1. 컨트롤러 호출시의 부가기능은 AOP보단 핸들러 인터셉터가 낫다. 스프링MVC는 모든 컨트롤러에 동일한 핸들러 인터셉터를 적용할 수 있다.

  2. 컨트롤러 형식이 다양해 AOP 적용이 어렵다. DefaultAnnotationHandlerMapping을 쓰면 더 심하겠지.

  1. InternalResourceView, JstlView가 기본인데다 가장 많이 쓴다. 특별한 이유 없으면 웹에선 그냥 이거 쓰면 된다는 뜻.

  2. 다른 것도 많지만 XML이나 JSON 뷰 제공하는 정도만 쓸 수 있으면 될 듯.

뷰리졸버

  1. JSP를 사용할 때는 InternalResourceViewResolver 쓰는 것이 보통.
    : 기본 뷰리졸버지만 접미어, 접두어를 쓰기 위해선 빈으로 직접 등록해야 한다.

  2. ContentNegotiatingViewResolver

    1. 미디어타입을 기반으로 다른 뷰리졸버에 맡긴다. JSON이나 XML을 지원하려면 이걸 써야겠다.

    2.  미디어타입은 인터넷 미디어 타입2.이 아니라 html, xml, json등 짧은 이름을 쓴다.

    3. 미디어타입 결정법

      1. URL 확장자
        확장자가 없을 땐 어떻게 하지? 기본 뷰리졸버를 사용하나?

      2. 포맷을 지정하는 파라미터
        : 빈 등록시 favorParameter 속성을 true로 설정하면 format 변수값을 사용한다.

      3. HTTP 컨텐트 교섭에 사용하는 Accept 헤더 사용

      4. defaultContentType 속성에 설정한 기본 미디어타입 사용

    4. 사용할 미디어타입은 빈 등록시 mediaTypes 속성으로 등록해놔야 한다.
      : 값을 <map>으로 주며 <entry>의 "key"속성은 미디어타입이름, value는 인터넷 미디어 타입.

    5. 사용할 뷰리졸버는 viewResolvers 속성으로 등록해둬야 한다. 등록하지 않으면 서블릿컨텍스트에 등록된 ViewResolver 타입 빈을 모두 사용한다.

    6. defaultView 속성에 등록된 기본 뷰는 뷰리졸버 조회 결과와 상관없이 후보 뷰가 된다.

    7. 사용자가 요청한 미디어 타입, 컨트롤러가 반환한 뷰 이름, 뷰리졸버에 등록된 뷰 조합으로 실재 사용할 뷰를 결정한다.

    8. JSON, XML을 뷰로 쓸 때의 설정 예제는 1108쪽 참조.

핸들러 예외 리졸버

  1. 기본 등록 리졸버

    1. AnnotationMethodHandlerExceptionResolver

    2. ResponseStatusExceptionResolver

    3. DefaultHandlerExceptionResolver

  2. AnnotationMethodHandlerExceptionResolver

    1. 메서드에 @ExceptionHandler 애노테이션으로 지정.

    2. 애노테이션의 값으로 처리할 예외를 지정하면 평범한 컨트롤러처럼 작동한다.

  3. DefaultHandlerExceptionResolver

    1. 스프링이 내부적으로 사용하는 예외가 발생할 경우 HTTP 에러 메시지로 변환해주는 예외 리졸버.

    2. 핸들러 예외 리졸버를 별도로 등록할 경우엔 같이 등록해두는 것이 좋다.

지역정보 리졸버

  1. 디폴트는 보통은 브라우저 설정을 따르는 HTTP 헤더의 지역정보를 사용하는 AcceptHeaderLocaleResolver.

  2. 사용자가 직접 변경할 수 있도록 하려면 SessionLocaleResolver나 CookieLocaleResolver를 사용한다.

  3. 지역정보 사용처

    1. JstlView : <fmt:> 메시지

    2. ResourceBundleViewResolver : views.properties 파일 이름 결정

    3. JSP, 프리마커 등에서 스프링 폼 태그 : 데이터, 안내문 출력시 사용할 리소스 번들 파일 선택

멀티파트 리졸버

  1. CommonsMultipartResolver 하나만 지원.

  2. 기본 설정 없음.

  3. 사진이나 동영상, 오디오에서나 쓸텐데 한동안 쓸 일 없어보인다.

참고

  1.  "토비의 스프링3", 이일민 지음, 에이콘 출판사.
    [
    http://www.acornpub.co.kr/book/toby-spring3]
    기본 참고자료.

  2. [위]Internet media type - Wikipedia, the free encyclopedia
    [http://en.wikipedia.org/wiki/Internet_media_type]



728x90