From JCFWiKi
|
|
- 산출물: Quick Start에서 SpringMVC/JSON/Ext-js 개발하기
- 작성자: 서경진
- 최초작성일 : 2008/07/04
- 최종작성일 : 2008/07/14
Copyright © 2008 Daewoo Information Systems Co., Ltd.
|
|
|
- 이 문서에 해당하는 프로젝트는 Maven Project이므로 M2 Plugin을 활용한 라이브러리 관리 및 Build 및 Deploy 관리가 가능하다.
- Quick Start는 jetty와 hsql 기반이지만 이 프로젝트는 tomcat과 postgresql로 구현되었으므로 mvn에서 Build 및 Deploy를 위한 명령을 제공한다.
|
[편집] 프로젝트 환경 구축하기
- 다음 Quick Start 매뉴얼에 따라 Spring MVC 기반으로 Ext-js, JSON을 적용한 웹 어플리케이션 환경을 구축할 수 있다.
- Local PC에 Maven을 위한 라이브러리 Repository를 설정하기 위하여 해당 사용자의 개인디렉터리에 있는 .m2 폴더에 설정파일(setting.xml)에 사용자의 환경에 맞도록 설정한다.
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 프로젝트 기반으로 개발할 수 있는 환경이 구축된 것이다.
|
|
- 샘플 웹 어플리케이션의 개발환경
- 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로 개발할 간단한 웹 어플리케이션은 다음과 같다.
- 위의 샘플 웹 어플리케이션은 상단의 메뉴바에서 해당 메뉴를 클릭하면 부서리스트 조회화면이 우측 Div에 출력된다.
- 우측 상단에 조회버튼을 클릭하면 서버에서 부서리스트를 조회하여 그 결과를 다음과 같이 JSON 데이터로 출력한다.
조회 Request에 대한 JSON Response
- JSON 데이터를 받으면 위의 샘플 웹 어플리케이션 화면과 같이 데이터를 그리드에 바인딩한다.
[편집] Spring MVC Request Lifecycle
- 샘플 웹 어플리케이션 구현은 Spring MVC Request Lifecycle을 기반으로 순서대로 진행될 것이다.
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-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>
<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