4 분 소요

image


그레이들(Gradle)이란?

그레이들(Gradle)은 그루비(Groovy)를 기반으로 한 오픈소스 빌드 도구입니다. 엔트(Ant)의 자유도와 메이븐(Maven)의 관례를 통한 접근성을 바탕으로 이전 빌드툴의 단점을 보완하여 개선된 서비스를 제공합니다.

  • Gradle은 Groovy를 이용한 빌드 자동화 시스템입니다.
  • Gradle은 Groovy와 유사한 도메인 언어를 채용했습니다.
  • Gradle은 현재 안드로이드(Android) 앱을 만드는데 필요한 안드로이드 스튜디오(Android Studio)의 공식 빌드 시스템입니다.
  • Gradle은 Java, C/C++, 파이썬 등과 같은 여러 가지 언어를 지원합니다.
  • Gradle은 Ant처럼 매우 유연한 범용 빌드 도구입니다.
  • Gradle은 Maven과 같은 구조화된 빌드 (build) 프레임워크입니다(구조의 전환이 가능).
  • Gradle은 Maven, Ivy등의 기존 저장소 인프라 또는 pom.xml파일과 ivy.xml파일에 대한 마이그레이션(Migration)의 편의성을 제공합니다.
  • Gradle은 멀티 프로젝트 빌드를 지원합니다.
  • Gradle은 의존성 관리의 다양한 방법을 제공합니다.
  • Gradle은 빌드 스크립트(Build Script)를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)을 사용합니다.
  • Gradle은 기존 빌드(Build)를 구성하기 위한 풍부한 도메인 모델을 제공합니다.
  • Gradle은 설치 없이 Gradle Wrapper를 이용하여 빌드를 지원합니다.


장점

Ant, Maven과 같은 기존의 빌드 툴은 xml형식을 이용하여 정적인 설정정보를 구성했지만, Gradle은 Groovy라는 언어를 이용하여 코드로서 설정정보를 구성하기 때문에 구조적인 장점이 있습니다.

  • xml의 구조적인 틀을 벗어나 코딩에 의한 간결한 정의가 가능합니다.
  • xml을 사용하지 않기 때문에 코드가 장황하지 않습니다.
  • Groovy라는 언어를 기반으로 하기 때문에 변수 선언, if, else, for 등의 로직 구현이 가능합니다.
  • Gradle은 성능 향상을 위해서 증분 빌드, 작업 결과 캐싱, 증분 하위 작업, 데몬 프로세스 재사용, 병렬 실행, 병렬 다운로드 등의 기능을 지원합니다.
  • 프로젝트를 설정주입방식으로 정의하기 때문에 Maven의 상속 구조보다 재사용에 용이합니다.
  • 상위 프로젝트의 의존성 및 설정을 하위 프로젝트에서 상속받아 사용할 수 있기 때문에 중복 설정이 불필요합니다.
  • Gradle은 멀티 프로젝트 구성이 가능합니다. 하나의 저장소(repository)내에 여러개의 하위 프로젝트를 구성할 수 있습니다. 하나의 아티팩트(ex: jar)를 만들기 위해서 별도의 프로젝트를 만들고 저장소(repository)를 구성할 필요가 없습니다.


구조

모든 그레이들 스크립트(Gradle Script)는 하나 이상의 프로젝트(Project)로 구성되며, 모든 프로젝트는 하나 이상의 태스크(Taks)로 구성됩니다.

  • Project : 소스를 jar로 모으거나, 자바 프로젝트를 컴파일하거나, 테스트를 실행하고, 어플리케이션을 배포하는 등의 업무로 구성됩니다.
  • Task: 작업의 최소단위입니다. Task간 의존관계 설정과 함께 흐름에 따른 구성이 가능하며, 동적인 태스크의 생성도 가능합니다.

  • Gradle은 자바6(Java 6)버전 이상의 VM환경에서 사용이 가능하며, 설치를 하거나 Gradle Wrapper를 이용하여 실행환경을 구성할 수 있습니다.


Gradle Wrapper

  1. 이미 존재하는 프로젝트를 새로운 환경에서 설치할 때 별도의 설치나 설정 과정 없이 곧 바로 빌드할 수 있게 하기 위함입니다. (Java나 Gradle도 설치할 필요가 없으며, 로컬에 설치된 Gradle 또는 Java의 버전도 신경쓸 필요가 없습니다. 따라서 항상 wrapper를 사용할 것을 권장합니다.)

  2. Wrapper는 사용자가 Gradle이 설치되어 있지 않아도 Gradle Tasks를 실행할 수 있도록 해주는 작은 script, jar 및 등록 정보 파일입니다.

  3. Wrapper를 생성하면 사용자가 프로젝트를 만든 사람과 동일한 버전의 Gradle을 사용할 수 있습니다.

Gradle Wrapper 실행

$ gradle wrapper

BUILD SUCCESSFUL in 602ms
1 actionable task: 1 executed

아래와 같은 구조로 파일이 생성됩니다.

.
├── build
├── gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

2 directories, 5 files

Wrapper를 사용하면 다음과 같이 실행이 가능합니다.

$ ./gradlew build


라이프 사이클(Life Cycle)

1. 초기화(Initialization): 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성합니다. settings.gradle 파일에서 프로젝트를 구성합니다(멀티프로젝트, 싱글프로젝트 구분).

2. 구성(Configuration): 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행합니다.(프로젝트 객체 구성). configuraed Task를 실행합니다.

3. 실행(Execution): 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상을 결정합니다. Gradle 명령행에서 지정한 태스크 이름 인자와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 Task들을 실행합니다.


설정 파일

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

image


자바(Java) 프로젝트 예시

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

메이븐(Maven) 디렉터리 구조가 자바(Java) 소스와 리소스에 사용된다고 가정합시다. 이 디렉토리들은 src/main/java, src/main/resources, src/test/java, scr/test/resources입니다.

build.gradle

// 1. 플러그인(Plugin) 설정
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'

// 2. 저장소 설정
repositories {
    mavenLocal() // maven 로컬 캐시 저장소
    mavenCentral() // maven 중앙 저장소
    maven { url "http://www.egovframe.go.kr/maven/" } // maven 원격 저장소
}

// 3. 의존관계 설정
// 의존관계는 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'
}

1. 플러그인(Plugin) 설정

플러그인(Plugin)은 미리 구성해 놓은 Task들의 그룹이며, 특정 빌드과정에 필요한 기본정보를 포함하고, 필요데 따라 정보를 수정하여 목적에 맞게 사용할 수 있습니다.

  • Java 프로젝트를 위해 정의한 ‘Java 플러그인’에서는 complieJava, classes, test, jar 등의 task를 제공합니다.
  • Web 프로젝트를 위한 ‘War 플로그인’에서는 어플리케이션 소스를 war파일로 묶어주는 war task를 제공합니다.

2. 저장소 설정

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

  • repositories로 다운로드 받은 jar는 $GRADLE_HOME$\caches\modules-2\file-2.1 경로에 캐시됩니다.

3. 의존관계 설정

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

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


개발도구

이클립스(Eclipse)에서 제공하는 Buildship 플러그인 개발도그를 이용합니다.

  • 개발도구 플러그인(Buildship): Buildship Gradle Integration(프로젝트 생성, 가져오기, Task 확인, Task 실행, Test 실행, 실행취소 기능 지원)

태그:

카테고리:

업데이트:

댓글남기기