IT/Spring

Maven 프로젝트 설정

바바옄 2015. 5. 8. 11:31
반응형

1. Dinamic Web Project 생성

 

2. root context 변경

http://localhost:8080/ -> 뒤에 부분을 프로젝트 명이 안보이게 / 로 바꿔 줌

 

3. convert to maven project

java se -> jdk로 변경

 

4. pom.xml 추가

Resources

1
2
3
4
5
6
7
8
9
10
11
<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
cs

 

Repository

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <!-- 
        JDBC : Java DataBase Connector
        
        Oracle JDBC(OJDBC)는 Maven Global Repository 에 등록되어 있지 않음.
        ojdbc를 사용하기 위해서는 Maven Repository를 따로 등록해 줘야 한다.
        Oracle의 경우 http://maven.jahia.org/maven2를 Repository로 가진다.
        Maven Repository를 등록해주면 ojdbc 라이브러리를 import할 수 있다.
     -->
    <repositories>
        <repository>
            <id>Oracle</id>
            <name>Oracle JDBC Repository</name>
            <url>http://maven.jahia.org/maven2</url>
        </repository>
    </repositories>
cs

 

Dependencies

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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
    <!-- 
        Project에 필요한 Library 들의 Maven Id를 적는다. 
        여기에 등록된 Dependency 들은 자동으로 의존 라이브러리까지 모두 import 해준다.
    -->
    <dependencies>
    
        <!-- 
            Spring Web MVC를 사용하기 위한 라이브러리를 추가 한다.
            Web MVC는 Controller, Model, View로 이루어져 있는 것,
            View Resolver, DispatcherServlet, EncodingFilter 등등이 포함되어 있다.
         -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.6.RELEASE</version>
            <!-- 
                Spring은 Commons-logging을 이용해서 로그를 남긴다.
                프로젝트에서는 Commons-logging를 사용하지 않고
                logback을 사용하기 때문에 
                충돌제거를 위해 commons-logging은 제외하고 import해야 한다.
             -->
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <!-- 
            원래 Hibernate는 ORM Framework인데, 동일 개발사에서 Web Parameter를 
            검증할 수 있는 Validator를 개발 함. -> hibernate-validator
            hibernate-validator는 Comman 객체로 파라미터를 받을 때
            @Validator Annotation을 이용해서 파라미터 검증을 한다.
            이 라이브러리에서는 
            @NotEmpty, @NotBlank, @Length, @Range, @Email, @URL Annotation이 포함되어 있다.
         -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.3.Final</version>
        </dependency>
 
        <!-- 
            Oracle JDBC
            http://maven.jahia.org/maven2 이 레파지토리가 등록되어 있어야만 한다.
            
            Oracle 과 Java가 연동할 수 있는 API를 제공한다.
            Connection, PrepareStatement, ResultSet등이 포함되어 있다.
            
            프로젝트에서는 직접적인 사용은 하지 않지만,
            MyBatis가 필요로 하기 때문에 Import 해준다.
         -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.1.0.7.0</version>
        </dependency>
 
        <!-- 
            JSTL : Java Standard Tag Libraries
            
            JSTL과 Standard는 서로 의존적인 라이브러리 들이다.
            JSP에서 JSTL Taglib을 사용하기 위함이며,
            
            가장 빈번하게 사용되는 JSTL Taglib은 core이다.
            core library는 
            c:if, c:choose, c:out, c:url, c:set 등이 등록되어 있다,    
         -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        
        <!-- 
            단위 테스트 툴인 JUnit을 Spring에서 사용하기 편하게 추상화 시켜놓은 라이브러리
            JUnit이 Spring Context XML File을 Load해서 사용할 수 있도록 지원해 준다.
            @RunWith, @ContextConfigure Annotation을 포함하고 있다.
            
            Spring 교재안 84p 참고 
            @RunWith(SpringJUnit4ClassRunner.class)
            @ContextConfigure(locations={"xml 파일의 이름을 포함한 경로"})
            위 처럼 설정하면 Context XML 파일을 Load 해 온다.
         -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        
        <!-- 
            Logback 의존 라이브러리 추가,
            slf4j-api, jcl-over-slf4j, logback-classic, logback-ext-spring
            위 4개의 라이브러리가 필요하다.
            
            Logback는 SLF4J 인터페이스를 구현한 로깅 솔루션으로
            slf4j를 이용해서 사용해야 한다.
            그러므로 slf4j-api를 import 한다.
         -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency>
        
        <!-- 
            Java Commons Logging Over SLF4J의 약자로
            Spring이나 기타 다른 라이브러리들이 
            Commons-Logging으로 로그를 남길 때 SLF4J을 사용할 수 있도록 변경해주는 라이브러리
            별다른 설정은 필요없다.
         -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.12</version>
        </dependency>
        
        <!-- 
            SLF4J 인터페이스를 사용할 Logback 라이브러리
            src/main/resources 아래의 logback.xml 파일을 만들어 줘야 한다.
            
            logback.xml 파일을 만들지 않을 경우
            라이브러리가 포함하고 있는 기본 logback.xml 파일을 사용한다.
         -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.3</version>
        </dependency>
        
        <!-- 
            프로젝트를 진행하다 보면 logback.xml 파일의 기능을 따로 변경해야 할 상황이 발생
            
            Windows 용 / Linux 용 으로 구분하거나
            개발서버, 검증서버, 운영서버 용으로 따로 구분하거나 할 때
            파일의 이름을 변경할 수 있도록 지원해주는 라이브러리다.
            
            LogbackConfigListener를 Web.xml에 등록해서 사용한다.
         -->
        <dependency>
            <groupId>org.logback-extensions</groupId>
            <artifactId>logback-ext-spring</artifactId>
            <version>0.1.2</version>
        </dependency>
        
        <!-- 
            Ajax 통신을 할 때 가장 많이 쓰이는 Return Type은 JSON Type이다.
            
            기존의 방법대로라면 JSON Type을 일일이 String으로 작성해서 리턴 시켜야 하는데,
            이 라이브러리는 @ResponsBody라는 Annotation을 이용해서 VO(Value Object)를 리턴시키면
            자동으로 JSON Type으로 변경시켜 준다.
            
            또한, JSP에서 데이터를 받을 때 JSON Parse를 할 필요도 없다.
            
            @RequestMapping("/getJson")
            @ResponseBody
            public MemberInfoVO getJson(){
                MemberInfoVO memberInfo = new MemberInfoVO();
                memberInfo.setName("horse");
                memberInfo.setPhoneNumber("010");
                memberInfo.setResult(true);
                
                return memberInfo;
            }
    
         -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.2</version>
        </dependency>
        
        <!-- 
            Apach 재단에서 개발한 파일 업로드 라이브러리
            MultipartViewResolver 을 이용해 파일을 업로드 시킨다.
            MultipartViewResolver 로 파일을 전송시키기 위해서는 
            form 엘리먼트에 enctype-"multipart/formdata"라는 속성을 부여해야만 하며
            Controller에서는 MultipartHttpSecvletRequest를 이용해서 파라미터를 받아온다.
            
            전달된 파일은
            MultipartHttpSecvletRequest.getFile("fileElementName")을 통해서 가져온다.
            
            Command 객체에는 그냥 MultipartFile이라고만 적어주면 파일을 알아서 넣어준다.
            
            전달된 파일을 저장하기 위해서는
            MultipartFile.transferTo(목적지) 명령어를 사용한다.
         -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        
        <!-- 
            SpringFramework 4.0 부터 추가된 모듈. 현재까지는 SockJS만 지원한다.
            
            HTML5에서 WebSocket을 편리하게 사용할 수 있도록 추상화 시켜놓은 모듈
            
            Servlet 3.0을 지원하는 WAS / Container만 사용할 수 있다.
         -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        
        <!-- 
            Connection Pool을 쉽게 생성할 수 있도록 추상화 시킨 라이브러리
            com.mchange.v2.c3p0.ComboPooledDataSource 클래스를 통해서 Connection Pool을 설정한다.
            Spring 교안 192, 193p 참고
            
            빠른 처리/대응을 위해서 여러 개의 Connection을 미리 만들어 둔다.
            기본 설정으로는 최대 15개의 Connection을 생성한다.
        -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5</version>
        </dependency>
        
        <!-- 
            Spring 프로젝트에서 가장 많이 쓰이는 ORM Framework
            쿼리의 구조적인 관리가 가능해지며
            쿼리의 실행 및 트랜잭션을 간편하게 해준다.
            
            mybatis-spring, mybatis, spring-jdbc가 필요하다.
            
            mybatis-spring은 Spring이 Mybatis를 정식지원하지 않기 때문에
            Mybatis 개발사에서 만든 연동 모듈,
            Mybatis를 작성하기 위해서는 꼭 필요하다.
            
            *Spring이 정식지원하는 ORM은 Spring-JPA가 유일하다.
         -->
         <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        
        <!-- 
            Mybatis 라이브러리,
            Configure XML, Mapple XML을 통해서 쿼리의 구조적인 관리를 가능하게 해준다.
            
            XML의 Query를 사용하기 위해서는
            SQLSessionFactory, SQLSessionTemplate이 필요하다
            DAO 클래스에서는 
            SQLSessionDaoSupport를 상속 받아야만 한다.
            
         -->
         
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        
        
        <!-- 
            JDBC API를 쓰기 편리하게 Spring에서 추상화 시켜 놓은 모듈 Mybatis가 이 모듈을 사용한다.
         -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        
        <!-- 
            Spring AOP의 핵심 모듈 중 하나
            Weaving이라는 행위를 통해서 여러 클래스를 하나의 클래스인 것처럼 변경해 준다.
            
            Compile 단계에서 Class파일에 직접적인 수정을 한다.
         -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>
        
        <!-- 
            여러 기능들에 공통된 기능을 수행하고 싶은때 AOP 라는 것을 사용한다.
            AOP 기능이라기 보다는 프로그래밍의 방식 중 하나로
            Aspect Oriented Programming (관점 지향 프로그래밍)이라 부른다.
            Spring AOP, PointCut, Advisor를 통해서 공통 기능을 수행하고 싶은 위치를 설정한다.
            
            Spring 교안 70~78p 참고
         -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        
        <!-- 
            MyBatis에서 수행되는 쿼리들의 결과 및 에러를 로그를 통해 보기 위한 라이브러리
            net.sf.log4jdbc.DriverSpy
            jdbc:log4jdbc:oracle:thin:
            위 두개 클래스를 Connection Pool 설정에 사용한다. 
         -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>
        
        <!-- 
            JSP Page의 Template 기능을 부여한다.
            특정한 URL에 특정한 Template을 사용하게 하며, 공통된 기능이 있다면 Template에 코딩해두어 중복 작성을 막는다.
            
            Template 프레임워크는 Sitemesh, Tiles2, Velocity등이 있는데 가장 많이 쓰이는 프레임 워크는 Sitemesh이다.
            
            http://nkcnow.tistory.com/entry/spring에서-sitemesh설정-레이아웃-템플릿
            참고
         -->
        <dependency>
            <groupId>opensymphony</groupId>
            <artifactId>sitemesh</artifactId>
            <version>2.4.2</version>
        </dependency>
        
        <!-- 
            패스워드 암호화 라이브러리
            DataBase에 Password나 민감한 정보를 저장할 때,
            반드시 암호화 시켜서 저장해야 한다.
            
            이때 암호화 하는 방식은 복호화가 불가능 해야 한다.
            jbcrypt 라이브러리는 암호화를 할때 Salt 값을 사용해 암호화 하기 때문에 복호화가 불가능 하다.
            
            Hucloud Login 및 Regist 로직 참고.
        -->
        <dependency>
            <groupId>org.mindrot</groupId>
            <artifactId>jbcrypt</artifactId>
            <version>0.3m</version>
        </dependency>
        
    </dependencies>
