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

167
doc/04_의존성 관리.md Normal file
View File

@@ -0,0 +1,167 @@
# 의존성 관리
의존성이란, 프로젝트가 실행되거나 빌드될 때 필요한 외부 라이브러리를 의미한다. Gradle에서는 `dependencies` 블록을 통해 프로젝트에서 사용할 라이브러리를 선언한다.
Gradle은 중앙 저장소(Maven Central, JCenter 등)나 로컬 저장소를 활용하여 필요한 라이브러리를 다운로드하고 프로젝트에 추가할 수 있다.
## `dependencies` 블록 사용법
Gradle에서는 `dependencies` 블록을 사용하여 필요한 라이브러리를 정의할 수 있다.
### 기본적인 의존성 추가
```
group:name:version
```
아래는 Kotlin DSL을 사용하여 `build.gradle.kts`에서 의존성을 추가하는 예제이다.
```kotlin
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.8.0") // Kotlin 표준 라이브러리 추가
testImplementation("org.junit.jupiter:junit-jupiter:5.9.0") // JUnit 테스트 라이브러리 추가
}
```
위 코드는 다음과 같은 역할을 한다.
- `implementation`: 실행과 컴파일 과정에서 필요한 라이브러리 추가
- `testImplementation`: 테스트 코드에서만 필요한 라이브러리 추가
## 버전 관리 방법
### `gradle.properties` 파일을 활용한 버전 관리
의존성 버전을 `gradle.properties` 파일에서 정의하여 프로젝트 전반에서 일관되게 관리할 수 있다.
`gradle.properties` 파일:
```properties
kotlinVersion=1.8.0
junitVersion=5.9.0
```
`build.gradle.kts`에서 참조:
```kotlin
val kotlinVersion: String by project
val junitVersion: String by project
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion")
testImplementation("org.junit.jupiter:junit-jupiter:$junitVersion")
}
```
### `versions.gradle.kts` 파일을 활용한 버전 관리
여러 개의 의존성 버전을 중앙에서 관리하려면 `versions.gradle.kts` 파일을 만들고 버전을 정의할 수도 있다.
`gradle/versions.gradle.kts` 파일:
```kotlin
extra["kotlinVersion"] = "1.8.0"
extra["junitVersion"] = "5.9.0"
```
`build.gradle.kts`에서 참조:
```kotlin
val kotlinVersion: String by extra
val junitVersion: String by extra
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion")
testImplementation("org.junit.jupiter:junit-jupiter:$junitVersion")
}
```
### `libs.versions.toml` 파일을 활용한 버전 관리
...
## 원격 및 로컬 저장소 설정
Gradle은 원격 저장소(Maven Central, JCenter, Google Maven 등)와 로컬 저장소를 지원한다.
### 원격 저장소 사용
`repositories` 블록에서 사용할 저장소를 설정할 수 있다.
```kotlin
repositories {
mavenCentral() // Maven Central 저장소 사용
google() // Google Maven 저장소 사용 (Android 개발 시 유용)
}
```
### 로컬 저장소 사용
프로젝트 내부에서 관리하는 라이브러리를 직접 추가할 수도 있다.
```kotlin
repositories {
mavenLocal() // 로컬 Maven 저장소 사용
}
```
또는 특정 디렉터리를 로컬 저장소로 지정할 수도 있다.
```kotlin
repositories {
flatDir {
dirs("libs")
}
}
```
이렇게 설정한 후, `libs` 폴더에 저장된 JAR 파일을 의존성으로 추가할 수 있다.
```kotlin
dependencies {
implementation(files("libs/my-library.jar"))
}
```
## 의존성의 분류
Gradle에서는 의존성을 프로젝트에서 어떻게 사용할지에 따라 여러 범주로 분류한다.
### 주요 의존성 유형
| 의존성 유형(Configuration) | 설명 | 적용 대상 | 전이적(Transitive) |
|-----------------|------------------------------------|------------------|------------------|
| `implementation` | 컴파일 시 접근 불가, 런타임에서만 사용 가능 | 애플리케이션 | O (기본) |
| `api` | 다른 모듈에서도 접근 가능 | 라이브러리 | O (기본) |
| `compileOnly` | 컴파일 시에만 필요, 런타임에는 포함되지 않음 | 애플리케이션 & 라이브러리 | X |
| `runtimeOnly` | 런타임에서만 필요, 컴파일 시에는 사용 불가 | 애플리케이션 & 라이브러리 | O |
| `testImplementation` | 테스트 코드에서만 사용 | 테스트 코드 | O |
| `testCompileOnly` | 테스트 코드에서만 컴파일 시 필요 | 테스트 코드 | X |
| `testRuntimeOnly` | 테스트 실행 시에만 필요 | 테스트 코드 | O |
| `annotationProcessor` | 컴파일 시 애노테이션 프로세서를 실행할 때 사용 | 애노테이션 기반 라이브러리 | X |
### 예제
```kotlin
dependencies {
implementation("com.squareup.retrofit2:retrofit:2.9.0") // Retrofit 라이브러리 추가
api("org.apache.commons:commons-lang3:3.12.0") // 다른 모듈에서도 사용 가능
compileOnly("javax.annotation:javax.annotation-api:1.3.2") // 컴파일 시에만 필요
runtimeOnly("org.postgresql:postgresql:42.3.1") // 실행할 때만 필요
testImplementation("org.junit.jupiter:junit-jupiter:5.9.0") // 테스트 코드에서만 필요
}
```
### `api` vs `implementation`
멀티 모듈 프로젝트에서 `api``implementation`의 차이를 이해하는 것이 중요하다.
```kotlin
dependencies {
api("com.example:shared-library:1.0.0") // 다른 모듈에서도 접근 가능
implementation("com.example:internal-library:1.0.0") // 현재 모듈에서만 사용 가능
}
```
- `api`로 추가한 라이브러리는 이 모듈을 의존하는 다른 모듈에서도 사용할 수 있다.
- `implementation`으로 추가한 라이브러리는 현재 모듈에서만 사용 가능하며, 빌드 성능이 향상된다.