Build.gradle 이란 - build.gradle ilan

Build.gradle 이란 - build.gradle ilan

자바 프로젝트를 진행하다 보면 다양한 빌드 도구(Build Tool)를 접하게 됩니다. 이번 글에서는 자바 프로젝트에서 사용되는 빌드 도구의 종류와 차이점을 살펴보고, 그중에서도 최근에 주로 사용되고 있는 ‘그래들(Gradle)’의 사용 방법과 팁을 간단히 알아볼까 합니다. 적절한 빌드 도구의 활용은 프로젝트 개발 생산성에 중요한 영향을 미치기 때문에 신중히 선택해야 합니다.

빌드 도구(Build Tool) 란?

빌드 도구(Build Tool)란 소프트웨어 개발에 있어서 소스 코드를 실행 가능한 애플리케이션으로 만들어주는 도구를 말합니다. 빌드 과정을 자동화하여 관리하는 기능을 하기 때문에 빌드 관리 도구(Build Management Tool) 또는 빌드 자동화 도구(Build Automation Tool)라고 불리기도 합니다.

빌드 도구의 특징은 개발자가 스크립트를 작성하여 다양한 작업을 수행할 수 있게 합니다. 예를 들어 소스 코드를 컴파일하거나 패키징할 수 있으며, 테스트를 자동으로 수행하거나 의존성 주입 및 배포 작업을 할 수 있습니다. 또 빌드 도구 종류에 따라 스크립트 작성 시 사용하는 문법이 다른데요. 일반적으로 XML이나 특정 도메인 언어(ex. Groovy)를 사용합니다.

빌드 도구 종류와 차이점 (Ant, Maven, Gradle)

1) 앤트(Ant)

자바 프로젝트 빌드 도구로 가장 널리 사용되던 것이 바로 앤트(Ant)였습니다. 이클립스라는 IDE에 기본적으로 탑재되었으며, XML 스크립트를 기반으로 하였는데요. 최근에 나온 빌드 도구들과 달리 자동으로 라이브러리를 업데이트하는 기능이 없기 때문에 현재는 주로 레거시 시스템에서만 사용되고 있습니다.

2) 메이븐(Maven)

메이븐(Maven)은 Ant 이후에 나온 자바 빌드 도구로 자동으로 라이브러리와 의존성(dependency)을 관리하는 기능이 있습니다. Ant와 마찬가지로 XML 스크립트를 기반으로 하며, pom.xml 파일로 의존성을 관리합니다. Maven에서는 라이프 사이클(Life Cycle) 개념이 도입되어 빌드 순서 등을 정의할 수 있습니다.

3) 그래들(Gradle)

그래들(Gradle)은 가장 최근에 나온 자바 빌드 도구로 ‘그루비(Groovy)’ 문법을 사용합니다. Build.gradle에 스크립트를 작성하며, 대규모 프로젝트에서 복잡해지는 경향이 있는 XML 기반 스크립트에 비해 관리가 편하다는 장점이 있습니다. Gradle은 현재 안드로이드 프로젝트의 표준 빌드 시스템으로 채택되어 있기도 합니다.

Gradle을 사용해야 하는 이유

1) 간결한 스크립트

Gradle 이전의 빌드 도구인 Ant와 Maven은 XML 문법으로 스크립트를 작성하였습니다. XML은 여는 태그와 닫는 태그(이른바 껍데기 태그)를 넣어야 하기 때문에 복잡한 빌드 스크립트를 작성하기가 어려우며 가독성이 떨어집니다. 반면, Gradle은 Groovy 문법으로 간결한 스크립트를 작성할 수 있습니다.

2) 빌드 속도

프로젝트 규모가 커지게 되면 빌드 속도 차이가 개발 생산성에 큰 영향을 미치게 됩니다. Gradle은 캐싱(caching)을 하기 때문에Ant나 Maven 같은 이전 빌드 도구보다 빌드 속도가 빠릅니다. Gradle vs Maven Comparison에서는 빌드 캐시(Build cache)를 이용할 경우Gradle과 Maven의 빌드 속도가 최대 100배까지 벌어질 수 있다고 합니다.

Build.gradle 이란 - build.gradle ilan
<출처: Gradle vs Maven Comparison>

3) 멀티 프로젝트 빌드

대규모 자바 프로젝트는 대부분 다중 모듈로 구성됩니다. 즉, 하나의 프로젝트 안에 여러 모듈이 동시에 개발되며, 각 모듈이 공통으로 사용하는 모듈도 만들어지게 되는데요. 이렇게 여러 모듈 동시에 개발되는 경우 각각 따로 빌드 작업을 하면 번거로울 뿐만 아니라 실수가 생기기도 쉽습니다. Gradle의 멀티 프로젝트 빌드 기능을 이용하면 이런 번거로움과 실수를 획기적으로 줄일 수 있습니다.

Gradle 사용 방법과 팁

1) Gradle 프로젝트 생성

