프로그래밍/gradle

[gradle] 기본개념, 특징, 패키지 구조, 간단한 사용법

컴뀨 2022. 1. 10. 17:59

Gradle

Gradle은 Groovy를 기반으로 한 빌드 도구이다. AntMaven 과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 도구이다.

참고링크 : Gradle (github)

Ant

  • XML 기반으로 빌드 스크립트를 작성한다.
  • 자유롭게 빌드 단위를 지정할 수 있다.
  • 간단하고 사용하기 쉽다.
  • 유연하지만 프로젝트가 방대해지는 경우 스크립트 관리나 빌드 과정이 복잡해진다.
  • 생명주기(Lifecycle)을 갖지 않아 각각의 결과물에 대한 의존관계 등을 정의해야 한다.

Maven

  • XML 기반으로 작성한다.
  • 생명주기(Lifecycle)와 프로젝트 객체 모델(POM, Project Object Model)이란 개념이 도입됐다.
  • Ant의 장황한 빌드 스크립트를 개선했다.
  • pom.xml 에 필요한 라이브러리를 선언하면 자동으로 해당 프로젝트를 불러와 편리하다.
  • 상대적으로 학습 장벽이 높다.
  • 라이브러리가 서로 의존하는 경우 복잡해질 수 있다.

Gradle의 특징

Gradle은 앞서 살펴본 AntMaven 이 가진 장점을 모아 만들었다. 의존성 관리를 위한 다양한 방법을 제공하고 빌드 스크립트를 XML 언어가 아닌 JVM에서 동작하는 스크립트 언어 ‘그루비’ 기반의 DSL(Domain Specific Language)를 사용한다.

그루비(Groovy)는 자바 문법과 유사하여 자바 개발자가 쉽게 익힐 수 있는 장점이 있으며 Gradle Wrapper 를 이용하면 Gradle이 설치되지 않은 시스템에서도 프로젝트를 빌드할 수 있다.

심지어 메이븐(Maven)의 pom.xml을 Gradle 용으로 변환할 수도 있으며 Maven의 중앙 저장소도 지원하기 때문에 라이브러리를 모두 그대로 가져다 사용할 수 있다.

Build Lifecycle

  1. 초기화(initialization) : 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성.
  2. settings.gradle 파일에서 프로젝트 구성 (멀티프로젝트, 싱글프로젝트 구분)
  3. 구성(configuration) : 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행.
    Configured Task 실행
  4. 실행(Execution) : 구성 단계에서 생성하고 설정된 프로젝트의 task 중에 실행 대상 결정.
    gradle 명령행에서 지정한 task 이름 인자와 현재 디렉토리를 기반으로 task를 결정하여 선택된 task들을 실행

Build 설정파일

  • settings.gradle : 프로젝트 구성 설정. (싱글 프로젝트의 경우 생략 가능)
    • Gradle은 멀티프로젝트를 구성하여 프로젝트간의 의존성 및 서브프로젝트, 교차 프로젝트를 구성할 수 있다.
  • build.gradle : 빌드에 대한 모든 기능 정의.
  • 표준프레임워크에 적용한 Gradle 빌드 환경의 폴더구조
    gradle은 다양한 방식으로 시스템을 구성할 수 있으나, java 플러그인을 이용한 표준 리소스 구성을 적용하여 기존 메이븐 프로젝트의 구성을 유지할 수 있다.

Gradle 사용법

build.gradle 파일에 빌드정보를 정의하여 프로젝트에서 사용하는 환경 설정, 빌드방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성한다.

plugin 설정

plugin은 미리 구성해 놓은 task들의 그룹이며, 특정 빌드과정에 필요한 기본정보를 포함하고, 필요에 따라 정보를 수정하여 목적에 맞게 사용할 수 있다.

  • plugin을 이용한 빌드파일 설정
  • java 프로젝트를 위해 정의한 ‘java 플러그인’ 에서는 compileJava, classes, test, jar 등의 task를 제공한다.
  • web 프로젝트를 위한 ‘war 플러그인’ 에서는 어플리케이션 소스를 war파일로 묶어주는 war task를 제공한다.
apply plugin: 'java'
apply plugin: 'war'

// JDK version source compatibility
sourceCompatibility = 1.7

// project version
version = '1.0'

// War file name
war.baseName = 'sample'

// Web directory, this overrides the default value "webapp"
project.webAppDirName = 'src/main/webapp'
project.buildDir = 'target'

저장소 설정

Gradle은 Maven repository, JCenter repository, Ivy directory 등 다양한 저장소를 지원한다.

  • repositories로 다운로드 받은 jar는 $GRADLE_HOME$\caches\modules-2\files-2.1 경로에 캐시된다.
repositories {
    mavenLocal() // maven 로컬 캐시 저장소
    mavenCentral() // maven 중앙 저장소
    maven { url "http://www.egovframe.go.kr/maven/" } // maven 원격 저장소
}

의존관계 설정

Gradle은 java의 의존성 관리를 위해 다양한 ‘구성’을 제공하고 있다.

  • compile : 프로젝트 컴파일 과정에서 필요한 라이브러리
  • runtime : 프로젝트 실행 과정에서 필요한 라이브러리. (complie 구성의 라이브러리 포함)
  • testCompile : 프로젝트의 테스트 컴파일 과정에서 필요한 라이브러리. (컴파일된 클래스들과 compile 구성의 라이브러리 포함)
  • testRuntime : 프로젝트의 테스트 실행 과정에서 필요한 라이브러리. (compile, runtime, testCompile 구성의 라이브러리 포함)

의존관계는 group, name, version 순으로 의존성을 기술한다.

dependencies {
    compile(group: 'egovframework.rte', name: 'egovframework.rte.ptl.mvc', version:'3.5.0') {
        exclude(module: 'commons-logging')
    }
    compile group: 'egovframework.rte', name: 'egovframework.rte.psl.dataaccess', version:'3.5.0'
    compile group: 'egovframework.rte', name: 'egovframework.rte.fdl.idgnr', version:'3.5.0'
    compile group: 'egovframework.rte', name: 'egovframework.rte.fdl.property', version:'3.5.0'
    compile group: 'javax.servlet', name: 'jstl', version:'1.2'
    compile group: 'taglibs', name: 'standard', version:'1.1.2'
    compile group: 'org.antlr', name: 'antlr', version:'3.5'
    compile group: 'org.hsqldb', name: 'hsqldb', version:'2.3.2'
    providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
}

[참고] https://madplay.github.io/post/what-is-gradle

[참고] https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev3.6:dep:build_tool:gradle