Spring MVC JSON

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물: Quick Start에서 SpringMVC/JSON/Ext-js 개발하기
  • 작성자: 서경진
  • 최초작성일 : 2008/07/04
  • 최종작성일 : 2008/07/14

Copyright © 2008 Daewoo Information Systems Co., Ltd.

그림:information.gif

  • 이 문서에 해당하는 프로젝트는 Maven Project이므로 M2 Plugin을 활용한 라이브러리 관리 및 Build 및 Deploy 관리가 가능하다.
  • Quick Start는 jetty와 hsql 기반이지만 이 프로젝트는 tomcat과 postgresql로 구현되었으므로 mvn에서 Build 및 Deploy를 위한 명령을 제공한다.

그림:forbidden.gif

  • 이 문서는 현재 작성중에 있습니다.

목차

[편집] 프로젝트 환경 구축하기

  • 다음 Quick Start 매뉴얼에 따라 Spring MVC 기반으로 Ext-js, JSON을 적용한 웹 어플리케이션 환경을 구축할 수 있다.

그림:information.gif

  • Local PC에 Maven을 위한 라이브러리 Repository를 설정하기 위하여 해당 사용자의 개인디렉터리에 있는 .m2 폴더에 설정파일(setting.xml)에 사용자의 환경에 맞도록 설정한다.
Maven Local Repository 설정파일
Maven Local Repository 설정파일
  • 다음은 .m2 디렉터리에 있는 setting.xml에 설정된 내용이다.
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
 
    <localRepository>d:\maven\repository</localRepository> <!--내 PC의 Local Repository가 사용할 디렉터리의 위치정보를 설정한다.-->
 
    <mirrors>
        <mirror>
            <id>mirror-of-central</id>
            <mirrorOf>*</mirrorOf>
            <name>Mirror of central repository</name>
            <url>http://scm.dev.daewoobrenic.co.kr/artifactory/repo</url> <!--central의 cache 역할을 수행하는 repository의 위치정보를 설정한다.-->
        </mirror>
    </mirrors>
 
    <profiles>
        <profile>
            <id>mirroringCentral</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>http://scm.dev.daewoobrenic.co.kr/artifactory/repo</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>snapshots</id>
                    <url>http://scm.dev.daewoobrenic.co.kr/artifactory/repo</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>central</id>
                    <url>http://scm.dev.daewoobrenic.co.kr/artifactory/plugins-releases</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </pluginRepository>
                <pluginRepository>
                    <id>snapshots</id>
                    <url>http://scm.dev.daewoobrenic.co.kr/artifactory/plugins-snapshots</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
        <profile>
            <id>oracle</id>
            <properties>
                <db.groupId>com.oracle</db.groupId>
                <db.artifactId>ojdbc14</db.artifactId>
                <db.version>10.2.0.3.0</db.version>
                <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName>
                <jdbc.url>jdbc:oracle:thin:@DB서버IP:포트번호:SID</jdbc.url>
                <jdbc.username>사용자ID</jdbc.username>
                <jdbc.password>패스워드</jdbc.password>
            </properties>
        </profile>
    </profiles>
</settings>
  • 로컬 저장소를 <localRepository>d:\maven\repository</localRepository>와 같이 저장하면 다음과 같이 Maven 저장소에서 받은 라이브러리가 이 위치에 저장된다.
  • 이와 같이 로컬 저장소를 설정하지 않으면 디폴트인 .m2 디렉터리에 라이브러리가 저장된다.
로컬 저장소에 저장된 라이브러리
로컬 저장소에 저장된 라이브러리
  • command(cmd.exe) 콘솔을 실행시켜서 다음과 같이 명령을 입력하면 pom.xml에 정의된 hsql에 table을 생성하여 jetty가 구동된다.
  • 위에서 정의된 내용에 따라 memo 웹 어플리케이션이 구동되고 다음과 같이 웹브라우저로 확인이 된다면 SpringMVC + Spring + IBatis 아키텍처를 가진 Maven 프로젝트 기반으로 개발할 수 있는 환경이 구축된 것이다.
