본문 바로가기
Language/Kotlin

그래들 설정 settings.gradle.kts에 대해

by 시니성 2023. 9. 13.

settings.gradle.kts 파일은 Gradle 프로젝트의 구조와 설정을 담당하는 핵심적인 파일입니다. Kotlin 기반의 Gradle 설정인 Kotlin DSL에서는 이 파일이 매우 중요하죠. 각각의 주요 키워드에 대한 설명과 가상 시나리오를 통한 예시 코드를 함께 살펴보겠습니다.


🌟 주요 키워드 설명

  1. providers: Gradle에서 제공하는 기능 중 하나로, 설정 값이나 환경 변수, 시스템 속성 등을 안전하게 읽어 올 수 있게 해줍니다.
  2. rootProject: 최상위 프로젝트를 나타내는 객체입니다. 이를 통해 최상위 프로젝트의 이름, 설명 등의 속성을 설정할 수 있습니다.
  3. include: 하위 프로젝트들을 최상위 프로젝트에 포함시키는 함수입니다.
  4. pluginManagement: 프로젝트에 사용되는 플러그인의 버전, 저장소 등을 관리하는 블록입니다.
  5. resolutionStrategy: 플러그인이나 의존성의 버전 해상도 전략을 정의하는 블록입니다.
  6. eachPlugin: 각 플러그인에 대한 설정을 정의하는 블록입니다.
  7. requested: eachPlugin 내에서 현재 요청된 플러그인의 정보에 접근하는 객체입니다.

🌍 가상 시나리오: 회사 내부 라이브러리 관리 시스템 구축

다음은 settings.gradle.kts를 활용하여 회사 내부에서 사용하는 여러 라이브러리 프로젝트를 관리하려는 가상 시나리오를 가정한 예시 코드입니다.

// providers를 통해 gradle.properties 값들을 안전하게 가져오는 함수
fun gradleProperty(key: String): String = providers.gradleProperty(key).get()

// 최상위 프로젝트의 이름을 설정합니다.
rootProject.name = gradleProperty("rootProject.name")

// 'utils', 'networking', 'ui' 세 개의 라이브러리 프로젝트를 포함시킵니다.
include("utils", "networking", "ui")

// 플러그인 관리 블록
pluginManagement {
    // 플러그인의 버전 해상도 전략을 설정합니다.
    resolutionStrategy {
        // 각 플러그인에 대한 버전을 관리합니다.
        eachPlugin {
            // Spring Boot 플러그인에 대한 설정 예시
            if (requested.id.id == "org.springframework.boot" && requested.version == null) {
                // 버전이 지정되지 않았다면, 기본 버전을 사용합니다.
                useVersion("2.7.6")
            }
        }
    }

    // 플러그인 저장소를 설정합니다.
    // 여기서는 Gradle 플러그인 포털과 Maven 중앙 저장소를 사용합니다.
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

🔍 코드 분석:

  • providers를 활용하여 gradleProperty 함수를 정의하였습니다. 이 함수는 gradle.properties 파일의 값을 안전하게 가져옵니다.
  • rootProject를 이용해 최상위 프로젝트의 이름을 설정합니다.
  • include 함수를 사용하여 세 개의 하위 프로젝트를 포함시켰습니다.
  • pluginManagement 및 내부의 resolutionStrategyeachPlugin을 활용하여 플러그인의 버전 해상도 전략을 설정합니다.
  • requested를 이용하여 요청된 플러그인의 정보에 접근하였습니다.

기술적인 내용을 최대한 쉽게 풀어서 설명하려 노력했습니다. Gradle의 Kotlin DSL은 매우 강력하면서도 유연합니다. 이를 통해 복잡한 프로젝트 구조와 플러그인 관리를 쉽게 핸들링할 수 있습니다.


resolutionStrategy는 Gradle에서 의존성의 버전 해결 전략을 정의하는 방법입니다. 의존성의 버전 해결은 프로젝트에서 사용하는 여러 라이브러리나 플러그인의 버전을 결정하는 과정을 의미합니다. 프로젝트에는 여러 버전의 동일한 라이브러리가 존재할 수 있기 때문에, 이런 충돌이나 불일치 문제를 해결하기 위해 사용되는 것이 바로 해상도 전략(resolution strategy)입니다.


🌟 resolutionStrategy의 주요 기능

  1. Forcing Versions: 특정 의존성의 버전을 강제로 설정할 수 있습니다. 예를 들어, 프로젝트에서 여러 버전의 동일한 라이브러리가 존재할 경우, 원하는 버전으로 강제 설정하여 충돌 문제를 해결할 수 있습니다.
  2. resolutionStrategy { force("com.some.library:library-name:1.0.1") }
  3. Fail on Version Conflict: 버전 충돌이 발생할 경우 빌드를 실패하게 만들 수 있습니다. 이렇게 하면 버전 충돌 문제를 바로 인식하고 대응할 수 있습니다.
  4. resolutionStrategy { failOnVersionConflict() }
  5. Dependency Substitution: 하나의 의존성을 다른 것으로 대체할 수 있습니다. 예를 들어, 개발 중인 로컬 버전의 라이브러리로 의존성을 대체하고 싶을 때 유용합니다.
  6. resolutionStrategy { dependencySubstitution { substitute(module("com.some.library:old-library")) .with(module("com.some.library:new-library:1.0.1")) } }
  7. Component Selection Rules: 의존성의 선택 규칙을 추가할 수 있습니다. 예를 들어, 베타 버전보다 안정 버전을 선호하는 규칙을 추가할 수 있습니다.
  8. resolutionStrategy { componentSelection { all { if (candidate.version.endsWith("-beta")) { reject("We don't use beta libraries") } } } }

해상도 전략은 프로젝트의 의존성 관리에 있어 중요한 역할을 합니다. 특히, 대규모 프로젝트나 여러 라이브러리와 플러그인을 사용하는 프로젝트에서는 이 전략 없이는 버전 관리가 어려울 수 있습니다. 따라서, 적절한 해상도 전략을 설정하여 프로젝트의 안정성을 높이는 것이 중요합니다.