SW/Gradle

Gradle : Task 객체와 메소드 : 개념, 예제, 설명, 개요, 방법

얇은생각 2025. 1. 19. 07:30
반응형

Gradle은 특히 Java 프로젝트에서 빌드를 자동화하는 데 정말 강력하고 유용한 도구입니다. 하지만 Gradle의 진짜 힘을 제대로 발휘하려면, Task 객체와 그들 간의 관계를 이해하는 게 정말 중요하죠. 이 글에서는 Gradle의 Task 속성과 메소드, 그리고 이들이 어떻게 서로 연결되는지를 간단하게 설명해 볼게요. 이 내용은 Gradle을 처음 접하신 분들이나, 어느 정도 써봤지만 조금 더 깊이 알고 싶은 분들 모두에게 도움이 될 거라고 생각해요.

 

Gradle : Task 객체와 메소드 : 개념, 예제, 설명, 개요, 방법

 

Gradle Task 객체와 메소드 살펴보기

Gradle을 잘 활용하려면 Task 객체가 뭔지부터 잘 알아야 해요. Task 객체는 빌드 과정의 가장 작은 단위라고 할 수 있어요. Gradle이 실제로 어떤 작업을 수행할 때, 바로 이 Task 단위를 통해 작업을 진행하거든요. Task의 모든 기능에 대해 알고 싶다면 Gradle 공식 문서를 참고하는 게 좋아요. 문서를 보면 Task에서 쓸 수 있는 다양한 속성들과 메소드들이 잘 정리되어 있어요.

 

Task 속성 접근하기: Gradle Task 안에서는 변수를 자유롭게 정의할 수 있어요. 예를 들면:

// 변수를 포함한 간단한 Task 정의
task exampleTask {
    def abc = "123"
    println abc
}

 

위 예제에서는 abc라는 변수를 정의했죠. 이 변수는 Task 내에서 언제든 사용할 수 있어요. 그런데 만약 프로젝트 레벨에서 같은 이름의 변수가 있다면 좀 헷갈릴 수 있잖아요? 그럴 때는 project를 명시적으로 사용해주면 돼요.

task exampleTask {
    def abc = "localABC"
    println project.name // 프로젝트 레벨 속성을 명시적으로 참조
}

 

이렇게 하면 헷갈리지 않고 정확하게 우리가 원하는 속성이나 변수를 사용할 수 있어요.

 

Task 간의 관계 설정하기

Gradle은 그냥 독립적인 Task를 만드는 데서 그치지 않아요. 여러 Task들이 서로 의존 관계를 갖기도 하는데, 이 관계를 잘 정의해 두면 빌드 과정을 훨씬 간편하게 만들 수 있어요. 예를 들어 Java 프로젝트에서 gradle jar 명령을 사용하면, 컴파일과 테스트 같은 다른 Task에 자동으로 의존하게 돼요. 하지만 때로는 사용자가 직접 이런 의존성을 맞춤형으로 설정해야 할 때도 있죠.

먼저 deployToStage라는 Task를 만들어볼게요:

task deployToStage {
    doLast {
        println "Deploying to staging..."
    }
}

여기서 doLast 블록에 코드를 넣었죠? 이건 해당 코드가 빌드 단계에서만 실행되도록 보장해줘요. 배포 관련 Task를 정의할 때 이 부분이 특히 중요하답니다.

 

dependsOn으로 Task 의존성 설정하기

Task들 간의 순서를 맞춰야 할 때가 많아요. 예를 들어, deployToProd라는 Task가 있는데, 이 Task를 실행하기 전에 반드시 스테이징 배포가 먼저 이루어지길 원한다고 해볼게요:

task deployToProd {
    doLast {
        println "Deploying to production..."
    }
}

// 의존성 설정
deployToProd.dependsOn deployToStage

이렇게 하면 deployToProd는 항상 deployToStage 이후에 실행돼요. 스테이징 배포가 완료된 후에만 프로덕션 배포가 진행되도록 해서 중요한 단계를 빼먹는 일이 없게 해주는 거죠.

 

