Spring Controller (XML 방식), MVC

BBang·2022년 7월 19일
0

솔루션 연동

목록 보기
2/2

2. Spring Controller

➡️ 솔루션 Core의 Spring (core, webmvc) 3.2.5 를 기반으로 작성하였습니다

노션으로 작성한 원문

1. Controller

1-1. Spring의 Controller

출처: [Spring Docs](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-servlet)

출처: Spring Docs

  • MVC 패턴을 따라 UI로부터 비즈니스 로직과 프레젠테이션 로직의 분리를 위해 사용합니다
  • DispatchServlet을 (Front-Controller) 모든 HTTP 요청을 받아, 해당 요청에 맞는 Controller에 매핑하여 처리합니다
    • web.xml 방식으로 요청과 매핑 등록 하는 방법
      <web-app>
      		<servlet>
              <servlet-name>Web</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <load-on-startup>1</load-on-startup>
          </servlet>
      
          <servlet-mapping>
              <servlet-name>Web</servlet-name>
              <url-pattern>*.do</url-pattern>
          </servlet-mapping>
      		....
      </web-app>
    • @Controller와 @RequestMapping 애너테이션 방식
      • component-scan의 base-package 하위에 포함되어 있어야 Bean 등록

        @Controller
        public class HelloWorldController {
        
            @RequestMapping("/hello")
            public String helloWorld(Model model) {
                model.addAttribute("message", "Hello World!");
                return "helloWorld";
            }
        }

1-2. 솔루션내에서 Controller - URL 매핑 구조 분석

  1. web.xml

    <context-param>
            <param-name>**contextConfigLocation**</param-name>
            <param-value>
    			        ....
    			        classpath:/config/**applicationContext-web.xml**
    				</param-value>
    </context-param> 

    web.xml에 을 정의하여, Servlet 전역에서 사용 가능한 파라미터 값으로 등록할 수 있습니다.

    여기서 의 contextConfigLocation는 Spring이 동작하기 위한 설정 파일의 위치를 알려주는 파라미터입니다.
    해당 값으로 web 관련 설정을 관리하는 applicationContext-web.xml 을 등록합니다.

  2. applicationContext-web.xml

    
    <!-- ******************************************************************* -->
        <!-- * URL CONTROLLER MAPPING                                          * -->
        <!-- ******************************************************************* -->
        <!--
    	      for spring mvc handlerMapping..
          handlerMapping connect each controller.
        -->
    <import resource="classpath:/config/web/**webContext-controllers.xml**" />  **3-1) Bean 관련 설정 xml**
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.**SimpleUrlHandlerMapping**">
            <property name="interceptors">
                <list>
                    <ref bean="localeChangeInterceptor"/>   **사용자 언어별 i18n(국제화) 다국어 처리**
    								....
                </list>
            </property>
            <property name="mappings">
                <!-- property -->
                <bean class="org.springframework.beans.factory.config.**PropertiesFactoryBean**">
                    <property name="locations">
                        <list>
                            <value>classpath:/config/web/**webContext-controllers.properties**</value>  **3) 매핑 URL 정의 properties**
    													....
                        </list>
                    </property>
                </bean> 
    • HandlerMapping 인터페이스의 구현체 중, SimpleUrlHandlerMapping 를 bean으로 등록하여 각각의 URL별로 매핑 처리를 합니다.
      기본적인 XML 구성은 *아래와 같이 사용하지만, PropertiesFactoryBean 를 사용하여 여러 파일로 분리된 설정들을 <java.util.Properties>
      타입으로 변환 후 일괄 등록 합니다.
    • *아래: SimpleUrlHandlerMapping의 기본적 XML 구성 방법
      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="mappings">
              <value>
                  /simpleUrlExample=example
                  /*/simpleUrlExample=example
              </value>
          </property>
      </bean>
      <bean id="example" class="com.baeldung.ExampleController" />
  3. webContext-controllers.properties 3) 매핑 URL 정의 properties

#------------------------------------------------------------------------------
# Main
#------------------------------------------------------------------------------
/main/main.do=mainController
/mobile/main.do=mobileController
#------------------------------------------------------------------------------
# Auth
#------------------------------------------------------------------------------
/auth/login/loginView.do=loginController
/auth/login/login.do=loginController
/auth/login/checkSessionKey.do=loginController
/auth/login/doAutoLogin.do=loginController
      ....

3-1. webContext-controllers.xml 3-1) Bean 관련 설정 xml

<!-- for parameter multiaction -->
    URL에서, 하단의 Resolver의 <value>에 해당 하는 값으로 메서드에 매핑하는 Spring 객체
    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
        <property name="paramName">
            <value>method</value>
        </property>
    </bean>

    <!--
     **************************************************************************
     * DEFAULT Controller
     **************************************************************************
     -->
    <bean name="multiActionFormController" class="destiny.framework.web.mvc.MultiActionFormController" autowire="byName" >
    </bean>
    <!--
     **************************************************************************
     * COMMON Controller
     **************************************************************************
     -->
  • webContext-controllers.properties에서 정의한 각각의 (요청↔컨트롤러) 매핑을 MultiActionController를 이용하면,
    여러 요청명에 대해 한 개의 컨트롤러에 구현된 각 메서드로 처리할 수 있어 편리합니다.
  • ParameterMethodNameResolver 에서 method 와 같이, URL에서 파싱할 명칭을 지정하고,
    *String methodName = this.methodNameResolver.getHandlerMethodName(request);* 
    과 같이 request 에서 메서드 명칭을 추출해 사용한다.
    • 상세한 과정 → MultiActionFormController.java
      최상단 주석 내용.
      /**
       * MultiActionController는 SimpleFormController의 기능과 다중액션 처리가 가능한
       * MultiActionController의 기능을 합친 Controller이다.<br>
       * 각각의 메소드 구현시에는 다음과 같은 내용을 포함한다.<br>
       *
       * 1. 데이터 binding
       * 2. 유효성 검사
       * 3. 처리
       * 4. 결과 Response
      */
      
      .... 중략 ....
      
      1. 아래의 생성자로 인해 초기화 
      /**
       * 생성자
       */
      public MultiActionFormController() {
      	this.delegate = this;
      	registerHandlerMethods(this.delegate);
      }
      
      ...
      2. private final Map<String, Method> handlerMethodMap 에 등록하여 둠
      private void registerHandlerMethod(Method method) {
      		if (destinyLogger.isDebugEnabled()) {
      			destinyLogger.debug("Found action method [" + method + "]");
      		}
      		this.handlerMethodMap.put(method.getName(), method);
      }
      	........
      /**
      	 * Determine a handler method and invoke it.
      	 * request 정보를 사용하여 MethodNameResolver로 메소드명을 찾아 호출한다.
      	 *
      	 * @see MethodNameResolver#getHandlerMethodName
      	 * @see #invokeNamedMethod
      	 * @see #handleNoSuchRequestHandlingMethod
      	 */
      	protected ModelAndView process(HttpServletRequest request, HttpServletResponse response) throws Exception {
      		try {
      			String methodName = this.methodNameResolver.getHandlerMethodName(request);
      			return invokeNamedMethod(methodName, request, response);
      		} catch (NoSuchRequestHandlingMethodException ex) {
      			return handleNoSuchRequestHandlingMethod(ex, request, response);
      		}
      	}
      3. process()가 호출되면  
      -> invokeNamedMethod()
      -> Method method = (Method) this.handlerMethodMap.get(methodName);
      -> Object returnValue = method.invoke(this.delegate, params.toArray(new Object[params.size()]));
      위의 과정과 같이 호출 되어 실행 된다.
    • Spring 4.3 부터 annotaion 방식의 매핑을 권장하여 deprecated 되었다.

2. RestTemplate

2-1. RestTemplate란?

“REST API를 호출할 수 있는 Spring 3.0 + 내장 클래스” - 즉, REST 요청을 간단히 하도록 도와주는 도구의 개념으로, 여러 견본 틀(Template)이 들어 있다.

특징

  • RESTful 형식에 맞추어짐
  • Server to Server 통신에 사용
  • HTTP 요청 후 JSON, XML, String 과 같은 응답을 받아 처리
  • Blocking I/O기반의 동기 방식 → Thread가 많아지는 문제

2-2. RestTemplate 사용 방법

➡️ 추후 솔루션 연동 모듈 개발 후 보완할 예정입니다

RestTemplate 사용 방법 정리

https://jung-story.tistory.com/132

<!-- DriverManagerDataSource는 커넥션(connection pool)을 지원하지 않는다. -->
<!-- 그러므로 Apache가 제공하는 BasicDataSource를 사용한다. -->
profile
Java

0개의 댓글