[Spring Framework ④] Spring Tutorial 따라하기

개발 노트 2008. 7. 21. 11:05 posted by 무병장수권력자


Developing a Spring Framework MVC application step-by-step

작성자 : 김문규
최초 작성일 : 2008.07.22

다음의 내용은 spring framework 공식 홈페이지(www.springframework.org)의 튜토리얼을 정리한 것입니다.
저와 같은 spring 초보자를 위해서 개인적인 방식으로 재구성하였습니다. 처음 spring을 접하는 분들이 학습에 참고 자료로 활용하시길 바랍니다.  

코드 자체의 세세한 부분은 다루지 않을 것입니다. spring 프레임워크을 이용해서 기본적인 웹 서비스를 구현하는 방법을 보여주는 것에 주력할 것입니다. 따라서, 이 글에서는 설정 파일의 작성에 대해서 중점적으로 논의하겠습니다.

(이 글은 기본적인 자바 웹 개발에 경험이 있는 분을 기준으로 작성합니다.)

1. Source Structure


사용자 삽입 이미지

튜토리얼치고는 소스와 설정파일이 많은 편입니다. 이는 Spring 자체가 MVC를 지원하는 프레임워크이고 설정 파일도 논리적으로 분리하는 것을 권장하기 때문입니다. 튜토리얼에서도 이 개념은 유지하고 있습니다. 이는 차차 설명하기로 합니다.

1) 소스 구조
 최상위 폴더는 아래와 같습니다.
┌ bin - 컴파일된 class 저장
├ db - DB와 관련된 스크립트
├ src - 말 그대로 소스들
└ war - WAS에 deploy될 것들
을 가리킵니다.

각각의 폴더에 대해 조금 더 자세히 알아보도록 하겠습니다. 조금 생소한 부분만 설명합니다. 너무 쉬운 부분은 넘어가도록 하겠습니다.

/src
springapp은 최상위 package이고 여기에 domain, repository, service, web이라는 하위 package가 존재합니다. 아래의 기준으로 클래스 모듈을 위치 시킵니다.
. domain - data 모델링 객체
. repository - DAO 과 관련된 객체
. service - 비지니스 로직
. web - web 프리젠테이션 관련 객체

□ /war
. /WEB-INF/tld/spring-form.tld
spring에서 사용할 수 있는 tag library의 정의입니다. tag library는 기존 jsp에서 사용하던 tag를 spring에서 재정의 한 것으로 좀 더 사용이 편합니다.
. /WEB-INF/*.xml
설정 파일들입니다. 실질적으로 spring을 사용함에 있어 가장 먼저 이해하여야 할 부분입니다. 뒤에서 자세히 설명하도록 하겠습니다.
























2. Configuration 관련
1) web.xml
  □ org.springframework.web.context.ContextLoaderListener
     . 계층별로 나눈 xml 설정파일을 web.xml에서 load되도록 등록할 때 사용.
     . 기본값으로 applicationContext.xml을 사용함
   예시)
   <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
              /WEB-INF/mars-ibatis.xml
              /WEB-INF/mars-service.xml
         </param-value>
   </context-param>

  □ <taglib>
     . spring tag library의 위치 설정

2) applicationContext.xml
  □ ContextLoaderListener(또는 ContextLoaderServlet)가 ApplicationContext를 만들 때 사용

  □ ApplicationContext란, 웹에 독립적인 애플리케이션의 모든 영역(dao, service, manager, 기타 등등) 에 대한 정의를 말합니다.

  □ connection pool에 대한 정의
     . org.apache.commons.dbcp.BasicDataSource
        : datasource를 정의, db driver, 보안 정보등을 알림
     . org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
        : 읽어들일 property 파일에 대한 정보를 알림

  □ transaction에 대한 지원을 위한 한 방법
  이 부분은 나를 비롯한 spring 초보자의 입장에서 아직 이해하기 어려운 부분이기 때문에 아래의 코드가 AOP 기법을 활용하여 transaction을 지원하고 있다는 것만 알아두기로 하자.


3) springapp-servlet.xml
  □ DispatcherServlet이 WebApplicationContext를 만들 때 사용

  □ WebApplicationContext이란, 특정 웹(DispatcherServlet)에 종속되는 영역(Controller 및 각종 웹관련 설정 bean들)에 대한 정의를 말합니다. (ApplicationContext과의 차이를 확인하세요.)

  □ 주로 웹 페이지 리소스에 대한 핸들러 클래스 빈의 정의가 존재합니다.

  □ org.springframework.context.support.ResourceBundleMessageSource
     . message.properties 파일에 정의된 속성 값을 사용할 수 있도록 함
     . 국제화에 응용되면 아주 좋아 보입니다~

  □ org.springframework.web.servlet.view.InternalResourceViewResolver
     . prefix와 suffix 값의 정의에 따라 리소스 표현을 축약할 수 있도록 함.
     예시)
    <bean id="viewResolver"
     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
          value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>       
    </bean>
     라고 선언하면 /WEB-INF/jsp/testfile.jsp은 비지니스 로직 내부에서 testfile로 간단하게 표현 가능 함



3. Inside Code
spring web service는 아래의 흐름을 가집니다.
①(사용자) jsp 호출
②(웹서버) 설정 검색
③(웹서버) 요청 처리 클래스 호출
④(웹서버) 비지니스 로직 수행
⑤(웹서버) view로 결과 반환
⑥(사용자) jsp 화면


1) Controller
  □ 사용자에게 jsp가 호출되면 xxxxx-servlet.xml에 정의된 클래스 빈을 호출합니다.

  □ 예제에는 DB에 있는 정보를 가져다가 저장하는 페이지와 원하는 값을 저장하는 페이지 두가지가 있습니다. hello.jsp가 전자에 해당하고 priceincrease.jsp는 후자에 해당합니다. 각 페이지를 확인하시고 각 페이지의 핸들러 클래스 빈을 springapp-servlet.xml에서 추적해 보시길 바랍니다.

  □ 일반적인 controller의 사용 예 : springapp.web.InventoryController.java
     . 일단 기본적인 Controller의 예시로 Controller interface를 구현합니다. 대부분의 경우에 사용하면 되고, request에 대한 처리를 위해 handleRequest()로 진입합니다.
     . 여기서 비지니스 로직을 처리한 후, ModelAndView 객체를 반환합니다. 이 때 넘기고자 하는 데이터를 파라미터에 담아서 보낼 수 있습니다.

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String now = (new java.util.Date()).toString();
        logger.info("returning hello view with " + now);
        Map<String, Object> myModel = new HashMap<String, Object>();
        myModel.put("now", now);
        myModel.put("products", this.productManager.getProducts());
        return new ModelAndView("hello", "model", myModel);
    }

  □ 폼을 처리하는 controller의 예 : springapp.web.PriceIncreaseFormController.java
     .  jsp가 폼을 다루고 있을 경우에는 SimpleFormController Class를 상속하여 확장합니다.
     . onSubmit()은 jsp에서 버튼이 눌려진 경우 콜백 지점을 가리키도 formBacjingObject는 폼에 기본값을 저장하고자 할 때 사용합니다.
     . formBackngObject는 domain에 존재하는 모델링 객체를 이용하고 있음에 주의합니다.

    public ModelAndView onSubmit(Object command)
            throws ServletException {
        int increase = ((PriceIncrease) command).getPercentage();
        logger.info("Increasing prices by " + increase + "%.");
        productManager.increasePrice(increase);
        logger.info("returning from PriceIncreaseForm view to " + getSuccessView());
        return new ModelAndView(new RedirectView(getSuccessView()));
    }
    protected Object formBackingObject(HttpServletRequest request) throws ServletException {
        PriceIncrease priceIncrease = new PriceIncrease();
        priceIncrease.setPercentage(20);
        return priceIncrease;
    }

2) Model
  □ 비지니스 로직을 수행 중에 데이터를 읽고 쓰고 수정하고 삭제하기 위해 데이터 베이스에 대한 접근을 수행합니다. 해당 예제는 HSQLDB를 사용하고 있으며 이를 JDBC로 연결하고 있습니다.

  □ JDBC와 관련하여 몇개의 클래스를 추가 지원하고 있지만 미미합니다. 실제로는 iBatis, Hibernate를 지원하고 있다는 것이 더 큰 특징이라 하겠습니다.

  □ 간단한 예제를 확인하시길 바라며, 이 부분은 설명하지 않겠습니다.

3) View
  □ 예제에서는 JSTL(Java Server page Standard Tag Library)이라는 것을 사용하고 있기에 약간의 공부가 필요합니다.
     . 예를 들면, <input type='text' /> 이렇게 사용하던 것을 <form:input path="percentage"/> 이런식으로 사용합니다.
     . iteration, print 같은 주요 제어문과 폼이 tag로 정리되어 있습니다.
     . 더 자세한 내용은 http://java.sun.com/products/jsp/jstl/ 참조 바랍니다.



4. Ending
이 문서의 목적은 spring을 자세하게 설명하는 것이 아니라, 튜토리얼데로 spring MVC를 간단하게 한번 만들어 보는 것에 그 의의를 두고 있습니다. 튜토리얼과의 차별화를 위해 Top-down 방식을 취했으며 전체의 구성을 설명하고자 했습니다.
저도 약 2주전부터 틈틈히 공부하면서 알게된 것을 정리한 것이라 부족한 면이 많습니다. 시간이 나는데로 잘못된 부분은 수정하고 필요한 내용은 추가하겠습니다.
긍정적이고 발전적인 커멘트를 기다립니다. 감사합니다.