Spring MVC Gradle IntelliJ 환경설정

1. IntelliJ Gradle Spring MVC 환경 설정

1.1. 테스트 환경

OS: Mac 10.14.6 Mojave

gradle: v5.5.12

apache-tomcat: v9.0.27

1.2. 스프링에서 환경설정을 할 수 있는 방법은 크게 두가지이다.

  • Eclipse와 STS

  • IntelliJ와 Gradle

그중에서 Gradle은 아래와 같은 일반적인 시나리오에서 빌드성능에 대한 테스트결과를 공개하였다. 테스트에 사용된 하드웨어는 Dell XPS 15, I7-4712HQ CPU @ 2.30GHz, 16GB of RAM, SSD, Linux Min 18.1이다.

Apache Common Lang3를 Maven에서 Gradle로 변경하여 테스트한 결과이다. 테스트를 실행한 결과는 Gradle이 약1.7배 정도 빠르며 Build Cache로 인한 빌드는 약 72배이상 빠르다고 나와있기 때문에 IntelliJ Idea와 Gradle을 사용하였다.

결론적으로

  • Gradle은 모든 시나리오에서 적어도 2배이상은 빠르다.
  • 변경 사항을 반영한 빌드에서는 Gradle이 Maven에 비해서 10~100배 빠르며, 하위프로젝트가 많으면 더욱 유리하다.

Gradle 성능 비교

1.3. Gradle 설정하기

Gradle 공식홈페이지

2019년 11월 기준 Gradle v5.6.4 버전이 최신버전으로 나와 있으며, Gradle설치하시기전에 JDK 1.7이상

Mac환경 기준으로 설명드리겠습니다. 위 링크를 클릭하여 Gradle을 받지못하신분들은 압축을 풀어 원하시는 폴더에 저장하신 후 프로젝트 준비를 해주시면 됩니다. 저 같은경우는 usr/library에 경로설정을 진행하였습니다.

Windows같은 경우는 C://드라이브 경로에 압축을 풀어서 진행합니다. 그리고 Gradle을 환경설정을 하는것이 좋기때문에 환경변수에 Path에 추가적인 설정이 필요합니다.

[내 컴퓨터] → [속성] → [고급 시스템 설정] → [고급] → [환경변수] → [Path] → [편집]

MAC 해당폴더 경로에 가서 Mac터미널에서 아래와 같은 명령어를 사용합니다.

Mac $./gradle -version

windows해당폴더 경로에 가서 Windows터미널에서 아래와 같은 명령어를 사용합니다. 단, 환경변수가 설정되어있어야 올바르게 작동합니다.

Windows gradle -v

2. Spring MVC 프로젝트 생성하기

IntelliJ를 실행하고 프로젝트 생성을 눌러줍니다.

여기에서 Gradle을 왼쪽에 그래들을 선택한 후 Java, Web에 선택을 하고 Next를 눌러줍니다.

  • GroupId
    • 자신의 프로젝트를 고유하게 식별자입니다.
    • package 명명 규칙을 따른다.
    • 하위 그룹은 얼마든지 추가할 수 있다.
  • ArtifactId
    • 제품의 이름으로, 버전 정보를 생략한 jar 파일의 이름이다.
    • 프로젝트 이름과 동일하게 설정한다.
    • 소문자로만 작성하며 특수문자는 사용하지 않는다.
  • Version
    • SNAPSHOT: 개발용, RELEASE: 배포용
    • 숫자와 점을 사용하여 버전 형태를 표현한다(1.0)
com.회사이름.프로그램이름 com.kgh.miniapp
com.회사이름.플랫폼.프로그램이름 com.kgh.miniapp.web.miniapp
kr.co.회사이름.프로그램이름 kr.co.kgh.miniapp
kr.co.회사이름.플랫폼.프로그램이름 kr.co.kgh.web.miniapp

위와 같은 형식으로 사용할 수 있습니다.

그 다음,

방금전에 다운받은 Gradle을 지정해주고 나머지 조건들은 그대로 두고 진행하였습니다.

저같은 경우는 이미 경로가 잡혀있었기 때문에 /Library/Java/JavaVirtual…으로 나오게되었습니다.

이제 Finish를 눌러 프로젝트를 생성해보겠습니다.

이때 프로젝트를 생성할 폴더를 하나 미리 만들어 주셔야 그 폴더안에 모든 설정파일들이 들어가게 됩니다. 만약 많은 폴더들이 존재하고 있는곳에 프로젝트를 finish누르게 된다면 시각적으로나 관리면에서 좋지않은 효율이 발생할 가능성이 높습니다.

이제 프로젝트가 Web, MVC형태로 만들어지게 되었습니다. 이제는 아직 추가되지 않은 스프링프레임 워크를 추가해보도록 하겠습니다.

해당 최상위 프로젝트에서 오른쪽 마우스 클릭 후 Add Framework Support를 눌러줍니다.

그 다음, Spring을 선택한후 OK를 클릭해줍니다. 이제 gradle.Build에다가 Maven Spring에 적용되던것들을 이제 build.gradle에 넣어주려고 합니다.

위에서 말씀드렸다시피 Eclipse+Maven조합, IntelliJ+Gradle조합 둘중하나로 프로젝트를 구성할 수 있기 때문입니다. 이제 그러면 build.gradle에 코드를 추가해봅시다.

1
2
3
4
5
6
7
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile group: 'org.springframework',name: 'spring-context',
version: '5.0.7.RELEASE'
compile group: 'org.springframework',name: 'spring-test', version: '5.0.7.RELEASE'
}

이제 해당 코드를 넣어주면 자동으로 다운로드와 빌드가 실행됩니다.

3. Lombok플러그인 추가

이제 Lombok을 사용하기 위해 추가적인 설정을 해봅시다.

Lombok공식사이트

3.1. Lombok을 사용하면 다음과 같은 이점을 가지고 있습니다.

lombok - Java 기반에서 기계적으로 작성하는 VO, DTO, Entity 관련 작업을 보다 쉽게 하게 해주는 도구입니다.

② Getter, Setter, ToString, hashCode 관련 메소드 작업 관련 Class(클래스) 코드를 깔끔하게 작성할 수 있습니다.

Spring(SpringSTS) 프로젝트에서 사용할 경우 JPA 환경과 함께 일관화 되고 가독성이 좋은 애플리케이션을 작성할 수 있습니다.

단점은 협업 모든 인원이 lombok을 설치해야 한다는 것과 추가 어노테이션 사용할 경우 소스코드 분석이 난해해지는 것 등이 있습니다.

이제 Lombok 장단점을 알았으니, 진행해봅시다.

상단에 IntelliJIdea를 눌러주시고 Preferences를 클릭해주세요. 그리고 왼쪽 상단에 Plugin을 클릭한다음 lombok을 검색하여 install해줍니다.

플러그인을 사용하고나면 Intellij를 재시작하게 되고, 이제 build.gradle 파일에 Lombok을 아래와 같이 추가해줍니다.

1
2
3
4
5
6
7
8
9
10
11


dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.springframework',name: 'spring-context',
version: '5.0.7.RELEASE'
compile group: 'org.springframework',name: 'spring-test', version: '5.0.7.RELEASE'
implementation('org.projectlombok:lombok:1.18.2')
// compile group: 'org.projectlombok', name: 'lombok', version: '1.18.0'

}

위와 같은 코드를 작성하면 IntelliJ Idea에서 자동으로 빌드 및 컴파일을 진행합니다

이때 주의 하실 사항이 있습니다.

1
2
    implementation('org.projectlombok:lombok:1.18.2')
// compile group: 'org.projectlombok', name: 'lombok', version: '1.18.0'

원인은 IntelliJ - How to solve lombok "Cannot resolve symbol 'log'" 컴파일시 해당 에러가 나타났습니다.

해결방법은 두가지가 있습니다.

1
2
3
4
5

implementation('org.projectlombok:lombok:1.18.2')
or
compileOnly 'org.projectlombok:lombok:1.18.6'
annotationProcessor 'org.projectlombok:lombok:1.18.6'

둘중 하나를 이용하면 에러를 해결할 수 있습니다. 정확한 원인은 컴파일대상과 IDE해석상의 문제가 발생한것으로 보입니다.

3.2. Lombok 컴파일 환경

이제 Lombok을 제대로 사용하기위해서 컴파일 환경을 설정해주어야합니다.

상단에 IntelliJIdea Preferences->build,Execution, Deployment ->Compiler->Annotaion Processors 를 클릭해서 들어옵니다.

이제 오른쪽 상단에 있는 Enable annotation processing을 클릭하여 컴파일할때 같이 돌아가도록 동작시켜줍니다. 그리고 OK를 누릅니다.

4. Log4j 라이브러리

이제 테스트나 Tomcat메시지를 조금 더 잘 확인할 수 있도록 log4j라이브러리를 사용할 것입니다.

System.out.println과 같이 로그를 찍을 필요가 없고 log를 사용할 것입니다.

build.gradle에 추가하여 log4j라이브러리를 사용해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile group: 'org.springframework',name: 'spring-context',
version: '5.0.7.RELEASE'
compile group: 'org.springframework',name: 'spring-test', version: '5.0.7.RELEASE'
compile group: 'org.springframework',name: 'spring-webmvc', version: '5.0.7.RELEASE'
implementation('org.projectlombok:lombok:1.18.2')
// compile group: 'org.projectlombok', name: 'lombok', version: '1.18.0'
compile group: 'log4j', name: 'log4j', version: '1.2.17'


}