memo 웹 어플리케이션 구동 화면
memo 웹 어플리케이션 구동 화면

그림:information.gif

  • 샘플 웹 어플리케이션의 개발환경
    • UI: Ext-js 2.0, JSP
    • Presentation Tier: Spring MVC, Spring MVC Annotation (SpringFramework 2.5.4)
    • Business Tier: SpringFramework 2.5.4
    • Persistence Tier: ibatis 2.3.0
    • DB: PostgreSQL 8.3.3
    • IDE: Eclipse Platform 3.3.0 (WTP, DTP 적용)
    • Build & Deploy: Maven
    • WAS: Tomcat 5.0
  • 위의 개발환경 정보에 따라 예제 어플리케이션의 개발은 jetty 환경이 아닌 Tomcat 환경에서 구현된다.
  • 따라서 소스개발 이후 Tomcat을 구동시키기 전에 다음과 같은 일련의 명령을 DOS Command 콘솔에서 실행해야 한다.


해당프로젝트위치> mvn compiler:compile

   : 수정된 내용에 대하여 Maven 기반의 컴파일을 수행한다. (Target에 저장)

해당프로젝트위치> mvn war:inplace

   : Tomcat 환경에서 구동하기 위해 Web Root (src/main/webapp/WEB-INF의 lib와 classes 디렉터리에 라이브러리와 클래스를 복사한다.)

해당프로젝트위치> mvn eclipse:eclipse

   : pom.xml로부터 eclipse 프로젝트 파일(.project)을 생성한다. 즉 라이브러리를 buildpath에 설정한다.
  • Quick Start에서 SpringMVC/JSON/Ext-js로 개발할 간단한 웹 어플리케이션은 다음과 같다.
Ext-js 기반 샘플 웹 어플리케이션 화면
Ext-js 기반 샘플 웹 어플리케이션 화면
  • 위의 샘플 웹 어플리케이션은 상단의 메뉴바에서 해당 메뉴를 클릭하면 부서리스트 조회화면이 우측 Div에 출력된다.
  • 우측 상단에 조회버튼을 클릭하면 서버에서 부서리스트를 조회하여 그 결과를 다음과 같이 JSON 데이터로 출력한다.
조회 Request에 대한 JSON Response
조회 Request에 대한 JSON Response
  • JSON 데이터를 받으면 위의 샘플 웹 어플리케이션 화면과 같이 데이터를 그리드에 바인딩한다.

[편집] Spring MVC Request Lifecycle

  • 샘플 웹 어플리케이션 구현은 Spring MVC Request Lifecycle을 기반으로 순서대로 진행될 것이다.
SpringMVC Request 처리 Sequence Diagram
SpringMVC Request 처리 Sequence Diagram
  • Spring MVC 기반의 웹 어플리케이션은 아키텍처 구성에 따라 일반적으로 다음과 같은 순서대로 설정파일을 구성한다.
1. Request에 따른 DispatcherServlet의 요청 패턴을 정의 및 설정한다. => web.xml
2. DispatcherServlet이 참조할 HandlerMapping을 설정한다. => 서블릿명-servlet.xml (필요하다면 새로운 HandlerMapping 구현 가능)
   (명시적으로 설정하지 않으면 Spring MVC는 BeanNameUrlHandlerMapping을 디폴트 HandlerMapping으로 설정)
3. HandlerMapping에 Controller mapping에 대한 정보를 설정한다.
3.1 Annotation을 사용하지 않는 경우, 서블릿명-servlet.xml에 mapping 정보를 설정한다.
3.2 Annotation을 사용하는 경우, Spring MVC Annotation을 사용하여 해당 클래스에 설정한다.
4. View를 처리하기 위한 ViewResolver 및 View에 대하여 설정한다.
5. Spring의 Application Context에 Controller, Service, Dao를 등록하기 위해 설정한다.
5.1 Annotation을 사용하지 않는 경우,
5.1.1 Controller를 Bean으로 등록한다.: 서블릿명-servlet.xml의 HandlerMapping에 설정된 Controller 클래스를 등록한다.
5.1.2 Service와 Dao를 모두 Bean으로 등록한다.

5.2 Annotation을 사용하는 경우,
5.2.1 Controller 클래스에 @Controller Annotation을 적용하고 서블릿명-servlet.xml의 Controller에 대한 Component 스캐닝을 통해 자동으로 bean을 등록한다.
5.2.2 Service 클래스에 @Component Annotation을 적용하고 applicationContext-어플리케이션명.xml의 Service에 대한 Component 스캐닝을 통해 자동으로 bean을 등록한다.
5.2.3 Dao 클래스는 SqlMapClient에 대한 등록문제로 Annotation을 사용하지 않는 방법과 같이 applicationContext-어플리케이션명.xml에 Bean으로 직접 등록한다.
  • 위에 명시된 순서는 아키텍처 구조나 적용된 구성요소에 따라 변경이 필요할 수 있다.

[편집] 연동 설정방법

1. Request에 따른 DispatcherServlet의 요청 패턴을 정의 및 설정한다. => web.xml
  • Request에 따른 DispatcherServlet의 요청 패턴 정의 및 설정
1. JSTL을 활용한 JSP 페이지를 출력할 경우 .action 패턴 적용
2. JSON을 활용한 Ext-js 페이지를 출력할 경우 .json 패턴 적용
  • 웹 설정파일인 web.xml에 다음과 같이 설정한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext*.xml</param-value>
	</context-param>
 
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
 
	<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
 
	<servlet>
		<servlet-name>jsonview</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>annotated</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>jsonview</servlet-name>
		<url-pattern>*.json</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>annotated</servlet-name>
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>
</web-app>
2. DispatcherServlet이 참조할 HandlerMapping을 설정한다. => 서블릿명-servlet.xml (필요하다면 새로운 HandlerMapping 구현 가능)
   (명시적으로 설정하지 않으면 Spring MVC는 BeanNameUrlHandlerMapping을 디폴트 HandlerMapping으로 설정)
  • HandlerMapping으로 BeanNameUrlHandlerMapping을 사용할 경우는 서블릿명-servlet.xml에 명시적으로 설정할 필요가 없다.
  • 만약 BeanNameUrlHandlerMapping이 아닌 다른 HandlerMapping을 사용할 경우에는 다음과 같이 명시적으로 설정한다.
  • 다음은 Spring MVC 매뉴얼에 있는 SimpleUrlHandlerMapping을 적용하는 방법이다.
  • web.xml
<web-app>
    ...
    <servlet>
        <servlet-name>sample</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <!-- maps the sample dispatcher to *.form -->
    <servlet-mapping>
        <servlet-name>sample</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>
 
    <!-- maps the sample dispatcher to *.html -->
    <servlet-mapping>
        <servlet-name>sample</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    ...
</web-app>
  • 서블릿명-servlet.xml
<beans>
        
    <!-- no 'id' required, HandlerMapping beans are automatically detected by the DispatcherServlet -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /*/account.form=editAccountFormController
                /*/editaccount.form=editAccountFormController
                /ex/view*.html=helpController
                /**/help.html=helpController
            </value>
        </property>
    </bean>
 
    <bean id="helpController"
          class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
 
    <bean id="editAccountFormController"
          class="org.springframework.web.servlet.mvc.SimpleFormController">
        <property name="formView" value="account"/>
        <property name="successView" value="account-created"/>
        <property name="commandName" value="Account"/>
        <property name="commandClass" value="samples.Account"/>
    </bean>
<beans>
3. HandlerMapping에 Controller mapping에 대한 정보를 설정한다.
3.1 Annotation을 사용하지 않는 경우, 서블릿명-servlet.xml에 mapping 정보를 설정한다.
3.2 Annotation을 사용하는 경우, Spring MVC Annotation을 사용하여 해당 클래스에 설정한다.

[편집] Controller

[편집] ViewResolver

[편집] JstlViewResolver

[편집] XmlViewResolver

[편집] MiplatformViewResolver

[편집] View

[편집] JstlView

[편집] JsonView

[편집] MiplatformView