2025-02-22T01:13:24

This commit is contained in:
2025-02-22 01:13:24 +09:00
parent 1fb14102bb
commit fb0a05d18f
83 changed files with 4955 additions and 23 deletions

131
doc/10_빌드 최적화.md Normal file
View File

@@ -0,0 +1,131 @@
# 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` 폴더에서 상세한 분석 결과를 확인할 수 있다.