cs

 

5. lib 폴더에 log4jdbc4-1.2.jar 추가

 

 

6. web.xml

ctrl+space :  springDispatcherServlet 추가

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
    <!-- 
        Spring MVC는 Single Servlet Framework이다.
        이 하나의 Servlet은 DispatcherServlet이라 부르고
        이 Servlet은 여러개의 Controller와 통신한다.
        
        DispatcherServlet은 사용자의 요청을 가장 먼저 받는 Servlet 이다.
        
        * Spring MVC의 제일 첫번째 시작점
     -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 
            DispatcherSevlet을 URL에 관련된 설정들이 필요함.
            ViewResolver, CommonsMultipartResolver, Controller등의 URL과 관련된 설정들을 가지고 있다.
            
            이런 설정을 가지고 있는 파일의 기본 이름은 applicationContext.xml이고 
            이 파일의 위치한 경로는 
            /WEB-INF/spring/applicationContext.xml 이다. 
            
            Default 경로는
            /WEB-INF/applicationContext.xml 인데, 
            설정파일의 관리 편의성을 위해 spring 같은 폴더를 만들어서 관리한다.
        -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- 
                param-value는 여러 개의 xml 파일을 한번에 가져올 수 있다.
                
                ex) applicationContext에는 ViewResolver, CommonsMultipartResolver만 설정하고
                controllerContext.xml에는 Controller 설정만 관리하고 싶을 때
                param-value 값에 [엔터]를 치고
                /WEB-INF/spring/controllerContext.xml을 추가로 입력하면 된다.
                
                설정 예 :
                <param-value>
                    /WEB-INF/spring/applicationContext.xml
                    /WEB-INF/spring/controllerContext.xml
                </param-value>
             -->
            <param-value>
                /WEB-INF/spring/applicationContext.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <!-- 
        Spring MVC를 사용하면 아래와 같은 URL Pattern을 가진다.
        http://localhost:8080/ContextPath/member/login
        http://localhost:8080/ContextPath/member/logout
        http://localhost:8080/ContextPath/member/list
        
        위 URL에서 /member/login, /member/logout, /member/list 는
        파라미터에 해당된다.
        즉 요청하는 URL 정보는 
        http://localhost:8080/ContextPath 이 주소 외에는 
        아무런 값이 들어오지 않는다고 봐야한다.
        
        위 주소로 요청될 경우 [springDispatcherServlet]
        이라는 이름을 가진 Servlet이 처리하도록 한다.
    -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
