인텔리제이 스프링 설정 총정리

2019. 5. 24. 04:08프로그래밍/InteliJ&Eclipse

이번주는 인텔리제이 단축키 외우기, 기능 외우기, 삽질로 다 보낸 듯 하다.

오늘은 집에서 잘 되던 프로젝트가 회사에서 오류를 뿜는 관계로 하루종일 이것만 붙잡고 씨름했으나 결국 퇴근때까지도 해결을 못하고 나왔다. 

톰캣 재설치, 집에 있는 톰캣을 압축해서 회사에 깔아보기도 하고, 인텔리제이 재설치, 프로젝트 처음부터 똑같이 재생성 등 별별 짓거리를 다 해봤으나 결국 내린 결론은 내가 기본이 부족하다는 것이었다.
지금까지는 스프링의 각종 설정파일을 내가 100% 이해한 것이 아니라 학원에서 알려준 설정 코드들을 주석을 보고 필요한 것을 그대로 복사해서 썼을 뿐이었다. 하지만 그러다보니 어떤 라이브러리가 어떤것과 같이  쓰이는지, 네임스페이스가 어떻게 쓰이는지, 같은 기능을 하는 여러 라이브러리가 있는지 등등 하나도 알지 못한 채로 쓰고 있던 것이다.

오기가 생긴 나머지 오늘은 정말 모든 설정파일(xml) 을 처음부터 하나하나 검색하고 이해하고 주석과 참고사이트까지 전부 다는 방식으로 프로젝트 파일을 완전히 새로 만들기로 했다. 시간은 엄청나게 걸렸지만 결국 완성을 하고 드디어 오류가 없이 완벽하게 작동하는 프로젝트를 생성하였다!!!!!

문제는 회사에서도 작동을 해야 완벽한 설정인 것이다. 그리고 내가 한 설명 자체가 100% 완벽하다고 할수도 없다. 하지만 나는 회사에서도 잘 작동하리라 100% 확신한다! 설정 방법을 익히고 나니 그동안 생겼던 오류들이 전반적으로 이해가 되기 시작했고, 오류 해결에 대한 노하우도 생겼기 때문이다.

 

설정파일 코드에 모두 주석과 참고사이트까지 달려있으므로 설명은 생략하겠다.

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
<?xml version="1.0" encoding="UTF-8"?>
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         version="3.1">
    <!-- Root context와 같은 역할 - 여기서 생성된 빈은 모든 컨텍스트에서 공유가 된다. -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
 
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- servlet context와 같은 역할 - 여기서 생성된 빈은 컨트롤러에만 공유가 된다. -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
 
    <!-- UTF-8 인코딩 필터 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>
        </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>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs
 

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
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
<?xml version="1.0" encoding="UTF-8"?>
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>groupId</groupId>
    <artifactId>ERP_Project</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <!--    여기서 프로퍼티를 설정하여 하단에 추가된 디펜던시에서 버전을 직접 적지 않고 프로퍼티 이름으로 설정해주면
        버전을 바꾸게 되더라도 일일이 바꿔줄 필요 없이 프로퍼티의 버전만 바꿔주면 끝난다.-->
    <properties>
        <!--자바 버전-->
        <java-version>1.8</java-version>
        <!--스프링버전-->
        <org.springframework-version>4.3.18.RELEASE</org.springframework-version>
        <!--aop를 사용할때 추가한다. 일단은 디펜던시는 주석처리하자. https://araikuma.tistory.com/309 참고-->
        <org.aspectj-version>1.8.6</org.aspectj-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
        <!--json을 사용하기 위한 라이브러리-->
        <gson.version>2.8.2</gson.version>
        <!--json을 사용하기 위한 라이브러리2-->
        <jackson.version>2.9.9</jackson.version>
    </properties>
 
    <dependencies>
 
        <!--태그 중 scope는 범위 설정이다. https://sarc.io/index.php/development/812-maven-pom-xml-scope 참고-->
 
        <!-- spring context 관련 -->
        <!--context-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--context-suppor-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--beans-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--core-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--aop-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--tx-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
 
 
        <!-- spring mvc 관련 -->
        <!--mvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--sevlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--JSTL-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--jsp-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <!--cglib - 프록시 객체 만들어줌 https://javacan.tistory.com/entry/114-->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- lombok - 게터 세터 만들어주는것!! 꿀 라이브러리!! https://taetaetae.github.io/2017/02/22/lombok/ 참고-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>
        <!-- junit 테스트 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
 
 
        <!-- database 관련-->
        <!--mysql-connector-java  - 6.0.4 버전은 SSL 사용을 강요하고, KST 타임존을 인지하지 못한다.-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <!--mybatis 스프링 맵퍼 연동-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
<!--            <version>1.3.2</version>-->
            <version>2.0.1</version>
        </dependency>
        <!--DB 서버 접속을 위한 jdbc 드라이버-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--커넥션 풀1  https://sjh836.tistory.com/148 참고-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.4.0</version>
        </dependency>
        <!--커넥션 풀2 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
 
 
        <!--기타, 로깅 관련-->
        <!--파일업로드 파일저장과 입출력 https://keichee.tistory.com/329 참고-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <!--Java에서 JSON사용1 https://yookeun.github.io/java/2017/05/27/java-gson/ 참고-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>${gson.version}</version>
        </dependency>
        <!--Java에서 JSON사용2 https://nesoy.github.io/articles/2018-04/Java-JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <!-- 메일 설정-->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>
        <!--암호화 관련 https://kanzler.tistory.com/80 -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>
        <!--엑셀 다운로드 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- 채팅 관련(웹소켓) 라이브러리 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
 
 
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- sql logger 로그찍기-->
        <dependency>
            <groupId>org.lazyluke</groupId>
            <artifactId>log4jdbc-remix</artifactId>
            <version>0.2.6</version>
        </dependency>
        <!-- 로깅2-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
 
 
    </dependencies>
 
    <!--Maven 저장소 관련-->
    <repositories>
        <repository>
            <id>spring-libs-release</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
 
    <build>
        <finalName>ERP_Project</finalName>
        <!--특정 자바 버전과 특정 인코딩으로 빌드해줌 https://www.lesstif.com/pages/viewpage.action?pageId=14745653 -->
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <!-- src/main/java 폴더의 xml파일들을 빌드에 포함 -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
 
