2025-02-22T01:13:24
This commit is contained in:
167
doc/04_의존성 관리.md
Normal file
167
doc/04_의존성 관리.md
Normal 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`으로 추가한 라이브러리는 현재 모듈에서만 사용 가능하며, 빌드 성능이 향상된다.
|
||||
|
||||
Reference in New Issue
Block a user