
개발자로 일 하면서 Gradle을 익숙하게 쓰고는 있지만(주로 의존성 관리만 ㅎㅎ..), 잘 알지는 못하고 쓴다는 생각이 들었다. 말 그대로 가깝고도 먼 사이.. 요즘들어서는 AI와 같이 일하면서, 자꾸 거짓말에 당하다보니.. 내가 아는게 중요하다는 생각이 들기도 해서. 정리해본다.
아무튼! 시작해보자.
개발환경
아래와 같은 환경에서 학습하고있다.
OS : Intel Mac
Java : JDK 21
Gradle : 8.13 (Kotlin DSL)
IDE : Intellij Ultimate, Windsurf
ChatGPT : PLUS
GitHub : https://github.com/koojeongwoon/learn-gradle.git
Gradle이 뭐야?
개발을 하다보면, 작성한 소스 코드를 '컴파일'하고, 테스트를 수행하거나, 라이브러리를 연결하고, 실행 가능한 형태로 만드를 일련의 작업들을 반복하게 된다. 이 과정을 '빌드'라고 부른다.
Gradle은 대표적인 빌드 자동화 도구다.
Java, Kotlin, Android 등 다양한 언어와 플랫폼에서 사용할 수 있으며, 안드로이드 스튜디오에서도 기본으로 사용하는 도구다.
간단히 말해서, 복잡한 일들을 간단한 명령어로 처리해 주는 좋은 친구다.
그래서 Gradle은 왜 쓰는데?
여러가지 이유가 있겠지만, 크게는 아래와 같다.
1. 자동화
Gradle은 "선언형 빌드 도구"라고 하는데, 이건 쉽게 말해서 미리 정해진 대로 동작한다. 라고 이해하는게 편하다.
만약 build.gradle.kts에 아래와 같이 써있다고 가정하자.
plugins {
id("java")
}
그러면 Gradle은 아래 표와 같이 자동으로 '미리 정해진' Task들을 만들어준다. (build, documentation, verification)
![]() |
![]() |
| 자바 플러그인 적용 전 | 자바 플러그인 적용 후 |
Gradle은 java 플러그인이 어떤 Task를 수행할지 정해놨기 때문이다.
사용자들은
./gradlew build
명령어를 실행하는것 만으로, Gradle이 미리 정의해둔 Task들을 자동으로 사용할 수 있다.
참고 : gradle? gradlew? 차이가 뭐죠??
- gradle : 만약 Gradle을 직접 설치해서 사용하고있고, 시스템에 설치된 Gradle을 실행시키려 한다면 gradle 명령어 사용.
- gradlew : 일반적인 프로젝트 환경에서 사용함. gradle wrapper라는 의미. gradle/wrapper 디렉토리의 설정에 따라 어떤 버전의 그레이들을 실행할지 결정하는 실행명령어 라고 이해.
2. 유연성
앞서서 Gradle이 "선언형 빌드 도구"이고, 미리 정해진 대로 동작한다면서.. 유연하다는게 좀 이상하게 들릴지 모르겠다. 내가 느끼기에 Gradle은 "느슨하게" 선언되어있기 때문에 유연하다고 말할수 있다.
java플러그인을 쓴다고 해서 특정 JDK버전에 종속되지 않는다. 또한, 미리 정의된 Task를 필요한 시점에 변경하거나, 새로운 Task를 추가하고, Task간 연결을 설정하는 일이 간편하다.
plugins {
id("java")
}
// JDK 버전을 사용자가 직접 명시할 수 있음.
// JDK 버전을 바꾼다고, 빌드 스크립트를 따로 수정하지 않음.
// java plugin 필수!
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
// languageVersion.set(JavaLanguageVersion.of(21))
}
}
group = "org.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
}
// jar task 커스텀
// java plugin 필수!
tasks.named<Jar>("jar") {
archiveBaseName.set("my-app") // 생성되는 JAR 파일 이름이 my-app-<version>.jar로 바뀜
from("extra-resources/") // extra-resources/ 디렉토리 내용이 JAR 안에 함께 패키징됨
// project/ -> my-app-1.0.0.jar
// ├── build.gradle.kts -> ├── META-INF/
// └── extra-resources/ -> ├── com/...
// ├── config.yml -> ├── config.yml
// └── README.txt -> └── README.txt
// 추후 연구 destinationDirectory, archiveClassifier, archiveVersion
}
// test task 커스텀
// java plugin 필수!
tasks.named<Test>("test") {
useJUnitPlatform()
testLogging {
events("passed", "skipped", "failed") // 테스트 로그 이벤트 지정
showStandardStreams = true
}
// 커스텀 설정 예시: 특정 테스트만 실행
// filter {
// includeTestsMatching("com.example.*")
// }
}
// 존재하지 않는 Task를 A라는 이름만으로 등록
// 별도의 커스텀 task 필요X, doLast, doFirst 동작 추가
tasks.register("A") {
dependsOn("B") // A는 B가 실행된 이후에 실행한다.
doLast {
println("A 실행")
}
}
// 존재하지 않는 Task를 hello라는 이름으로, 타입을 명시(MyCustomTask)해서, 등록
// 커스텀 task 클래스 필요함.
// 구체적인 방법은 나중에 추가..
// 그냥 등록만 하는것뿐, 실행되지 않음.
// 실행하려면 ./gradlew hello 또는 dependOn 설정 필요.
tasks.register<MyCustomTask>("hello") {
group = "custom"
description = "buildSrc에 정의된 인사 태스크"
}
3. 빠른 빌드
Gradle은 빌드 성능 최적화를 위해서 여러가지 기능을 제공한다.
1) 증분 빌드 (Incremental Build)
2) 빌드 캐시 (Build Cache)
3) 설정 지연 평가 (Configuration on Demand)
4) 병렬 실행 (Parallel Execution)
5) 빌드 데몬 (Daemon)
6) 컴파일 회피 (Compile Avoidance)
참고!
성능 최적화 가이드 : https://docs.gradle.org/current/userguide/performance.html
4. 의존성 관리
사실 빌드툴을 사용하는 대표적인 이유가 아닐까 싶다.
외부 라이브러리 쉽게 추가하고, 버전을 관리할 수 있게 해준다.
// ... 생략
dependencies {
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation("com.fasterxml.jackson.core:jackson-databind:2.19.0")
}
// ... 생략
위 처럼 작성하면, 아래 이미지 처럼 jackson 라이브러리가 추가된다.

외부 환경과 단절된 환경에서 개발할때는, 필요한 라이브러리들을 모두 프로젝트에 직접 넣었던 기억도 있다. Gradle은 그에 비하면 정말 편하게 개발할수 있도록 도와준다.
결론적으로
Gradle은 많은 작업을 미리 설정된 방식으로 자동화해줄 뿐만 아니라, 유연하게 설정도 가능하며, 빌드 성능 최적화를 위한 여러가지 기능을 제공해주며, 의존성 관리를 쉽게 해주는 빌드 툴이다.
다음으로는 Gradle의 페이즈와 실행순서에 대해서 알아보자.
'Gradle' 카테고리의 다른 글
| [Gradle] 설정 파일 구조 완전 정복! (4) | 2025.07.15 |
|---|---|
| [Gradle] Phase (1) | 2025.07.10 |
| [Gradle] Gradle Task, 왜 이렇게 많고 헷갈리는 거야? (1) | 2025.07.09 |
| [Gradle] groovy가 좋은거예요? kotlin이 좋은거예요? (0) | 2025.06.09 |
| [Gradle] 프로젝트가 어떻게 생겼을까? (2) | 2025.06.09 |