Gradle 프로젝트를 생성하려면, 인텔리제이(IntelliJ) 초기 화면에서 빌드 시스템으로Gradle을 선택하면 됩니다. 이때 프로그래밍 언어가 자바(Java)로 되어 있으면, 자동으로 JDK 버전이 설정됩니다. 프로젝트 이름을 정하고 Create 버튼을 누르면 Gradle 프로젝트가 만들어집니다.

Build.gradle 이란 - build.gradle ilan
<출처: 곰씨네 IT 블로그>

2) Gradle 스크립트 작성

Gradle 프로젝트에서는 build.gradle이 핵심 파일입니다. 최근에는 코틀린(Kotlin) 문법으로 작성되기도 하지만 웹 프로젝트에서는 여전히 Groovy 문법으로 작성되는 경우가 많습니다. 따라서, Gradle 스크립트를 작성하려면 두 가지 문법을 모두 알아 두는 것이 좋습니다.

3) Gradle 사용 팁

Gradle프로젝트를 진행할 때 각 개발자의 로컬 환경에 영향을 받지 않도록 그래들 래퍼(Gradle Wrapper)를 사용하는 것을 추천합니다. 간혹 Gradle Wrapper 없이 프로젝트를 진행하는 케이스를 접하기도 하는데요. Gradle Wrapper가 없으면 대규모 프로젝트에서 초기 환경 설정 시 많은 시간을 허비하게 됩니다.

따라서 초기 프로젝트 세팅 시 Gradle Wrapper 사용을 검토할 것을 적극 권장하는데요. 특정 버전의 Java나 Gradle을 설치할 필요 없이 바로 프로젝트를 실행할 수 있기 때문에 번거로운 작업을 줄일 수 있습니다. 참고로, Gradle Wrapper 사용 방법에 대한 자세한 내용은 해당 문서를 살펴보길 바랍니다.

빌드 도구의 중요성

이상 자바 빌드 도구 종류에 대해서 살펴보고, 그중에서 Gradle의 특징과 사용 방법 등을 알아봤습니다. 자바 프로젝트에서 어떤 빌드 도구를 어떻게 활용하는지에 따라 개발 생산성에 큰 차이가 생길 수 있습니다. 따라서 빌드 도구를 적절히 활용하는 방법에 대해서 꾸준히 관심을 가지고 공부해 둘 필요가 있습니다.

요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.

A work-loving developer

프로그래밍 언어/Java

Gradle이란 무엇인가? (+ Ant, Maven 비교)

Jae Honey 2022. 5. 28. 19:12

Gradle이란

그래들(Gradle)은 그루비(Groovy)를 기반으로 한 빌드 도구이다. Ant, Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 자동화 도구이다.

빌드 자동화의 목적은 소프트웨어 개발자가 반복적으로 해야 하는 코딩을 잘 짜여진 프로세스를 통해 자동으로 실행하며, 믿을 수 있는 결과물을 생산해내는 일련의 과정을 말한다.

짧게 요약하면 라이브러리를 간편하게 추가하고 관리할 수 있고, 버전도 효율적으로 동기화해서 개발자가 비즈니스 로직에 집중할 수 있게 도와준다.

빌드 도구는 Ant -> Maven -> Gradle 순으로 발전되어 왔다.

이전 세대 빌드 도구의 특징

앞서 언급했듯 이전 세대 빌드 도구는 대표적으로 Ant, Maven이 있다. 아래의 특징을 살펴보자.

[Ant]

  • XML 기반으로 빌드 스크립트를 작성한다.
  • 자유롭게 빌드 단위를 지정할 수 있다.
  • 쉽고 간단하다.
  • 프로젝트가 커지면 스크립트 관리나 빌드 과정이 복잡하다.
  • 생명주기(Lifecycle)을 갖지 않아서 각각의 target에 대한 의존 관계를 명시해야 한다.

[Maven]

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

Gradle의 특징

Gradle은 앞서 언급한 Ant와 Maven이 가진 장점을 함께 가지고 있다. 의존성 관리를 위한 다양한 기능을 제공하고 빌드 스크립트를 XML 언어가 아닌 JVM에서 동작하는 스크립트 언어 그루비 기반의 DSL(Domain Specific Language)를 사용한다.

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

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

Gradle이 Maven보다 좋은 점을 정리하면 다음과 같다.

[Maven]

  • Maven의 경우 Build를 XML로 정의하기에는 어려운 부분이 많다.
    • 설정이 길어지고 가독성이 떨어진다.
    • 의존 관계가 복잡할 경우 풀어내기가 어렵다.

[Gradle]

  • Gradle에서는 그루비 기반의 DSL을 사용한다.
    • 의존 관계가 복잡하더라도 가독성 좋게 풀어낼 수 있다.
    • 동적인 Build를 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다. (Java와 문법이 유사하다.)
  • Gradle 설치 없이 Gradle Wrapper를 이용해서 빌드를 지원한다.
  • 상속 구조를 활용해서 멀티 모듈을 구현할 수 있다.
  • 빌드 속도가 Maven보다 10~100배 빠르다고 한다.
  • 기존의 빌드 스크립트를(ant, maven)을 간단하게 변환할 수 있다.

Gradle 설치

MacOS 기준으로 간단하게 brew를 이용하면 간편하다. 주의할 것은 설치된 JDK 또는 JRE 버전이 8 이상이어야 한다.

build.gradle

build.gradle 파일은 빌드 스크립트라고  부르며, 정확하게는 빌드 구성 스크립트(Build Configuration Script)라고 한다.

빌드 구성 스크립트는 의존성이나 플러그인 설정 등과 같은 빌드에 필요한 설정을 하게 된다.

build.gradle을 구성하는 요소와 다양한 기법에 대해 알아보자.

repositories 메소드

repositories 메소드는 저장소 설정을 담당한다. 클로저 내용은 RepositoryHandler를 통해 실행된다. RepositoryHandler는 메이븐 중앙 저장소 추가를 위한 mavenCentral 메소드와 Bintray의 jCenter 저장소 추가를 위한 jcenter 메소드를 제공한다.

예를 들어 사내 maven repository에서 라이브러리를 가져올 때 아래와 같이 명시한다.

repositories {
    mavenCentral()
    maven {
        allowInsecureProtocol(true)
        url 'https://repo.company.com/repository/maven-repository/'
    }
}

ext 메소드

ext 메소드는 그 인자를 buildScript 에서 전역변수로 사용하기 위해 사용된다. 

ext {
    queryDslVersion = '4.4.0'
}

dependencies 메소드

의존성 라이브러리를 추가할 때 사용한다. 가장 많이 봤을 것이다.

대표적으로 아래의 옵션들을 제공한다.

  • implementation
    • 의존 라이브러리 수정시 본 모듈까지만 재빌드한다.
  • api
    • 의존 라이브러리 수정시 본 모듈을 의존하는 모듈들을 전부 재빌드한다.
  • compileOnly
    • compile 시에만 빌드하고 빌드 결과물에는 포함하지 않는다.
  • testImplementation
    • 테스트 코드를 수행할 때만 적용
  • annotationProcessor
    • annotation processor 명시 (ex. annotationProcessor 'org.projectlombok:lombok')

플러그인 추가

plugins는 Gradle 플러그인을 사용하기 위한 것이다.

plugin을 등록하면 해당 플러그인에 포함된 수많은 Task들이 Gradle 파일로 들어온다.

plugins {
    id 'org.springframework.boot' version '2.5.1'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
    id "org.asciidoctor.convert" version "1.5.9.2"
    id 'java'
}

Task

Gradle의 실행 작업 단위가 태스크(task)이다. Gradle은 기본적으로 태스크를 수행하며 태스크를 구성하고 작성하는 것이 빌드 스크립트를 작성하는 과정이다.

task는 아래와 같은 구조를 작성하면 된다.

문자열을 출력하는 간단한 태스크를 작성해보자. build.gradle 파일에 아래와 같이 작성해주면 된다.

task sayHello {
    println 'Hello'
}

실행은 터미널에서 gradle task으로 형태로 입력하면 된다.

gradle sayHello

IntelliJ를 비롯한 IDE를 사용하고 있으면 build.gradle에서 해당 태스크 위치의 버튼으로 실행할 수도 있다.

Build.gradle 이란 - build.gradle ilan

doFirst, doLast

doFirst를 사용하면 해당 구문을 태스크에서 가장 처음 수행할 수 있다. doLast는 가장 마지막에 수행할 구문을 정의할 수 있다.

task hello {
    doFirst {
        println 'hello'
    }

    doLast {
        println 'bye'
    }
}

[Result]

> Task :hello
hello
bye
BUILD SUCCESSFUL in 598ms
1 actionable task: 1 executed

-q task

태스크를 실행할 때 -P파라미터이름=값을 이용하여 파라미터를 전달할 수 있다.

task hello {
    def variable = count.toInteger()
    println('hello ' + variable)
}

[Result]

$ gradle -q hello -Pcount=3
hello 3

dependsOn

태스크가 실행될 때 의존성을 지정하여 태스크의 실행 순서를 지정할 수 있다. dependsOn를 사용하여 먼저 실행할 태스크를 지정할 수 있다.

task hello(dependsOn:['aaa', 'bbb'])  {
    doFirst {
        println("*** start:hello task ***")
    }
    doLast {
        println("*** end:hello task ***")
    }
}
 
task aaa {
    doLast {
        println("<< This is A task! >>")
    }
}
 
task bbb {
    doLast {
        println("<< I'm task B!! >>")
    }
}

[Result]

$ gradle hello

> Task :aaa
<< This is A task! >>

> Task :bbb
<< I'm task B!! >>

> Task :hello
*** start:hello task ***
*** end:hello task ***


Reference

  • https://madplay.github.io/post/what-is-gradle
  • https://araikuma.tistory.com/464