선생님, 개발을 잘하고 싶어요.

[Gradle] 4가지 기본 컨셉 이해하기 (project, build script, task, plugin) 본문

개발/gradle

[Gradle] 4가지 기본 컨셉 이해하기 (project, build script, task, plugin)

알고싶은 승민 2022. 9. 4. 16:07

서문

자바 프로젝트를 한다면 응당 빌드 문제를 겪게 됩니다. 자바 코드를 컴파일하고 컴파일한 파일을 묶어서 실행 파일을 내보내는 간단하고 매번 하는 작업부터 실제 프로덕션 환경에 배포하는 작업까지 정말 다양한 일들을 처리해야 하죠.

그리고 어느샌가부터 최근 IDE에서 프로젝트를 생성할 때 자동으로 이런 빌드 문제를 해결하기 위해서 gradle을 선택하고 있는 것 같습니다.

안드로이드 공부를 처음 시작해서 안드로이드 스튜디오를 봤을 때 항상 자동으로 구성되는 gradle을 사용하고 있었습니다만 그 세부내용은 이해하지 못하고 있었습니다.

혹시 저와 같은 사람들이 있을까 하여 gradle 관련 학습내용을 공유합니다.

이번 포스팅을 잘 따라오려면 다음과 같은 걸 알고 있으면 좋습니다.

  • 커맨드 라인 명령어와 함께 터미널을 활용

이번 포스팅을 읽으면 좋은 대상은 다음과 같습니다.

  • gradle은 사용하지만 이게 뭔지 모르는 사람

이번 포스팅으로 gradle을 지배하는 기본 콘셉트을 이해하고 독자분들이 각자의 프로젝트에서 build.gradle을 gradle의 관점에서 바라볼 수 있었으면 좋겠습니다.

이번 포스팅에서 다루는 내용은 다음과 같습니다.

  • 기본 컨셉 (project, build script, task, plugin)이 무슨 목표가 있나 이해한다.

용어는 다음처럼 통일해서 사용하려 합니다.

  • 기본 콘셉트에 해당하는 단어는 한글로 작성합니다.
    • gradle: 그래들
    • project : 프로젝트
    • build script : 빌드 스크립트
    • task : 테스크
    • plugin : 플러그인
  • 구분하기 쉽게 이렇게 표시로 강조됩니다.

포스팅을 따라가면서 총 두개의 그래들 프로젝트를 만들게 될 텐데, 최종 폴더 구조를 확인할 수 있도록 깃허브에 업로드하였습니다.

깃허브 : https://github.com/greedy0110/greedy-gradle

 

사전준비

실습을 하며 같이 진행할 예정이라서 다음 두 프로그램이 필요합니다.

  • gradle
  • java

그래들 설치는 다음을 확인해주세요. 그래들 설치하기

자바 설치는 다음을 확인해주세요. 자바 설치하기

다음 커맨드로 그래들 설치를 확인해주세요.

gradle --version

다음 커맨드로 자바 설치 확인해주세요.

java --version

참고로 필자의 작업 환경은 다음과 같습니다.

  • OS: Mac OS X 12.5,
  • Gradle: 7.5.1
  • Java: openjdk 16.0.1

윈도우로 실습하시는 분들은 gradlew 파일 실행 방법이 다음 처럼 다릅니다. 참고해주세요.

./gradlew help # mac, linux : 본 포스팅 기준 테스크 실행하는 커맨드
gradlew help # windows : 윈도우 사용자는 이렇게 해주세요.

 

기본 컨셉 빠르게 확인하기

백문불여일견이라고 합니다. 직접 그래들 프로젝트를 구성하며 확인해봅시다.

프로젝트

그래들 프로젝트를 구성해봅시다.

우선 프로젝트 폴더를 만들고 이동합니다.

mkdir gradle-project
cd gradle-project

이제 본격적으로 그래들 프로젝트를 초기화 해봅시다. 이걸 위해서 그래들이 제공하는 init 커맨드를 사용합니다.

gradle init

이 후 이어지는 모든 설정 값은 모두 엔터를 눌러서 기본으로 세팅해주세요.

이걸로 프로젝트 구성이 끝났습니다. 정말 쉽죠?

구성이 끝나면 비어있던 폴더는 여러가지 파일로 초기화됩니다.

build.gradle 파일은 우리가 실습할 때 수정할 파일이 됩니다, 빌드 스크립트를 다룰 때 더 자세하게 알아볼 예정입니다.

우리가 설정할 때 다운로드 받았던 gradle을 사용해도 테스크 수행이 가능합니다만 이번 포스팅과 이후에는 여러 부가 기능을 제공하는 gradlew를 사용할 것입니다.

빌드 스크립트

📌 빌드 스크립트그래들 프로젝트를 설정하는 파일입니다.

프로젝트가 어떤 의존성을 사용할 건지, 프로젝트를 통해서 어떤 동작(e.g. 컴파일, 프로젝트 실행, 배포)를 설정하는 곳입니다.

그래들에서 빌드 스크립트코드입니다. 정말 중요한 지점입니다. 🌟 빌드 스크립트는 코드로 작성됩니다.

이번 포스팅은 jvm 기반 동적 언어인 groovy를 사용해서 빌드 스크립트를 구성합니다.

빌드 스크립트가 코드인지 확인하기 위해서 전통적인 hello world 출력을 해봅시다.

최초에 만들어진 build.gradle에 다음 내용을 추가합니다.

println 'hello gradle build script'

그리고 커맨드라인에서 다음 커맨드를 실행해봅니다.

./gradlew

# > Configure project :
# hello gradle build script

 

그래들 커맨드가 프로젝트를 설정하는 과정에 우리가 빌드 스크립트에 추가한 코드가 동작해서 콘솔에 출력되는 걸 확인할 수 있습니다.

테스크

자바 애플리케이션을 빌드한다고 생각해봅시다. 어떤 일이 필요할까요? 크게 다음의 작업이 순차적으로 실행되면 될 것 같습니다.

  1. 자바 코드(.java 파일)을 컴파일해서 클래스 파일(.class 파일) 만들기
  2. 클래스 파일을 패키징해서 실행 파일(.jar 파일) 만들기

📌 이런 각각의 작업 단위를 그래들에서 테스크라고 합니다.

테스크는 다음 구문으로 실행할 수 있습니다.

./gradlew <task-name>

실험 삼아서 현재 프로젝트에 적용된 모든 테스크를 확인해볼까요?

이런 일을 해주는 테스크가 기본 tasks라는 이름으로 정의 되어있습니다.

./gradlew tasks

다양한 테스크

기본 설정된 테스크만 사용할 수 있다면 우리 프로젝트에 필요한 특별한 동작을 적용하기 어려울 겁니다.

그래서 그래들은 우리가 커스텀 테스크를 추가 등록할 수 있는 방법을 제공합니다.

테스크를 실행할 때 'hello task'를 출력하는 hello 테스크를 정의해볼까요?

build.gradle에 다음 내용을 작성합니다.

tasks.register('hello') {
    println 'hello task'
}

방금 우리가 등록한 테스크가 정상적으로 동작하는지 확인해봅시다.

./gradlew hello

# hello task

여기서 알 수 있듯 다음과 같은 형태로 우리만의 테스크를 추가할 수 있습니다.

tasks.register('<테스크-이름>') {
    // 테스크 설정
}

더 나아가서 좀 더 복잡한 테스크를 생각해봅시다.

test.txt파일을 build 폴더로 복사하는 요구사항이 있다고합시다.

파일 복사를 위한 테스크의 틀인 테스크 클래스Copy로 이미 정의가 되어있습니다.

우선 test.txt 파일을 만듭니다.

echo "hello test txt" > test.txt

build.gradle에 Copy 테스크 클래스를 확장해서 우리만의 테스크를 등록해봅시다.

tasks.register('copyTxt', Copy) {
    // 테스크를 설정한다.
    from 'test.txt'
    into "$buildDir"
}

방금 등록한 커맨드를 실행하면, build/test.txt 에 정상적으로 파일이 복사된 걸 확인할 수 있습니다.

./gradlew copyTxt
cat build/test.txt

# hello test txt

기존에 있는 테스크 클래스에 설정만 바꿔서 활용하는 경우 테스크를 다음처럼 등록할 수 있습니다.

tasks.register('<테스크-이름>', TaskClass) {
    // 테스크 설정
}

플러그인

자바 애플리케이션을 빌드하기 위해서 자바코드를 컴파일하는 테스크, 클래스파일로부터 실행파일을 만드는 테스크를 등록할 수 있습니다.

하지만 자바 애플리케이션을 만들 때마다 그런 테스크를 직접 작성해야 한다면 엄청 비효율적일 것입니다.

그래들은 이런 문제를 플러그인을 통해서 해결합니다.

 

📌 플러그인은 프로젝트에 자동으로 테스크를 추가해줍니다.

 

base 플러그인을 예시로 실습해볼까요?

플러그인 설정도 마찬가지로 빌드 스크립트에 코드로 설정합니다.

다음의 코드를 build.gradle 상단에 추가합니다.

plugins {
    id 'base'
}

끝났습니다. 이제 base 플러그인프로젝트에 적용되었습니다. 추가된 테스크를 확인하기 위해서 tasks 테스크를 한번 실행해보겠습니다.

./gradlew tasks

아까와 다르게 내가 정의하지도 않은 assemble, build, clean 테스크가 포함된 걸 확인할 수 있습니다.

실험 삼아서 clean 테스크를 실행해봅시다.

정상적으로 build 폴더가 삭제되는 걸 확인할 수 있습니다.

보았듯 다양한 기능을 제공하는 플러그인을 적용해서 손쉽게 복잡한 테스크프로젝트에서 사용하고 다양한 종류의 애플리케이션을 빌드할 수 있습니다.

최종 결과 : https://github.com/greedy0110/greedy-gradle/tree/main/gradle-project

 

관련 링크

Comments