132 lines
4.1 KiB
Markdown
132 lines
4.1 KiB
Markdown
# Gradle 빌드 최적화
|
|
|
|
Gradle은 강력한 빌드 도구이지만, 프로젝트가 커질수록 빌드 시간이 길어지는 문제가 발생할 수 있다. 이 글에서는 **Gradle 빌드 성능을 최적화하는 방법**을 소개한다.
|
|
|
|
Gradle 빌드는 여러 단계(초기화, 구성, 실행)를 거치며 실행된다. 빌드 속도를 개선하려면 다음 요소를 고려해야 한다.
|
|
- **불필요한 작업 제거**: 변경된 파일만 다시 빌드
|
|
- **병렬 실행 활용**: 멀티코어 CPU 활용
|
|
- **의존성 관리 최적화**: 캐시 사용 및 중복 제거
|
|
- **Gradle 자체 설정 최적화**: 빌드 캐시, 데몬, 워커 설정
|
|
|
|
|
|
## 불필요한 작업 방지 (`UP-TO-DATE`, `INCREMENTAL`, `CACHE`)
|
|
|
|
Gradle은 빌드를 최적화하기 위해 **변경된 파일만 다시 빌드**하는 기능을 제공한다.
|
|
|
|
### UP-TO-DATE 체크
|
|
Gradle은 이전 빌드와 비교하여 변경되지 않은 작업을 건너뛴다.
|
|
```sh
|
|
./gradlew build
|
|
```
|
|
출력 로그에서
|
|
```sh
|
|
Task :compileJava UP-TO-DATE
|
|
```
|
|
와 같은 메시지가 나오면, 해당 작업이 **이전과 동일하여 재실행되지 않았음**을 의미한다.
|
|
|
|
#### 수동으로 캐시 삭제 (강제 실행)
|
|
```sh
|
|
./gradlew clean build
|
|
```
|
|
이렇게 하면 모든 파일을 다시 빌드한다. 하지만, 매번 `clean`을 실행하는 것은 빌드 최적화에 도움이 되지 않는다.
|
|
|
|
|
|
### 증분 빌드 (Incremental Build)
|
|
특정 작업에서 변경된 파일만 처리하도록 `@InputFiles`, `@OutputFiles` 등을 활용할 수 있다.
|
|
|
|
```kotlin
|
|
tasks.register<Copy>("copyTask") {
|
|
from("src")
|
|
into("dest")
|
|
}
|
|
```
|
|
이렇게 설정하면, `src` 폴더의 파일이 변경되지 않으면 작업을 재실행하지 않는다.
|
|
|
|
|
|
### 빌드 캐시 활용
|
|
빌드 캐시는 이전 빌드 결과를 저장하여 다시 사용할 수 있도록 한다.
|
|
```sh
|
|
./gradlew build --build-cache
|
|
```
|
|
Gradle 설정 파일(`gradle.properties`)에 빌드 캐시를 활성화할 수도 있다.
|
|
```properties
|
|
org.gradle.caching=true
|
|
```
|
|
|
|
|
|
## 병렬 빌드 및 워커 설정
|
|
Gradle은 기본적으로 여러 작업을 병렬로 실행할 수 있다.
|
|
|
|
### 병렬 실행 활성화
|
|
멀티 프로젝트 빌드에서 병렬 실행을 활성화하면 속도가 크게 향상될 수 있다.
|
|
```sh
|
|
./gradlew build --parallel
|
|
```
|
|
또는 `gradle.properties`에서 설정할 수도 있다.
|
|
```properties
|
|
org.gradle.parallel=true
|
|
```
|
|
|
|
|
|
### Gradle 데몬 사용
|
|
Gradle 데몬(Daemon)은 빌드 속도를 높이는 데 중요한 역할을 한다.
|
|
```sh
|
|
./gradlew --daemon
|
|
```
|
|
또는 `gradle.properties`에서 설정 가능하다.
|
|
```properties
|
|
org.gradle.daemon=true
|
|
```
|
|
|
|
### 워커 수 증가
|
|
멀티코어 CPU를 활용하여 빌드 속도를 높일 수 있다.
|
|
```properties
|
|
org.gradle.workers.max=4
|
|
```
|
|
시스템 성능에 맞게 적절한 값을 설정하면 된다.
|
|
|
|
|
|
## 의존성 관리 최적화
|
|
|
|
### 불필요한 의존성 제거
|
|
불필요한 의존성이 많으면 빌드 속도가 느려진다.
|
|
`dependencies` 블록을 점검하여 불필요한 라이브러리를 제거한다.
|
|
|
|
```kotlin
|
|
dependencies {
|
|
implementation("com.example:unused-library:1.0.0") // 제거 필요
|
|
}
|
|
```
|
|
|
|
### `dependencyResolutionManagement` 설정
|
|
`settings.gradle.kts`에서 **의존성 해석을 최적화**할 수 있다.
|
|
```kotlin
|
|
dependencyResolutionManagement {
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
}
|
|
```
|
|
이렇게 하면 Gradle이 중복된 의존성을 다운로드하지 않는다.
|
|
|
|
|
|
### 로컬 캐시 활용
|
|
의존성을 매번 다운로드하지 않도록 로컬 캐시를 활용할 수 있다.
|
|
```sh
|
|
./gradlew build --offline
|
|
```
|
|
이렇게 하면 인터넷 없이 로컬에 있는 의존성만 사용한다.
|
|
|
|
|
|
## 실행 시간 분석 및 프로파일링
|
|
Gradle의 `--scan` 옵션을 사용하면 빌드 성능을 분석할 수 있다.
|
|
|
|
```sh
|
|
./gradlew build --scan
|
|
```
|
|
또한, `--profile` 옵션을 사용하면 빌드 시간 프로파일을 확인할 수 있다.
|
|
```sh
|
|
./gradlew build --profile
|
|
```
|
|
생성된 `build/reports/profile` 폴더에서 상세한 분석 결과를 확인할 수 있다.
|