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

114
doc/01_Gradle.md Normal file
View File

@@ -0,0 +1,114 @@
# Gradle: 강력한 빌드 자동화 도구
소프트웨어 개발에서 빌드는 단순히 코드를 컴파일하는 것을 넘어, 의존성 관리, 테스트 실행, 배포 등의 여러 단계를 포함하는 중요한 과정이다. 이 모든 과정을 수동으로 수행하는 것은 비효율적이며, 실수를 유발할 가능성이 크다. 이를 해결하기 위해 등장한 것이 **빌드 도구(build tool)**다.
## 빌드 도구란?
빌드 도구는 소스 코드에서 실행 가능한 소프트웨어를 생성하는 과정(컴파일, 테스트, 패키징, 배포 등)을 자동화하는 도구다. 빌드 도구가 없다면 개발자는 코드를 수정할 때마다 수작업으로 컴파일하고, 필요한 라이브러리를 수동으로 추가하고, 여러 명이 협업하는 프로젝트에서는 의존성 충돌을 해결하는 데 많은 시간을 소비해야 한다.
대표적인 빌드 도구의 역할은 다음과 같다.
- 소스 코드 컴파일 및 패키징
- 라이브러리 의존성 관리
- 테스트 자동화
- 배포 및 CI/CD 연동
- 멀티 모듈 프로젝트 관리
이제 Gradle이 등장하기 전의 주요 빌드 도구들을 살펴보자.
## 빌드 도구의 발전과 Gradle의 등장
### Make → Ant → Maven → Gradle
1. Make (1977)
- 초기 빌드 도구로, 주로 C/C++ 프로젝트에서 사용됨.
- `Makefile`을 기반으로 동작하며, 파일 간의 종속성을 정의하여 빌드를 수행.
- 플랫폼 의존적이며 XML과 같은 구조적 설정이 부족.
2. Apache Ant (2000)
- Java 생태계에서 등장한 XML 기반 빌드 도구.
- Make보다 강력한 기능을 제공하지만, XML 설정이 장황하고 유지보수성이 떨어짐.
- 의존성 관리 기능이 부족하여, 추가 도구(Ivy 등)를 사용해야 함.
3. Apache Maven (2004)
- Ant의 단점을 보완하기 위해 XML 기반으로 등장.
- 프로젝트 관리 모델(POM, Project Object Model)을 도입하여 의존성 관리 기능 강화.
- 표준화된 프로젝트 구조와 라이프사이클을 제공하지만, 유연성이 부족하고 XML 설정이 여전히 복잡함.
4. Gradle (2009)
- Maven의 단점을 해결하고, 유연성과 성능을 극대화한 빌드 도구로 등장.
- Groovy 기반의 DSL(Domain Specific Language)로 설정을 간결하게 작성할 수 있음.
- 이후 Kotlin DSL 지원이 추가되면서, 더욱 강력한 기능을 제공.
## Gradle의 특징
Gradle은 현대적인 빌드 도구로서 다음과 같은 강력한 기능을 제공한다.
### 유연한 DSL
Gradle은 Groovy와 Kotlin 기반의 DSL을 제공하여 직관적이고 간결한 설정이 가능하다. 특히, Kotlin DSL은 정적 타입 체크와 코드 자동 완성 기능을 지원하여 개발자의 생산성을 높인다.
```kotlin
plugins {
kotlin("jvm") version "1.8.0"
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
```
### 고성능 빌드
Gradle은 다음과 같은 기술을 활용하여 빌드 속도를 최적화한다.
- **태스크 캐싱(Task Caching):** 이전 빌드 결과를 재사용하여 불필요한 작업을 줄임.
- **병렬 빌드(Parallel Execution):** 멀티코어를 활용하여 여러 태스크를 동시에 실행.
- **증분 빌드(Incremental Build):** 변경된 파일만 다시 빌드하여 시간을 절약.
### 강력한 의존성 관리
Gradle은 Maven Central, JCenter, JitPack 등 다양한 저장소에서 의존성을 쉽게 가져올 수 있으며, 의존성 충돌을 자동으로 해결하는 기능도 제공한다.
### 멀티 모듈 프로젝트 지원
대규모 프로젝트에서 여러 개의 서브 프로젝트를 관리할 수 있도록 멀티 모듈 빌드를 지원한다.
### 플러그인 기반 확장성
Gradle은 공식 및 커스텀 플러그인을 활용하여 빌드 프로세스를 확장할 수 있다. 예를 들어, Spring Boot 플러그인을 적용하면 Spring Boot 애플리케이션을 쉽게 패키징할 수 있다.
## Gradle vs Maven vs Ant
| 기능 | Gradle | Maven | Ant |
|------|--------|--------|------|
| 설정 방식 | Groovy/Kotlin DSL | XML | XML |
| 성능 | 빠름 (증분 빌드, 캐싱) | 느림 | 느림 |
| 의존성 관리 | 지원 | 지원 | 별도 도구 필요 (Ivy) |
| 빌드 스크립트 가독성 | 간결함 | 장황함 | 장황함 |
| 확장성 | 매우 높음 | 제한적 | 제한적 |
| 표준화 | 유연함 | 표준적 | 유연하지만 복잡 |
Gradle은 성능과 확장성 면에서 Maven과 Ant보다 우수하며, 특히 Kotlin DSL을 활용하면 코드 자동 완성과 타입 안정성을 누릴 수 있다.
## Gradle 설치 및 환경 설정
### Gradle 설치
1. Gradle 다운로드
- 공식 사이트([gradle.org](https://gradle.org/releases/))에서 최신 버전을 다운로드한다.
2. 압축 해제 및 환경 변수 설정
- 압축을 원하는 디렉터리에 해제하고, `GRADLE_HOME` 환경 변수를 설정한 후 `PATH`에 추가한다.
**Linux/macOS (bash/zsh)**
```sh
export GRADLE_HOME=/opt/gradle
export PATH=$GRADLE_HOME/bin:$PATH
```
**Windows (PowerShell)**
```powershell
[System.Environment]::SetEnvironmentVariable("GRADLE_HOME", "C:\Gradle", "User")
[System.Environment]::SetEnvironmentVariable("Path", "$env:Path;C:\Gradle\bin", "User")
```
3. 설치 확인
```sh
gradle -v
```