</project>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs
 

applicationContext.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
<?xml version="1.0" encoding="UTF-8"?>
<!--네임스페이스를 추가하면 해당 URL과 실제 파일명을 적어줘야한다 .xsd로 끝나는 파일명-->
       xmlns:context="http://www.springframework.org/schema/context"
 
    <!--특정 패키지 안의 클래스들을 스캔하고 빈 인스턴스를 생성한다. 아래와 같은 정확한 어노테이션이 존재해야지 빈을 생성할수있다. https://hamait.tistory.com/322 참고
        @Component @Repository @Service @Controller-->
    <context:component-scan base-package="com.erp"/>
 
    <!--    애노테이션 방식의 @MVC를 사용시 필요한 몇가지 빈들을 자동으로 등록해 준다. https://kdarkdev.tistory.com/103 참고-->
    <mvc:annotation-driven>
        <mvc:message-converters>
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json; charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
 
    <!-- 리소스 맵핑 -->
    <mvc:resources mapping="/css/**" location="/css/"/>
 
    <context:property-placeholder location="classpath:database/application.properties"/>
 
    <!--파일 전송을 위한 설정-->
    <bean id="multipartResolver"
          p:defaultEncoding="utf-8"/>
 
 
    <!--DB 설정-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
          p:driverClass="net.sf.log4jdbc.DriverSpy"
          p:jdbcUrl="jdbc:log4jdbc:mysql://localhost/mina?characterEncoding=utf8"
          p:user="root"
          p:password="1234"/>
    <!--DB PlatformTransactionManager 빈 설정 https://wikibook.co.kr/article/transaction-management-using-spring/ -->
    <bean id="transactionManager"
          p:dataSource-ref="dataSource"/>
    <tx:annotation-driven/>
    <!--DB spring - mybatis 매퍼 설정 http://www.mybatis.org/mybatis-3/ko/getting-started.html -->
    <bean id="sqlSessionFactory"
          class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations">
            <list>
                <!--classpath:com/ 이 부분을 인텔리제이에선 classpath*:com/ 이런식으로 * 을 붙여줘야 작동한다! 중요!! https://jeekchic.tistory.com/2-->
                <value>classpath*:com/erp/doc/dao/DocDao.xml</value>
                <!--다음과 같이 value 를 추가하여 다양한 경로에서 찾을 수 있도록 설정할수도 있다.-->
                <!--<value>classpath:com/erp/**/*.xml</value>-->
            </list>
        </property>
    </bean>
    <!--DB SqlSessionTemplate 등록 http://www.mybatis.org/spring/ko/sqlsession.html -->
    <bean id="sqlSession"
          class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0"
                         ref="sqlSessionFactory"/>
    </bean>
    <!--DB SQL문 콘솔에 로그찍기 -->
    <bean id="dataSource_log" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
        <constructor-arg ref="dataSource"/>
        <property name="logFormatter">
            <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
                <property name="loggingType" value="MULTI_LINE"/>
                <property name="sqlPrefix" value="SQL::: "/>
            </bean>
        </property>
    </bean>
 
    <!--인터셉터-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/*" />
            <mvc:exclude-mapping path="/login" />
            <bean class="com.erp.doc.interceptor.LoginInterceptor" />
        </mvc:interceptor>
 
    </mvc:interceptors>
 
    <!-- Email -->
    <bean id="mailSender"
                class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <!-- JavaMailSenderImpl : Interface -->
        <property name="host" value="smtp.gmail.com" />
        <property name="port" value="587" /><!-- 465 or 25 -->
        <!-- 보내는 사람의 Email ID -->
        <property name="username" value="bitcamp1114@gmail.com" />
        <!-- 보내는 사람의 Email Password -->
        <property name="password" value="bitcamp123!" />
        <property name="defaultEncoding" value="utf-8" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">smtp</prop>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>
 
 
</beans>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs
 
 

dispatcher-servlet.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
<?xml version="1.0" encoding="UTF-8"?>
<!--네임스페이스를 추가하면 해당 URL과 실제 파일명을 적어줘야한다 .xsd로 끝나는 파일명-->
       xmlns:context="http://www.springframework.org/schema/context"
 
 
    <!--특정 패키지 안의 클래스들을 스캔하고 빈 인스턴스를 생성한다. 아래와 같은 정확한 어노테이션이 존재해야지 빈을 생성할수있다. https://hamait.tistory.com/322 참고
    @Component @Repository @Service @Controller-->
    <context:component-scan base-package="com.erp.doc.controller"/>
 
    <!--    뷰 파일을 스캔하여 보여주는 역할 http://blog.naver.com/PostView.nhn?blogId=kimnx9006&logNo=220446806644 참고-->
          p:prefix="/view/"
          p:suffix=".jsp"/>
 
 
</beans>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs