Gradle & Groovy - 첫 프로젝트 생성

0

gradle

목록 보기
4/5

안녕하세요! 백엔드 개발자 Kerry 입니다.

이번에는 찐 본격적인 Gradle 프로젝트 세팅을 해보려고 합니다?
(왜 계속 본격적이지?)

개인적으로 학습한 내용을 정리하는 글이며 틀린 점이 있다면 가감없이 알려주세요!! 언제나 환영입니다!!

Project & Task

Gradle 빌드 시스템에서 Project와 Task 클래스는 가장 핵심적인 역할을 담당합니다. 이 두 클래스는 빌드 스크립트 내에서 빌드 로직과 실행 단위를 구성하고 관리하는 데 사용되며, 각각의 역할과 특징은 다음과 같습니다.

Project

Project는 Gradle 빌드의 기본 단위로, 하나의 프로젝트(또는 서브프로젝트)를 나타냅니다.

각 Project는 빌드 스크립트(예: build.gradle), 소스 코드, 리소스, 설정 등을 포함하는 디렉터리를 대표하며, 프로젝트와 관련된 모든 구성 요소와 Task를 포함합니다.

역할과 특징
  • 빌드 구성의 핵심
    프로젝트에 대한 이름(name), 그룹(group), 버전(version) 등 기본 메타정보를 관리합니다.
    빌드 스크립트에서 직접 접근하여 설정할 수 있으며, 이 값들은 빌드 산출물이나 의존성 관리 등 다양한 부분에서 사용됩니다.

  • Task 관리
    프로젝트는 자체적으로 Task 컨테이너를 가지고 있으며, 이를 통해 개별 Task를 생성, 등록, 구성할 수 있습니다.
    예를 들어, project.task('myTask') { ... }와 같은 방식으로 태스크를 정의하고 설정할 수 있습니다.

  • 하위 프로젝트(멀티 프로젝트 빌드) 관리
    Gradle은 멀티 프로젝트 빌드를 지원합니다. 최상위(root) 프로젝트는 여러 하위 프로젝트(subproject)를 포함할 수 있으며, 각 하위 프로젝트도 별도의 Project 인스턴스로 관리됩니다.
    하위 프로젝트 간의 의존성, 설정의 상속 및 공유 등이 Project 객체를 통해 관리됩니다.

  • 플러그인과 확장(Extension) 기능
    플러그인을 적용하면, 해당 플러그인이 Project에 새로운 태스크, 설정, 도메인 객체 등을 추가합니다.
    Project는 플러그인에서 제공하는 확장(extension) 기능을 등록하고 사용할 수 있는 API를 제공합니다.

  • 빌드 라이프사이클 관리
    Project는 빌드의 설정(Configuration) 단계와 실행(Execution) 단계를 구분하여 관리합니다.
    설정 단계에서는 프로젝트의 태스크와 설정이 구성되고, 실행 단계에서는 실제 작업이 수행됩니다.

project의 경우, Gradle이 빌드를 시작할 때 자동으로 생성되며, 빌드 스크립트 실행의 기본 컨텍스트를 제공합니다. 별도의 선언 없이도 항상 존재하며 사용 가능합니다.

// build.gradle 파일 내에서의 Project 사용 예시
group = 'com.example'
version = '1.0.0'

task hello {
    group = 'Example'
    description = 'Prints a greeting'
    doLast {
        println 'Hello, Gradle!'
    }
}

Task

Task는 Gradle 빌드 내에서 수행되는 단일 작업(단위 작업)을 나타냅니다.

각 Task는 컴파일, 테스트, 배포, 클린 작업 등 빌드 프로세스의 한 부분을 담당하며, 프로젝트의 Task 컨테이너에 등록되어 관리됩니다.

주요 역할 및 특징
  • 실행 단위
    Task는 실제로 수행되는 작업의 단위를 나타냅니다. 예를 들어, 소스 코드 컴파일, 테스트 실행, 파일 복사 등이 Task로 구현됩니다.
    Task는 실행 시 여러 액션(Action)을 가질 수 있으며, 이 액션들은 doFirst { ... }나 doLast { ... } 블록을 통해 정의됩니다.

  • 의존성 관리
    Task 간의 의존성을 dependsOn을 통해 정의할 수 있습니다.
    이를 통해 특정 Task가 실행되기 전에 반드시 다른 Task가 먼저 실행되도록 순서를 지정할 수 있습니다.

  • 속성 설정 및 메타데이터
    각 Task는 고유의 이름, 설명(description), 그룹(group) 등의 메타데이터를 가집니다.
    이러한 속성들은 빌드 스크립트 내에서 Task를 식별하고, Gradle의 도움말이나 태스크 목록을 출력할 때 활용됩니다.

  • 라이프사이클과 지연 평가
    Gradle은 빌드 구성 시점과 실행 시점을 분리합니다. Task는 구성 단계에서 정의되고, 실제 실행은 실행 단계에서 수행됩니다.
    지연 평가(lazy evaluation) 방식 덕분에, 필요하지 않은 Task는 실행되지 않으며, 의존성 관계를 기반으로 실행 순서가 자동으로 결정됩니다.

  • 입출력 속성 관리
    Task는 입력(inputs)과 출력(outputs) 속성을 정의하여, Gradle이 작업의 최신성(up-to-date) 검사를 수행하고, 불필요한 작업을 생략할 수 있도록 돕습니다.
    이를 통해 빌드 시간 단축과 효율적인 증분 빌드(incremental build)가 가능해집니다.

// build.gradle 파일 내에서의 Task 사용 예시
task compileJava {
    group = 'Build'
    description = 'Compiles the Java source code'
    
    // 의존성 설정: 컴파일하기 전에 클린 작업을 먼저 수행하도록 지정
    dependsOn clean

    // 태스크 액션 정의
    doLast {
        println 'Compiling Java source code...'
        // 실제 컴파일 로직 (예: javac 호출 등)
    }
}
Task 내부 액션 실행 순서

Gradle Task에는 doFirst, doLast처럼 순서를 변경할 수 있는 액션이 있습니다.

쉽게 설명하면 액션 List가 있고, doFirst는 리스트 가장 앞으로 이동, doLast는 리스트 가장 마지막으로 이동해서 실행하는 방식입니다.

task exampleTask {
    doLast { println 'doLast 1' }
    doFirst { println 'doFirst 1' }
    doLast { println 'doLast 2' }
    doFirst { println 'doFirst 2' }
	println '기본 액션'
}

예를 들어 이 task를 실행하면 먼저 추가된 doFirst1이 있으나, 이후 doFirst2가 추가되었음으로 doFirst2 - doFirst1 순으로 정렬됩니다.

그리고 doLast1이 추가된 후, 그 뒤에 doLast2가 추가됐으므로 doLast1- doLast2로 정렬됩니다.

따라서 이 Task를 실행하면

doFirst2 - doFirst1 - 기본 액션 - doLast1 - doLast2

순으로 출력됩니다.

doFirst, doLast 외에도, dependsOn이나 finalizedBy처럼 액션 순서를 변경하는 액션들도 많은데 다음 시간에 정리해보도록 하겠습니다.

첫 프로젝트 세팅

우선 firstProject 라는 폴더를 만든 후, vscode로 열어줍니다.

그 후 gradle init 명령어를 통해 프로젝트를 세팅해줍니다.

그러면 총 4개의 선택지가 나옵니다.

  1. Application은 실행 가능한 애플리케이션을 개발할 때 사용합니다. main() 메소드가 포함된 예제 클래스를 제공하며 이를 통해 JAR 파일이나 배포 가능한 패키지를 생성할 수 있도록 해줍니다.

  2. Library는 재사용 가능한 라이브러리를 개발할 때 적합하며 다른 애플리케이션이나 라이브러리에서 사용할 공통 기능을 구현할 때 사용합니다.

  3. Gradle Plugin은 Gradle 빌드 프로세스를 확장하거나 사용자 정의 빌드 로직을 추가할 수 있는 Gradle 플러그인을 개발할 때 사용합니다.

  4. Basic은 특별한 템플릿 없이 최소한의 설정만 있는 기본 프로젝트 구조를 생성할 때 사용합니다. 프로젝트의 초기 구조를 직접 디자인하고 싶거나, 간단한 실험용 프로젝트를 만들 때 선택하면 좋습니다.

지금은 간단한 Gradle 프로젝트를 세팅해서 내부 구조를 살펴보는 용도기 때문에 Basic을 선택합니다.

그 후에는 Script 언어를 Gradle로 설정하고 나서 기본 설정으로 해준 후 build를 해줍니다.

기본 구조

우선 각각의 파일에 대해 살펴보도록 하겠습니다.

  1. build.gradle
    프로젝트의 주 빌드 스크립트입니다. 플러그인 적용, 의존성, 태스크(task) 정의 등 빌드 로직과 관련된 설정들이 포함됩니다.
    Task를 정의해서 프로젝트의 컴파일, 테스트, 패키징, 배포 등 빌드 과정을 구성합니다.

  2. gradle 디렉터리
    gradle 디렉터리 내부에는 libs.version.toml과 wrapper 파일들이 있는데 이는 여러 환경에서도 동일한 빌드 환경을 제공하기 위해서 만들어진 파일들 입니다. gradlew나 gradle.bat 스크립트로 실행하면 해당 폴더 내의 파일들로 빌드를 진행합니다.

  3. gradlew & gradlew.bat
    Gradle Wrapper를 실행하기 위한 쉘 스크립트 및 배치 파일입니다. 이 스크립트를 실행하면, 내부적으로 gradle-wrapper.jar를 호출하여 지정된 Gradle 버전을 다운로드 및 실행합니다.
    별도의 Gradle 설치 없이도 프로젝트 빌드가 가능하도록 해줍니다.

  4. settings.gradle
    Gradle의 설정 파일로, 프로젝트의 전반적인 구성과 구조를 정의합니다. 보통 루트 프로젝트의 이름을 지정하며, 멀티 프로젝트(하위 프로젝트)가 있을 경우 이들을 포함시키는 설정도 이 파일에서 관리합니다.

기본 Tasks

gradlew tasks --all 명령어를 입력하면 현재 gradle에 세팅되어 있는 task들을 볼 수 있습니다.

각각의 task 동작은 따로 정리하지 않겠습니다.

이제 build.gradle에서 task를 정의하여 여기에 저희만의 task를 만들어보겠습니다.

간단하게 hello world를 출력하는 hello task를 만들어보겠습니다.

코드는 매우 간단합니다. 이제 다시 gradlew tasks --all 명령어를 입력하여 제대로 추가가 됐는지 확인해봅니다.

hello task가 추가된 것을 볼 수 있고 실제로 gradlew hello 명령어를 실행해보겠습니다.

Hello, World!가 잘 찍히는걸 볼 수 있습니다 ^^


마무리

오늘은 gradle의 기본 클래스인 project와 task에 대해 알아봤으며 기본 gradle 프로젝트 세팅에 대해 정리해봤습니다.

다음 시간에는 Java project 세팅과, 멀티 모듈 세팅, 이렇게 해서 두번 정도의 포스팅을 더 가지면서 gradle 학습을 마무리할 계획입니다.

읽어주셔서 감사합니다.

profile
to be data engineer

0개의 댓글

관련 채용 정보