cs

 

ctrl+space : ContextLoaderListener 추가

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <!-- 
        contextConfigLocation이라는 이름으로 application 상수를 생성한다.
        param-value에는 service, dao, database 관련된 여러 설정들을 가지고 있는 
        *Context.xml 파일들을 넣어 준다.
    -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/*Context.xml</param-value>
    </context-param>
 
    <!-- 
        DispatcherServlet이 초기화 된 이후에 실행된다.
        Bean Container에 추가로 로딩할 Bean이 있다면
        Context 파일을 읽어와서 Bean을 생성한다.
        
        Context File을 읽어오는 경로는 
        contextConfigLocation Application 상수의 값으로 정의되어 있다.
     -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
cs

 

<filter> , <filter-mapping> 추가

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
    <!-- 
        영어권을 제회한 모든 나라에 서비스 할 경우,
        그리고 글로벌 서비스를 할 경우(다국어 지원)
        모든 문자를 UTF-8로 변경할 필요가 있다.
        
        모든 페이지에서 HttpServletRequest.setCharacterEncoding("UTF-8");
        을 사용하기에는 많은 공수가 필요하고 수정의 불편함이 존재한다.
        
        이런 문제는 Spring에서 지원해주는 EncodingFilter를 사용해서 해결한다.
        
        Filter는 DispatcherServlet이 요청을 전달받기 전에
        실행되는데, Filter에서 모든 요청을 받아 Encoding을 UTF-8로 변경한 다음 
        DispatcherServlet으로 전달한다.
    -->
    <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>
    
    <!-- 
        characterEncodingFilter가 모든 요청에 대해서
        Encoding을 변경해주기 위해서는 url-pattern을 
        /*로 변경해 줘야 한다.
    -->
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
cs

 

<site-filter> 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <!-- 
         모든 요청에 대해서 어떤 Decorator를 적용할 지 PageFilter에서 정한다.
    
     -->
    <filter>
           <filter-name>sitemesh</filter-name>
       <filter-class>
            com.opensymphony.module.sitemesh.filter.PageFilter
       </filter-class>
      </filter>
  
      <filter-mapping>
       <filter-name>sitemesh</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
cs

 

ERROR 페이지 추가

참고사이트 : http://ko.wikipedia.org/wiki/HTTP_상태_코드

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
    <!-- 
        
        서버에서 처리 중 아래 정의된 특정 에러가 발생할 경우
        지정한 에러페이지를 보여준다.
        
        이때, 에러페이지에는 접속한 유저의 권한에 따라서
        보여주는 페이지의 내용이 달라야 한다.
        
        일반 유저의 경우 "치명적 에러가 발생했습니다." 또는 "관리자에게 문의하세요" 등 
        가이드 성 문구를 보여줘야 하고,
        
        관리자의 경우 발생한 에러의 Message를 보여주고 개발자에게 문의하라는 문구를 보여줘야 한다.
        
        마지막으로 개발자일 경우 Message 전체와 Trace 전체를 보여주고
        개발자가 에러를 분석할 수 있도록 보여줘야 한다.
     -->
     <error-page>
         <error-code>400</error-code>
         <location>/WEB-INF/view/error/400.jsp</location>
     </error-page>
     <error-page>
         <error-code>401</error-code>
         <location>/WEB-INF/view/error/401.jsp</location>
     </error-page>
     <error-page>
         <error-code>402</error-code>
         <location>/WEB-INF/view/error/402.jsp</location>
     </error-page>
     <error-page>
         <error-code>403</error-code>
         <location>/WEB-INF/view/error/403.jsp</location>
     </error-page>
     <error-page>
         <error-code>404</error-code>
         <location>/WEB-INF/view/error/404.jsp</location>
     </error-page>
     <error-page>
         <error-code>500</error-code>
         <location>/WEB-INF/view/error/500.jsp</location>
     </error-page>
     <error-page>
         <error-code>502</error-code>
         <location>/WEB-INF/view/error/502.jsp</location>
     </error-page>
     <error-page>
         <error-code>503</error-code>
         <location>/WEB-INF/view/error/503.jsp</location>
     </error-page>
cs

 

7. applicationContext.xml 추가

new -> spring bean configuration file

Namespaces tab에서 mvc, bean 선택

 

mvc:annotation-driven 추가

1
2
3
4
5
6
    <!-- 
        Controller 탐색을 위한 HandlerMapping과 HandlerAdator를 자동으로 설정해 준다.
        mvc:annotation-driven을 사용하지 않을 경우
        HandlerMapping과 HandlerAdator는 수동으로 설정해야 한다.
     -->
    <mvc:annotation-driven/>
cs

 

mvc:resources 추가

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
    <!-- 
        정적자원 설정하는 부분.
        MVC를 사용하게 되면 정적 자원에 대한 접근이 불가능해진다.
        그 이유는 모든 요청을 DispatcherServlet이 받아서 처리하기 때문에,
        DispatcherServlet으로 요청 할 경우 정적자원에 대한 접근을 할 수 있다.
        때문에 정적자원에 대한 접근 설정을 따로 해줘야 하는데,
        이 부분이 mvc:resources 이다.
        
        mvc:resources 는 location 과 mapping 속성을 가진다.
        location은 정적자원이 존재하는 위치를 뜻하고
        mapping을 정적자원에 접근하기 위한 URL을 의미한다.
        
        아래 설정은 http://locahost:8080/ContextPath/resources/js/jquery.js/ 
        로 요청할 경우
        /WEB-INF/resources/js/jquery.js를 찾게 하는 설정이다.
        
        resources는 중복하여 설정할 수 도 있는데, 
        아래처럼 URL을 각각 다르게 해서 접근하도록 할 수 도 있다.
        
        <mvc:resources location="/WEB-INF/resources/js/" mapping="/js/**"/>
        <mvc:resources location="/WEB-INF/resources/css/" mapping="/css/**"/>
        <mvc:resources location="/WEB-INF/resources/img/" mapping="/img/**"/>
        
        
    -->
    <mvc:resources location="/WEB-INF/resources/" mapping="/resources/**"/>
cs

 

InternalResourceViewResolver 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <!-- 
        Controller에서 ModelAndView를 이용한 View를 찾을 때 사용된다.
        ModelAndView.setViewName(ViewName); 으로 View를 찾는다.
        
        이때, View는 viewResolver에 등록된 경로로 찾아가는데
        prefix + ViewName + suffix의 조합으로 찾는다.
        예를 들어, ModelAndView.setViewName("board/list");로 정했다면, 
        실제 view의 위치는 /WEB-INF/view/board/list.jsp 가 된다.
        /WEB-INF/view/는 prefix에 설정된 내용이고 .jsp는 suffix에 설정된 내용이다.
        
        * Controller에서 String을 리턴할 경우에도 viewName을 찾는다.
    -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>        
        <property name="suffix" value=".jsp"/>        
    </bean>
cs

 

CommonsMultipartResolver 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    <!-- 
        commons-file-upload 라이브러리를 이용해서 파일을 업로드할 수 있도록 지원하는 Resolver
        설정은 defaultEncoding 과 maxUploadSize만 해주면 된다.
        maxUploadSize는 업로드를 할 수 있는 최대 용량을 설정하는 것이며,
        최소 단위는 1byte로 한다.
        1byte * 1024 = 1kb
        1killo byte * 1024 = 1mb
        1mega byte * 1024 = 1gb
     -->
     <bean id="multipartViewResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
         <property name="defaultEncoding" value="UTF-8"/>
         <!-- 
             1024 byte * 1024 byte = 1mb
             1mb * 100 = 100mb
             100mb = 104857600
         -->
         <property name="maxUploadSize" value="104857600"/>
     </bean>
cs

 

6. rootContext.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
<?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:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
 
    <!-- 
        C3p0을 이용한 Connection Pool생성
        Connection Class=com.mchange.v2.c3p0.ComboPooledDataSource
        Drive Class =net.sf.log4jdbc.DriverSpy
     -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="driverClass" value="net.sf.log4jdbc.DriverSpy"></property>
         <property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"></property>
         <property name="user" value="test"></property>
         <property name="password" value="test"></property>
     </bean>
     
     <!--
         MyBatis SqlSessionFactory생성
         Class : org.mybatis.spring.SqlSessionFactoryBean
         PreparedStatement를 생성하기 위해서 Connection이 필요한데, 이 것을 DataSource에서 가져올 수 있따.
       -->
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource"></property>
          <property name="configLocation" value="classpath:/mybatis.xml"></property>
          
      </bean>
 
    <!-- sqlSessionTemplate생성
        class="org.mybatis.spring.SqlSessionTemplate
        일종의 ResultSet을 대체한다
        여러가지 쿼리들을 수행하기 위해서
        템플릿을 제공하는데, SELECT, INSERT, UPDATE, DELETE등의 템필릿이 있다. -->
      <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
          <constructor-arg ref="sqlSessionFactory"/>
      </bean>
      
      <!-- Spring 에서 dataSource에 트랜잭션 설정을 할 수 있도록 지원해준다. -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
        </bean>
        
        <!-- 트랜잭션이 실행될 메소드 타입을 설정한다. 이때, transactionManager를 사용해 설정한다. -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <!--트랜잭션이 실행될 메소드들.. Rollback이 되는 조건을 정의한다. RuntimeException이 발생했을 때만 롤백해준다.  -->
            <tx:attributes>
                <tx:method name="set*" rollback-for="RuntimeException"/>
                <tx:method name="add*" rollback-for="RuntimeException"/>
                <tx:method name="insert*" rollback-for="RuntimeException"/>
                <tx:method name="write*" rollback-for="RuntimeException"/>
                <tx:method name="append*" rollback-for="RuntimeException"/>
                <tx:method name="update*" rollback-for="RuntimeException"/>
                <tx:method name="modify*" rollback-for="RuntimeException"/>
                <tx:method name="put*" rollback-for="RuntimeException"/>
                <tx:method name="change*" rollback-for="RuntimeException"/>
                <tx:method name="delete*" rollback-for="RuntimeException"/>
                <tx:method name="drop*" rollback-for="RuntimeException"/>
                <tx:method name="remove*" rollback-for="RuntimeException"/>
            </tx:attributes>
        </tx:advice>
        
        <aop:config>
        <!--..그아래 모든것 .은 그바로아래  -->
        <!-- 트랙잭션을 어디에 걸 것인지 정의한다. com.ktds아래의 service라는 패키지 중 모든 클래스의 메소드들을 대상으로 트랜잭션을 걸겠다고 정의함. -->
        <aop:pointcut expression="execution(public * com.ktds..*service.*(..))" id="servicePublicMethod"/>
        <!-- aop:around와 같은 속성으로  <tx:advice id="txAdvice"여기에 정의돈 메소드들을 대상으로 트랜잭션을 걸겠다고 정의함 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePublicMethod"/>
        </aop:config>
                
</beans>
 
cs

 

7. sitemesh 추가  

decoratorx.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
<?xml version="1.0" encoding="UTF-8"?>
 
<!-- 
    템플릿을 정의한다.
    Sitemesh에서는 템플릿을 decorator라고 부른다.
    
     decorators에 필요한 속성으로
     defalutdir 이라는 속성이 있는데,
    이 속성은 decorator의 page가 존재하는 경로를 적는다.
    
 -->
<decorators defaultdir="/WEB-INF/view">
 
    <!-- 
        이것은 sitemesh를 사용하지 않을 패턴을 지정한다 
        sitemesh는 모든 URL을 대상으로 decorator를 조사하는데,
        해당하는 URL Pattern이 나올때 가지 전수 조사하게 된다.
        많은 URL을 포함하고 있는 프로젝트라면 decorator를 검색하는 시간도 
        오래 걸리므로 decorator를 사용하지 않는 페이지도 반드시 등록을 해줘야 한다.
    -->
     <excludes>
        <pattern>/popup/*</pattern>
    </excludes>
 
    <!-- 
        UI Template(Decorator)를 정의한다.
        페이지의 타이틀과 Template page를 정의한다.
        pattern에 정의된 URL로 접근할 때
        해당하는 Decorator를 보여준다.
        
        여러개의 URL에 하나의 Template을 정의하고 싶다면
        <pattern>/test/*</pattern> 엘리먼트를 
        아래와 같이 복수개로 정의한다.
        
        <pattern>/board/*</pattern>
        <pattern>/member/*</pattern>
        <pattern>/photo/*</pattern>
        
     -->
    <decorator name="mainTemplate" title="HuCloud" page="template/main.jsp">
        <pattern>/test/*</pattern>
    </decorator>
    <decorator name="mainTemplate2" title="HuCloud" page="template/main2.jsp">
        <pattern>/main/*</pattern>
    </decorator>
 
    <decorator name="header" page="/WEB-INF/views/sitemesh/header.jsp" />
    <!-- <decorator name="_sidebar" page="/decorators/sidebar.jsp" /> -->
 
</decorators>
cs

sitemesh.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
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
    <!--decorator 결정-->
     <property name="decorators-file" value="/WEB-INF/decorators.xml" /> <!-- 데코레이터 파일을 불러온다.  -->
     <excludes file="${decorators-file}" />
 
  <!--parser를 설정:해당 페이지의 content-type이 뭐라고 쓰여있는지에 따라
 데코레이터 결정 -->  
   <page-parsers>
         <parser content-type="text/html"
             class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
         <parser content-type="text/html;charset=UTF-8"
             class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
     </page-parsers>
 
    <decorator-mappers>
   <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
    <param name="decorator" value="printable" />
    <param name="parameter.name" value="printable" />
    <param name="parameter.value" value="true" />
   </mapper>
 
  <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper" >
    <param name="property" value="meta.decorator" />
   </mapper>
 
 <!-- mapper결정 : 설정파일 사용하여 decorator정하기-->  
 <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
             <param name="config" value="${decorators-file}" />
         </mapper>
     </decorator-mappers>
 </sitemesh>
cs

main.jsp

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator"%>
<%@taglib prefix="page" uri = "http://www.opensymphony.com/sitemesh/page"%>
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
        function dialog(message){
            alert(messate);
        }
   </script>
    <decorator:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><decorator:title default="HuCloud"/></title>
 
</head>
<body>
 
    <table border="1">
        <tr>
            <td colspan="2">상단헤더 로고 및 메뉴/로그인/로그아웃/회원가입</td>
        </tr>
        <tr>
            <td>좌측메뉴</td>
            <td><decorator:body/></td>
        </tr>
        <tr>
            <td colspan="2">푸터 - 사이트맵/연락처/저작권표시</td>
        </tr>
    </table>
 
</body>
</html>
cs

main2.jsp

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!--
    Sitemesh Taglib 설정 
    이 페이지에 있는 모든 것들은 공통된 기능을 가진다.
    
    예를 들어, 모든 페이지에서 jquery.js가 필요하다면
    이 페이지에 jquery.js를 import 해둔다.
    
    그러면, 이 템플릿을 사용하는 모든 페이지는 jquery를 따로 import 하지 않아도
    jquery를 바로 사용할 수 있다.
    
    또한, 공통된 레이아웃도 설정할 수 있다.
    왼쪽
 -->
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator"%>
<%@taglib prefix="page" uri = "http://www.opensymphony.com/sitemesh/page"%>
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
        function dialog(message){
            alert(messate);
        }
   </script>
    <decorator:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><decorator:title default="HuCloud"/></title>
 
</head>
<body>
 
    <table border="100">
        <tr>
            <td colspan="2">상단헤더 로고 및 메뉴/로그인/로그아웃/회원가입</td>
        </tr>
        <tr>
            <td>좌측메뉴</td>
            <td><decorator:body/></td>
        </tr>
        <tr>
            <td colspan="2">푸터 - 사이트맵/연락처/저작권표시</td>
        </tr>
    </table>
 
</body>
</html>
cs

8. mybatis.xml, sampleMapper.xml 추가

 

 

 

 

 

 

 

 

반응형

'IT > Spring' 카테고리의 다른 글

Spring 파일 업로드를 위한 multipartResolver bean 추가  (0) 2015.05.19
Spring & 보안 정리  (0) 2015.05.14
스프링에서 Sitemesh 설정  (0) 2015.04.30
Layer  (0) 2015.04.30
파일내용을 게시판에 Write  (0) 2015.04.28