2016년 10월 5일

Spring 기반 웹 프로그램 개발 Part 1 - Spring Web MVC

1. 소개

Spring Web MVC 에서, DispatcherServlet 클래스는 프론트 컨트롤러로 역할을 한다. (Spring MVC 프로그램의 모든 흐름을 관리하는 책임을 가지고 있다.) Struts 의 ActionServlet 와 같은 역할을 한다고 할 수있다. 또한 디자인 패턴적으로  Struts와 같은 Push 스타일을 따르고 있다.

Spring 3 부터 어노테이션 @Controller 는 해당 클래스가 컨트롤러임을 의미한다. Spring MVC 를 처음 사용해보지만 이부분은 사용이 아주 쉽다. 어노테이션 @RequestMapping 은 요청 URL을 매핑하는데 사용된다. 이부분이 조금 익숙하지 않아 어렵게 생각된다. 매번 구글링을 하는 것도 조금 힘이든다.




  1. 프론트 컨트롤러 Dispatch Servlet 는 모든 요청들을 가로챈다.
  2. Dispatch Servlet 는 xml 파일에서 매핑된 핸들러 정보를 얻어 
  3. 요청을 Controller 로 포워드한다.  
  4. Controller 는 ModelAndView 객체를 리턴하고 
  5. Dispatch Servlet  는  xml 파일에서 Controller 에서 처리된 결과를 보여줄 View 결정 하는 View Resolver 를 채크하여 
  6. 특정 View 콤포넌트를 호출한다.

2. 환경설정


Maven 프로젝트 구성


eclipse 에서 New Maven Project 생성 과정에서 Archetype "maven-archetype-webapp" 를 사용하여 Maven 기반의 웹 프로젝트를 만드는 방법이 일반적인것 같으나, 개인적으로 (직관적으로 보이지 않는것을) 좋아하지 않아 아래와 같은 구조로 구성하여 프로젝트를 구성한다.

  •  소스 : /src
  •  웹 프로그램 루트 : /WebContent
  •  웹 프로그램 설정 : /WebContent/WEB-INF/
  •  maven 설정 : /pom.xml

Spring Web MVC 를 위해서 다음의 의존성을 pom.xml 파일에 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<project 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/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>example</groupId>
    <artifactId>example</artifactId>
    <version>0.0.1.SNAPSHOT</version>    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javac.src.version>1.6</javac.src.version>
        <javac.target.version>1.6</javac.target.version>
        <project.javadoc.docEncoding>UTF-8</project.javadoc.docEncoding>
    </properties> 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>${javac.src.version}</source>
                    <target>${javac.target.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin> 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <outputDirectory>${basedir}/WebContent/WEB-INF/lib</outputDirectory>
                </configuration>
            </plugin> 
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/WebContent/WEB-INF/lib </outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <excludeGroupIds>
                                javax.crypto,javax.servlet.jsp,javax.transaction,javax.servlet
                            </excludeGroupIds>
 
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
               <groupid>org.springframework</groupid>
               <artifactid>spring-webmvc</artifactid>
               <version>4.3.2.RELEASE</version>
          </dependency>
          <dependency>
               <groupid>javax.servlet</groupid>
               <artifactid>servlet-api</artifactid>
               <version>2.5</version>
               <type>jar</type>   
               <scope>compile</scope>
          </dependency>
          <dependency>
               <groupid>javax.servlet.jsp</groupid>
               <artifactid>jsp-api</artifactid>
               <version>2.0</version>
               <type>jar</type>
               <scope>compile</scope>
          </dependency> 
          <dependency>
               <groupid>javax.inject</groupid>
               <artifactid>javax.inject</artifactid>
               <version>1</version>
          </dependency>    
    </dependencies>
</project>
cs

다음은 아주 중요한 설정으로 ViewResolver 와 뷰 콤포넌트들을 기술한다.

WEB-INF/servelt-config/servlet-context.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans" 
  xmlns:context="http://www.springframework.org/schema/context" 
  xmlns:mvc="http://www.springframework.org/schema/mvc" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemalocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
 <!-- DispatcherServlet Context: 서블릿의 요청 처리를 위한 것들을 정의 -->
 
 <!-- Enables the Spring MVC @Controller programming model --> 
 <mvc:annotation-driven></mvc:annotation-driven>
 
 <context:component-scan base-package="neuro.honeycomb"></context:component-scan>
 
 <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
 
 <!-- 이미지, 자바스클립트, CSS 와 같은 정적 컨텐츠 요청(GET) 을 처리하기 위하여 설정 -->
 <mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
 <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
 <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
 
 <!-- 뷰처리 위한 ViewResolver 정의  -->
 <beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver" id="beanNameViewResolver">
  <beans:property name="order" value="0"></beans:property>
 </beans:bean>
</beans:beans>
cs

component-scan 는 base-package 에 지정된 하위 패키지들에 정의된 @Controller 어노테이션이 기술된 Controller 클래스들을 검색하게 된다. resources 는 특정 URL 패턴에 해당하는 요청들의 자원들이 어디에 있는가를 정의한다. 이들은 ViewResolver 역할을 한다.
위의 설정에서는 정적 콘텐츠들을 resources 태그를 사용하여 매핑하고, bean 이름으로 요청을 매핑하는 ViewResolver 을 정의하고 있다.

예제 프로로그램

MAVEN 기반의 예제 프로그램소스
Eclipse 에서 위의 GIT 레파지토리에서 spring-web-example 을 MAVEN 프로젝트를 임포트한 후 빌드후 WebContent 를 웹 프로그램으로 배포하면 됨.

참조


Spring MVC Tutorial


댓글 1개: