Archive/Spring

[Spring] Gradle의 소개와 spring에서의 gradle 설정

cyBisu 2019. 4. 18. 13:24

[Spring]Gradle의 소개와 spring에서의 gradle 설정


Gradle 소개

Gradle은 Groovy를 이용한 빌드 자동화 시스템이다. Groovy와 유사한 도메인 언어를 채용하였으며, 현재 안드로이드 앱을 만드는데 필요한 안드로이드 스튜디오의 공식 빌드 시스템이기도 하다. Java, C/C++, Python 등과 같은 여러 가지 언어를 지원한다.


Ant vs Maven vs Gradle

Java 빌드 자동화 툴에는 크게 3가지 Ant, Maven, Gradle이 사용되어 왔고, 지금도 사용되고 있다.

  • Ant(Another Neat Tool)

    • Ant는 Java application의 빌드 과정을 자동화하기 위해 사용되는 Java 라이브러리

    • 'Make'와 유사하고, 특별한 지식없이 쉽게 사용 가능

    • XML 파일로 작성

    • 코딩 컨벤션이나 프로젝트 구조를 강요받지 않기 때문에 유연함이 주요 장점

    • build.xml

      <project>
      <target name="clean">
          <delete dir="classes" />
      </target>
      
      <target name="compile" depends="clean">
          <mkdir dir="classes" />
          <javac srcdir="src" destdir="classes" />
      </target>
      
      <target name="jar" depends="compile">
          <mkdir dir="jar" />
          <jar destfile="jar/HelloWorld.jar" basedir="classes">
              <manifest>
                  <attribute name="Main-Class"
                    value="antExample.HelloWorld" />
              </manifest>
          </jar>
      </target>
      
      <target name="run" depends="jar">
          <java jar="jar/HelloWorld.jar" fork="true" />
      </target>
      </project>

위 build.xml 예제에서는 classes 디렉터리를 지우고, 컴파일을 거치면서 디렉터리를 생성하고 그 안에 src를 넣는 부분이다. 최종적으로 jar 파일을 만들고 실행하게 된다.

  • Maven

    • Ant와 마찬지로 XML로 작성 (훨씬 더 다루기 쉽게)
    • 지켜야 하는 규칙과 정의된 명령어 존재
    • 그렇기 때문에 Ant보다는 유연성 부족
    • pom.xml이라는 설정 파일에 작성
    <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>baeldung</groupId>
      <artifactId>mavenExample</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <description>Maven example</description>
    
      <dependencies>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
              <scope>test</scope>
          </dependency>
      </dependencies>
    </project>
  • Gradle

    • XML을 사용하지 않고, Groovy에 기반한 DSL 사용 (DSL이란 특정 도메인에 특화된 언어)
    • Ant와 Maven의 장점을 접목 (Ant의 유연함Maven의 강력한 의존 라이브러리 관리 기능)
    • 최소한의 기능만 제공 → plugin을 추가함으로써 사용자 커스터마이징 가능
    • 빌드와 테스트 실행 결과 Maven에 비해 빠르다.(Gradle이 캐시를 사용하기 때문에 테스트 반복 시 차이가 더 커진다.)
    • 스크립트 길이와 가독성 면에서 Maven에 비해 앞선다.
    • 의존성이 늘어날수록 성능과 스크립트 품질의 차이가 심해진다.
    apply plugin: 'java'
    
    repositories {
      mavenCentral()
    }
    
    jar {
      baseName = 'gradleExample'
      version = '0.0.1-SNAPSHOT'
    }
    
    dependencies {
      compile 'junit:junit:4.12'
    }

Gradle

  • build.gradle example

    plugins {
      id 'java'
    }
    group 'com.chanyoung'  
    version '1.0-SNAPSHOT'
    
    sourceCompatibility = 1.8
    
    repositories {  
        mavenCentral()  
    }
    
    dependencies {  
        testCompile group: 'junit', name: 'junit', version: '4.12'  
    }
    

    위 파일은 Intellij에서 gradle java 프로젝트를 만들고, Add Framework Support를 이용하여 SpringMVC를 추가했기 때문에 기본 구성만 되어 있다.

    
    apply plugin: 'java'  
    apply plugin: 'eclipse-wtp'  
    apply plugin: 'war'
    
    compileJava.options.encoding = 'UTF-8'  
    sourceCompatibility = 1.7  
    version = '1.0'
    
    eclipse {  
      wtp {  
        facet {  
          facet name: 'jst.web', version: '3.0' //Servlet Spec Version 지정  
          facet name: 'jst.java', version: '1.7' //Java Version 지정, 1.7 ...  
        }  
      }  
    }
    
    jar {  
      manifest {  
        attributes 'Implementation-Title': 'Gradle Quickstart',  
        'Implementation-Version': version  
      }  
    }
    
    repositories {  
      mavenCentral()  
    }
    
    dependencies {  
      compile group: 'commons-collections',  
      name: 'commons-collections',  
      version: '3.2'  
      testCompile group: 'junit', name: 'junit', version: '4.+'  
    }
    
    test {  
      systemProperties 'property': 'value'  
    }
    
    uploadArchives {  
      repositories {  
        flatDir {  
          dirs 'repos'  
        }  
      }  
    }  

    위 파일은 '열혈강의 자바 웹 개발 워크북' 책 p663~664를 참고