## 자바 개발자의 눈으로 build.gradle을 쉽게 읽는법
## 1. `build.gradle`의 정체: 위임(Delegation)의 미학
가장 먼저 이해해야 할 것은 **모든 블록 뒤에는 자바 객체가 숨어 있다**는 점입니다.
- **`plugins { ... }`**: Gradle에게 어떤 라이브러리/기능을 가져올지 말합니다.
- **`dependencies { ... }`**: `DependencyHandler`라는 객체의 메서드를 호출하는 것입니다.
- **`asciidoctor { ... }`**: `AsciidoctorTask`라는 클래스의 인스턴스(객체) 설정을 변경하는 것입니다.
**Groovy의 마법:** Groovy는 괄호를 생략할 수 있습니다.
- `implementation 'org.xxx'`는 사실 `project.dependencies.implementation('org.xxx')`라는 메서드 호출입니다.
---
## 2. 블록(Block)을 읽는 법: "누구의 속성인가?"
블록은 보통 **"이 객체의 필드 값을 수정하겠다"**는 선언입니다.
Gradle
`asciidoctor { // 1. AsciidoctorTask 객체를 찾아가서
sourceDir = file('src/...') // 2. 그 객체의 sourceDir 필드에 값을 넣고
dependsOn test // 3. dependsOn() 메서드를 호출해라
}`
아까 성공하셨던 **`asciidoctorj { version = '3.0.0' }`**를 예로 들어볼까요?
- `asciidoctorj`는 플러그인이 제공하는 **Extension(확장 설정)** 객체입니다.
- 이 블록을 밖에 쓰면 **전역 설정 객체**를 건드리는 것이고, 태스크 안에 쓰면 **그 태스크 전용 설정**을 건드리는 것입니다.
---
## 3. 설정 단계(Lifecycle): Gradle은 어떻게 움직이는가?
Gradle 빌드는 크게 3단계로 진행됩니다. 이걸 알면 왜 아까 "밖에 선언하니 되었다"가 이해됩니다.
1. **Initialization (초기화)**: 어떤 프로젝트들이 있는지 파악합니다.
2. **Configuration (구성)**: **사용자가 작성한 `build.gradle` 코드를 위에서 아래로 쭉 실행합니다.** * 이때 모든 객체(Task, Extension)의 세팅값이 결정됩니다.
- **중요:** 아까 `asciidoctorj`를 밖에 썼을 때 성공한 이유는, 이 '구성' 단계에서 전역 엔진 버전이 확실히 고정된 후 태스크가 만들어졌기 때문입니다.
3. **Execution (실행)**: 실제로 `./gradlew test` 같은 명령어를 수행합니다.
---
## 4. Groovy 문법 꿀팁 (Java 개발자용)
`build.gradle`을 읽을 때 헷갈리는 3가지 문법입니다.
| **Groovy 표현** | **실제 의미 (Java 식)** | **비고** |
| --- | --- | --- |
| `id 'java'` | `id("java")` | 메서드 호출 (괄호 생략 가능) |
| `version = '1.0'` | `setVersion("1.0")` | 속성(Property) 설정 |
| `test { ... }` | `test(new Closure() { ... })` | 메서드에 설정 코드 블록(Closure) 전달 |
---
## 💡 앞으로 `build.gradle`을 볼 때의 마음가짐
1. **공식 문서를 볼 때 "Task"인지 "Extension"인지 확인하세요.**
- **Task:** `asciidoctor`, `test`처럼 실제 일을 하는 놈 (행위)
- **Extension:** `asciidoctorj`, `java`처럼 설정을 담는 놈 (설정)
2. **구글링한 코드가 안 먹힐 때는 스코프(Scope)를 의심하세요.** * 오늘 배운 것처럼 블록 안에 넣느냐 밖에 넣느냐에 따라 적용 시점이 달라집니다.
3. **`./gradlew help --task [태스크명]`** 명령어를 활용해 보세요. 그 태스크가 어떤 옵션을 가지고 있는지 보여줍니다.
댓글
댓글 쓰기