본문 바로가기

웹개발/설정

Spring MVC Project 구조 변경 및 설정

● Spring MVC 구조 변경 이유

MVC Project를 생성한 이후 기본 구조를 이용해도 딱히 상관은 없지만 구조를 변경 하는 가장 큰 이유는 기독성 부분인거 같다

새로 구성되는 구조는 딱히 정해진 구조도 없어서 그냥 구조를 바꾸면 되고 구조를 바꾼다면 그 경로를 알맞게 web.xml 에서 설정 해주는 것만 유의하면 된다. 


● 1. contextConfigLocation 변경 

            - servlet, context 파일을 이동할 것이다. web.xml 에서 이들의 param-name을 contextConfigLocation이라 한다.

              필자는 servlet과 context을 모두 한꺼번에 옮겼지만 context만 옳기는 분들도 많이 있다. 필자는쉽게 찾기 

              위해서 통쨰로 src - resources 패키지에 넣었다. 어디에 어떻게 넣든 햇갈리지 않고 잘 설정하면 아무 문제 없다.

 

1 - 1.webapp -  WEB-INF - spring 폴더 복사

1-2. src/main/resources에 붙여넣기

1-3. webapp - WEB-INF - spring 폴더 삭제

1-4. xml 이름 변경

servlet-context.xml -> servlet-active.xml

root-context.xml -> context-root.xml

지금은 하나의 파일로만 되어 있지만 나중에는 여러 파일이 추가 될 것이다. 이러한 확장성을 생각하여 특정 폴더안에 있는 설정 파일들을 모두 읽어올 수 있게끔 파일들의 이름을 수정한다. 이렇게 변경해놓으면 서블릿 설정을 변경할 때 한번에 다 불러오기 편하다.

 

2. servlet 설정 변경

 

context와 servlet 파일들의 폴더를 이동 하였으니, 이제 경로를 맞춰주자

 

2.1 기존 web.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
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
    
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
        
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
 
</web-app>
 
cs

2-2 변경 web.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
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/context-*.xml</param-value>
    </context-param>
    
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring/appServlet/servlet-*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
        
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
 
</web-app>
cs

- 9행 : 스프링 설정파일들을 읽어온다. spring 폴더에 context-*.xml인 파일들을 모두 읽어온다.  context들을 기능별로 분리하여 한꺼번에 불러오기 위한 것이다. (context-common.xml, context-datasource.xml 등등) 파일들의 이름을 변경한 이유이다. 물론 context-root.xml 파일에 설정을 다 해 놓고 하나만 불러와도 된다. 근데 이렇게 하면 설정파일들을 수정할 때 찾기가 힘들어진다. 그래서 context 기능별로 분리하는 게 좋다.

 

- 21행 : sping 폴더안의 appServlet 폴더 안에 있는 *-servlet.xml 파일들을 모두 읽어온다. 이것도 마찬가지이다.

이제 context 파일이나 servlet 파일들을 추가할 때 context-XXX.xml 이나 XXX-serlvet.xml로 만들면 자동적으로 설정파일들이 읽어와 진다.

 

- 28행 : 서블릿에 요청을 할 때, 요청을 전달할 url을 뜻한다. 이 패턴 외의 요청은 허락하지 않는다. *.do를 넣으면 .do로만 요청을 전달한다. Controller의 RequestMapping으로 요청 url을 적는 부분에서 사용할 url의 패턴을 뜻한다. 요청 패턴이 다르면 controller에서 비즈니스 로직을 찾지 못하니 요청 패턴을 잘 기억해둬야 한다. 보통 .do를 많이 쓰는데, 나는 귀찮기 때문에 그냥 / 를 쓴다.

 

** classpath 경로

프로젝트 우클릭 > properties > Deployment Assembly

위에서 classpath 경로를 확인할 수 있는데,

/src/main/resoucres 에 파일을 생성하여 빌드를 하면 WEB-INF/classes 에 들어감을 나타낸다. 

 

2-3. 서버를 실행하고 오류가 안뜨면 성공

 

3. index.jsp 추가

프로젝트를 실행하면 home.jsp가 실행된다. 이것은 컨트롤러의 맵핑을 거쳐 실행되는데, 서버를 실행하고 컨트롤러에 들어갔다가 다시 jsp로 가는건 비호율적이고 우리가 제어하기 힘들다. 따라서 서블릿을 통해서 프로젝트가 실행되면 index.jsp가 실행되도록 만들어보자.

 

3-1 webapp폴더 밑에 index.jsp 추가

** 위치 중요

WEB-INF 밑에 있는 jsp는 보안상 바로 접근할 수 없다. 컨트롤러를 통해(요청패턴을 통해) 접근을 할 수 있다. 하지만 webapp밑에 있는 파일들은 주소만 치면 바로 들어갈 수 있다. 그래서 단순 주소만으로 접근 가능하게 index.jsp를 만들고 그 다음부터 컨트롤러를 통해 접근하게 만드는 것이다

 

 

