홍이의 개발 노트

Spring3 @MVC 사용 했을 때 매개변수 타입별 리턴되는 객체 본문

개발이야기/스프링(Spring)

Spring3 @MVC 사용 했을 때 매개변수 타입별 리턴되는 객체

코바 2011. 6. 25. 23:03


@MVC가 어떻게 움직이는지 궁금 해서 소스를 보고 있는 중에 매개변수 타입에 따라 리턴 되는 객체를 컨트롤 하는 부분을 찾았다.

AnnotationMethodHandlerAdapter 클래스 파일 안에 ServletHandlerMethodInvoker 이라는 클래스 안에서 resolveStandardArgument의 이 메소드 안에서 이부분을 찾았다.

 @Override
  protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
   HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
   HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);

   if (ServletRequest.class.isAssignableFrom(parameterType) ||
     MultipartRequest.class.isAssignableFrom(parameterType)) {
    Object nativeRequest = webRequest.getNativeRequest(parameterType);
    if (nativeRequest == null) {
     throw new IllegalStateException(
       "Current request is not of type [" + parameterType.getName() + "]: " + request);
    }
    return nativeRequest;
   }
   else if (ServletResponse.class.isAssignableFrom(parameterType)) {
    this.responseArgumentUsed = true;
    Object nativeResponse = webRequest.getNativeResponse(parameterType);
    if (nativeResponse == null) {
     throw new IllegalStateException(
       "Current response is not of type [" + parameterType.getName() + "]: " + response);
    }
    return nativeResponse;
   }
   else if (HttpSession.class.isAssignableFrom(parameterType)) {
    return request.getSession();
   }
   else if (Principal.class.isAssignableFrom(parameterType)) {
    return request.getUserPrincipal();
   }
   else if (Locale.class.equals(parameterType)) {
    return RequestContextUtils.getLocale(request);
   }
   else if (InputStream.class.isAssignableFrom(parameterType)) {
    return request.getInputStream();
   }
   else if (Reader.class.isAssignableFrom(parameterType)) {
    return request.getReader();
   }
   else if (OutputStream.class.isAssignableFrom(parameterType)) {
    this.responseArgumentUsed = true;
    return response.getOutputStream();
   }
   else if (Writer.class.isAssignableFrom(parameterType)) {
    this.responseArgumentUsed = true;
    return response.getWriter();
   }
   return super.resolveStandardArgument(parameterType, webRequest);
  }

 -> super.resolveStandardArgument(parameterType, webRequest);
HandlerMethodInvoker.class
 protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
  if (WebRequest.class.isAssignableFrom(parameterType)) {
   return webRequest;
  }
  return WebArgumentResolver.UNRESOLVED;
 }

대충 요약 해보면

 매개변수 타입  리턴되는 객체
 ServletRequest.class, MultipartRequest.class  webRequest.getNativeRequest(parameterType);
 ServletResponse.class  webRequest.getNativeResponse(parameterType);
 HttpSession.class  request.getSession();
 Principal.class  request.getUserPrincipal();
 Locale.class  RequestContextUtils.getLocale(request);
 InputStream.class  request.getInputStream();
 Reader.class  request.getReader();
 OutputStream.class  response.getOutputStream();
 Writer.class  response.getWriter();
 WebRequest.class  NativeWebRequest

HandlerMethodInvoker 클래스를 상속하여 ServletHandlerMethodInvoker 클래스에서 구현 하고 있으며
AnnotationMethodHandlerAdapter.class를 사용 했을 시에 기본으로 지원하는 타입별 리턴되는 객체 정보이다.

후에는 Annotation에 따라 리턴하는 부분도 살펴 봐야 겠다.