4.1. log4j properties 설정하기

src내의 resource 경로에 log4.j.properties파일을 작성합니다.

1
2
3
4
5
6
7
8
9
log4j.properties
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %-5p %c{1}:%L - %m%n

다음과 같은 코드를 넣어줍니다. Log4j를 이용하기 위해서는 설정파일과 객체파일을 생성해야하므로 이것들을 properties에 담기위한 작업입니다.

5. Tomcat설정하기

Tomcat버전 apache-tomcat: v9.0.27

Intellij는 Tomcat을 설정하고 프로젝트실행에 Tomcat에 프로젝트를 추가하는 방식을 사용합니다.

그림

톰캣을 사용하기위해서 해당 Run->Edit Configuration을 선택합니다. 그리고 Deployment를 선택하여 +버튼으로 해당 톰켓 폴더를 선택해줍니다. 이제 그러면 tomcat이 활성화되고 실행이 가능합니다.

톰켓 실행시 오류

[IntelliJ says 'cannot run program '/path/to/tomcat/bin/catalina.sh' error=13 permission denied](https://stackoverflow.com/questions/3092049/intellij-says-cannot-run-program-path-to-tomcat-bin-catalina-sh-error-13-per)

라는 오류가 발생하면

chmod a+x /path/to/tomcat/bin/catalina.sh

해당 톰켓 경로를 직접 지정해서 경로 권한을 바꿔주어야합니다. 임의로 주어진 예시입니다.

6. Spring MVC추가와 XML파일 생성

build.gradle에 spring-webmvc를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
// testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.springframework',name: 'spring-context',
version: '5.0.7.RELEASE'
compile group: 'org.springframework',name: 'spring-test', version: '5.0.7.RELEASE'
compile group: 'org.springframework',name: 'spring-webmvc', version: '5.0.7.RELEASE'
implementation('org.projectlombok:lombok:1.18.2')
// compile group: 'org.projectlombok', name: 'lombok', version: '1.18.0'
compile group: 'log4j', name: 'log4j', version: '1.2.17'
}

compile group에 추가된 Name 'spring-webmvc’를 추가해줍니다.

6.1. 이제 root-context.xml과 servlet-context.xml을 추가해줍니다.

src밑에 webapp폴더에 필요한 폴더 구조를 생성해서 사용합니다. webapp밑에 'WEB-INF’폴더를 먼저 생성하고 Spring,appServlet폴더를 생성합니다.

이제, WEB-INF밑에 spring폴더에는 root-context.xml, servlet-context.xml 파일을 생성합니다. XML파일을 직접 생성할 수도 있지만 메뉴를 이용해서 생성할 수 있습니다.

src 오른쪽마우스 -> new -> XML Configuration -> Spring config를 선택하여 해당 root-context.xml, servlet-context.xml을 생성해줍니다.

servlet-contex.xml로 화면을 이동하면 Application Context…와 같은 메시지가 보이게 됩니다.

그리고 Project Structure를 확인해보면 root-context.xml과 servlet-context.xml파일이 추가된것을 확인할 수 있습니다.

7. Controller 추가하기

main폴더내에 java폴더 안에 org.kgh.controller라고 패키지를 생성하겠습니다. 생성된 패키지에 TestController클래스를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

package org.kgh.controller;

import lombok.extern.log4j.Log4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
@Log4j
public class TestController {
@GetMapping("/test")
public void doA(){
log.info("테스트중입니다.");

}
}


이 @Log4j, Lombok을 이용하는 컴파일이 정상적으로 실행되는지 확인합니다.

servlet-context.xml에서 설정해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven xmlns:mvc="http://www.springframework.org/schema/mvc"/>
<context:component-scan base-package="org.kgh.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>


이와 같이 설정해주게 되면 정확히 맵핑이 되어 진행될것입니다. 이제는 file-Project Structure내에 Facets항목을 열어서 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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<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>

다음과 같이 매핑되는것을 확인할 수 있고, 이제 톰캣을 확인해보면 정상적으로 서버가 구동되는것을 확인할 수 있습니다.

8. reference

https://gradle.org/releases/

https://www.holaxprogramming.com/2017/07/04/devops-gradle-is-faster-than-maven/

https://blog.naver.com/PostView.nhn?blogId=sharplee7&logNo=221412143968

https://niceman.tistory.com/99

https://stackoverflow.com/questions/3092049/intellij-says-cannot-run-program-path-to-tomcat-bin-catalina-sh-error-13-per