finalizedBy로 후속 작업 설정하기

Task가 끝난 다음에 정리 작업을 하고 싶을 때가 있잖아요? 그럴 때 finalizedBy를 사용하면 좋아요. 예를 들어:

task cleanUpFiles {
    doLast {
        println "Cleaning up files..."
    }
}

deployToProd.finalizedBy cleanUpFiles

이렇게 설정하면 deployToProd가 실행된 후에 자동으로 cleanUpFiles가 실행돼요. 빌드 환경을 깔끔하게 유지하는 데 아주 유용하죠, 특히 임시 파일이나 캐시 파일들을 정리할 때요.

 

실전 예시: 기본 Task 설정하기

기본적으로 Gradle을 특정 Task 없이 실행하면, 모든 사용 가능한 Task를 나열해줘요. 하지만 특정 Task를 기본으로 실행하고 싶을 때는 default tasks를 지정할 수 있어요.

defaultTasks 'deployToStage'

이제 gradle 명령을 그냥 실행하면, Gradle은 자동으로 deployToStage를 빌드 단계에서 실행하게 돼요. 이렇게 하면 팀원들이 동일한 작업을 쉽게 수행할 수 있어서, 실수를 줄이는 데도 도움이 돼요.

 

설정 단계와 빌드 단계의 차이점

Gradle 빌드는 설정 단계빌드 단계라는 두 가지 주요 단계를 거쳐요. Task 안에 있는 코드가 언제 실행되는지를 잘 이해하는 게 중요해요. Task 내에 직접 작성된 코드는 설정 단계에서 실행되기 때문에, 빌드 단계에서 실행하려면 doLastdoFirst 같은 메소드를 사용해야 해요.

예를 들어:

task configureExample {
    println "Running during configuration phase"

    doLast {
        println "Running during build phase"
    }
}

이 스크립트에서는 println 문이 설정 단계에서 바로 실행되고, doLast 안의 코드는 빌드 단계에서 실행돼요. 이런 차이를 이해하고 작업하는 게 중요하답니다.

 

경험: 흔한 함정과 모범 사례

처음 Gradle을 사용할 때, 언제 코드가 실행되는지를 이해하는 게 정말 헷갈렸어요. 설정 단계에서 배포 메시지가 출력되는 걸 보고 혼란스럽기도 했죠. Gradle의 생명 주기를 제대로 이해한 뒤에야 doLastdoFirst에 실행 코드를 넣기 시작했어요. 그랬더니 빌드가 훨씬 더 안정적이 되더라고요.

그리고 또 하나 흔한 실수가, 여러 Task 간의 의존성을 설정할 때 dependsOn을 깜빡하는 거예요. 이걸 잊으면 빌드가 순서가 맞지 않게 실행되거나, 아예 중요한 Task가 누락되기도 하거든요. 저는 항상 Task를 모듈화해서 작성하고, 필요한 의존성을 명시적으로 설정하는 습관을 들였어요. 이렇게 하면 스크립트가 더 읽기 쉬워지고, 새로운 팀원이 들어와도 유지 관리하기가 쉬워요.

 

마무리하며

Gradle은 Task를 정의하고 관리하는 데 있어서 정말 강력한 도구예요. Task의 속성을 잘 활용하고, dependsOnfinalizedBy 같은 메소드를 적절히 사용하면서 doLast로 실행 시점을 잘 컨트롤하면, 신뢰성 있고 효율적인 워크플로우를 구축할 수 있어요. 여러 환경에서 복잡한 빌드 프로세스를 다뤄야 한다면, Gradle의 이러한 기능들을 마스터하는 게 큰 도움이 될 거예요.

Gradle의 모든 기능을 최대한 활용하려면 계속해서 Task 객체와 메소드, 그리고 관계 설정 방법들을 탐구해보세요. 공식 문서를 자주 참고하고, 다양한 실험도 해보세요. 연습할수록 이런 개념들이 더 직관적으로 다가올 것입니다.

반응형