index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>안녕하세요 만나서 반갑습니다.</h1>
</body>
</html>
cs

 

3-2. web.xml에 <welcome-file>추가

1
2
3
    <welcome-file-list>        
        <welcome-file>index.jsp</welcome-file>    
    </welcome-file-list>
cs

<webapp></webapp> 태그 안에 아무곳에나 넣어줘도 된다. 필자는 맨 위에 뒀다.

이렇게 설정하면 서버가 실행되면서 web.xml에서 welcom-file을 읽어서 webapp에 있는 index.jsp가 실행된다.

 

3-3. Home(com.spring.novice 패키지) 삭제 및 home.jsp 삭제

이제 필요없는 걸 삭제 해주자.

 

3-4. 서버 실행

실행 완료 !!

 

4. UTF-8 설정

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <filter>                
        <filter-name>encodingFilter</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>encodingFilter</filter-name>            
        <url-pattern>/*</url-pattern>            
    </filter-mapping>
cs

 

5. 최종 web.xml 및 디텍토리

web.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
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
    <!-- The definition of the Root Spring Container shared by all Servlets 
        and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/context-*.xml</param-value>
    </context-param>
 
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    
    <welcome-file-list>        
        <welcome-file>index.jsp</welcome-file>    
    </welcome-file-list>
    
    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring/appServlet/servlet-*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
 
    <filter>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
</web-app>
cs

디덱토리 구조

1번 : 개발 소스 폴더

2번 : SQL 디렉토리

3번 : Spring Setting 파일

4번 : css : 스타일시트 js : 자바 스크립트 img : 이미지 폴더

5번 : views : JSP 디렉토리

 

6. servlet-active.xml 설정

6-1. 기존 servlet-active.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
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
 
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
    
    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />
 
    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />
 
    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    
    <context:component-scan base-package="com.spring.novice" />
    
    
    
</beans:beans>
 
cs

6-2. 변경 후 servlet-active.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
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
 
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
    
    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />
 
    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />
 
    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    
    <context:component-scan base-package="com.spring.novice.*.controller" />
    
    
    
</beans:beans>
 
cs

 

7. context-root.xml 설정

7-1 기존 context-root.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- Root Context: defines shared resources visible to all other web components -->
        
</beans>
 
cs

 

7-2 변경 후 contenxt-root.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    
    <!-- Root Context: defines shared resources visible to all other web components -->
        
    <context:component-scan base-package="com.spring.novice.*.service"></context:component-scan>
</beans>
 
cs

 

8. pom.xml 설정하기

8-1. 기존 pom.xml

4.0.0 com.spring novice Novice war 1.0.0-BUILD-SNAPSHOT 1.6 3.1.1.RELEASE 1.6.10 1.6.6 org.springframework spring-context ${org.springframework-version} commons-logging commons-logging org.springframework spring-webmvc ${org.springframework-version} org.aspectj aspectjrt ${org.aspectj-version} org.slf4j slf4j-api ${org.slf4j-version} org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime org.slf4j slf4j-log4j12 ${org.slf4j-version} runtime log4j log4j 1.2.15 javax.mail mail javax.jms jms com.sun.jdmk jmxtools com.sun.jmx jmxri runtime javax.inject javax.inject 1 javax.servlet servlet-api 2.5 provided javax.servlet.jsp jsp-api 2.1 provided javax.servlet jstl 1.2 junit junit 4.7 test maven-eclipse-plugin 2.9 org.springframework.ide.eclipse.core.springnature org.springframework.ide.eclipse.core.springbuilder true true org.apache.maven.plugins maven-compiler-plugin 2.5.1 1.6 1.6 -Xlint:all true true org.codehaus.mojo exec-maven-plugin 1.2.1 org.test.int1.Main

8-2. 변경 후 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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.spring</groupId>
    <artifactId>novice</artifactId>
    <name>Novice</name>
    <packaging>war</packaging>
    <version>1.0.0-BUILD-SNAPSHOT</version>
    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>5.0.7.RELEASE</org.springframework-version>
        <org.aspectj-version>1.6.10</org.aspectj-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
    </properties>
    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
            <exclusions>
                <!-- Exclude Commons Logging in favor of SLF4j -->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                 </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
                
        <!-- AspectJ -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj-version}</version>
        </dependency>    
        
        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.mail</groupId>
                    <artifactId>mail</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>
 
        <!-- @Inject -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>
                
        <!-- Servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    
        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>        
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
 
cs

 

이걸로 기본적인 프로젝트 셋팅이 완료 되었다. 이제 프로젝트를 시작해보자 !!