반응형
Gradle 작동 원리: Groovy와 Kotlin을 통한 의존성 관리
📌 서론
Gradle에서 Groovy나 Kotlin을 사용해 의존성을 관리하는 방식을 이해하려면, 먼저 Gradle이 어떻게 작동하는지, 그리고 이들 언어가 Java와 어떻게 상호작용하는지를 알아야 한다.
1. Gradle의 작동 원리
1-1. Gradle의 JVM 기반 및 호환성
- Gradle은 Java 가상 머신(JVM) 위에서 실행되어, Java와 호환되는 다양한 언어들을 지원한다. 예를 들어, Scala나 Groovy와 같은 언어들도 Gradle에서 사용할 수 있다. 이 JVM 기반의 특성 덕분에 Gradle은 Windows, macOS, Linux 등 다양한 운영 체제에서도 똑같이 잘 작동한다. 이러한 플랫폼 독립성은 개발자들이 어떤 환경에서든 일관된 빌드 경험을 가질 수 있게 해 준다는 장점이 있다.
1-2. DSL 해석
- Gradle은 Groovy나 Kotlin으로 작성된 도메인 특화 언어(DSL)를 사용해서 빌드 스크립트를 만든다. 이 DSL은 복잡한 빌드 과정을 간결하고 직관적으로 만들어주어, 빌드 과정의 자동화와 간소화에 크게 기여한다. 빌드 스크립트는 프로젝트의 빌드 과정을 정의하는 중요한 부분으로, 소스 코드, 리소스, 의존성 등을 포함하여 어떻게 빌드할지, 어떤 태스크를 실행할지를 명시하게 되어 있다. Gradle은 이러한 스크립트를 해석하여 필요한 작업을 수행하게 되는 것이다.
1-3. 의존성 해결
- Gradle은 Maven Central, JCenter, Google Maven 같은 원격 저장소와 개발자의 로컬 시스템에 있는 저장소에서 의존성을 다운로드할 수 있다. 이를 통해 필요한 라이브러리와 플러그인에 쉽게 접근할 수 있다. dependencies 블록에 의존성이 선언되면, Gradle은 이를 분석하여 필요한 라이브러리를 찾는다. 이 과정에서 의존성 간의 충돌 해결과 필요한 버전의 라이브러리 자동 다운로드 등 복잡한 작업들을 Gradle이 알아서 처리해 준다.
2. Groovy와 Kotlin의 역할 및 Java 호환성
2-1. Groovy의 사용과 그 장점
- Groovy는 '동적 타이핑' 언어로, 실행 시간에 변수의 타입이 결정된다는 특징이 있다. 이러한 특성 덕분에 Groovy를 사용하면 빌드 스크립트에서 변수나 메서드를 훨씬 유연하게 다룰 수 있다. 예를 들면, 하나의 변수에 숫자, 문자열 등 다양한 종류의 값들을 할당할 수 있다.
- 또한, Groovy의 문법은 Java와 유사하면서도 훨씬 간결하다. 이는 개발자들이 빌드 스크립트를 더 빠르고 쉽게 작성할 수 있도록 해 준다는 장점이 있다. 간단한 Groovy 스크립트 예제를 보면, plugins, repositories, dependencies 등을 정의하는 방식이 얼마나 직관적이고 간결한지 알 수 있다.
2-2. groovy 예시코드
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.3.1.RELEASE'
testImplementation 'junit:junit:4.13'
}
task customTask {
doLast {
println 'Groovy 스크립트를 사용한 사용자 정의 태스크입니다.'
}
}
2-3. Kotlin의 역할과 Java와의 호환성
- 반면 Kotlin은 '정적 타이핑' 언어다. 이 말은 코드를 작성하는 시점에 변수의 타입이 결정된다는 것을 의미한다. 이 특징은 Kotlin 스크립트를 더 안정적이고 예측 가능하게 만들어준다. 오류가 있다면 컴파일 시점에 더 빨리 발견할 수 있기 때문이다. 또한, Kotlin은 IntelliJ IDEA와 같은 IDE에서 뛰어난 지원을 받는다. 이는 개발자가 빌드 스크립트를 작성할 때 자동완성, 오류 강조, 리팩토링 같은 강력한 기능을 활용할 수 있게 해준다는 의미다. Kotlin 스크립트 예제에서도 볼 수 있듯이, 이 언어는 빌드 과정을 더욱 명확하고 구조화된 방식으로 표현할 수 있게 해 준다.
2-4. kotlin 예시코드
plugins {
java
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web:2.3.1.RELEASE")
testImplementation("junit:junit:4.13")
}
tasks.register("customTask") {
doLast {
println("Kotlin 스크립트를 사용한 사용자 정의 태스크입니다.")
}
}
3. 의존성 다운로드의 내부적인 원리
3-1. 저장소 설정과 그 중요성
- 프로젝트에 필요한 라이브러리를 찾기 위해서는 먼저 'repositories' 블록을 통해 저장소를 지정해야 한다. 이 부분은 Gradle이 라이브러리를 검색하고 다운로드할 위치를 결정하는 데 필요한 설정이다. 널리 알려진 Maven Central, JCenter, Google Maven과 같은 공개된 저장소부터 시작해서, 특정 회사의 내부 또는 개인적인 로컬 저장소까지 다양한 옵션이 있다. Gradle은 이런 다양한 형태의 저장소들을 지원하고, 필요에 따라 여러 저장소를 동시에 사용할 수 있게 해 준다.
- 저장소 설정 예시코드(groovy)
repositories {
mavenCentral() // Maven Central 저장소를 지정
}
3-2. 의존성 선언의 역할
- 그다음으로는 'dependencies' 블록에서 프로젝트에 필요한 라이브러리들과 그들의 버전을 선언한다. 여기에는 컴파일, 테스트, 런타임 등 프로젝트의 여러 단계에 필요한 의존성들이 포함될 수 있다. 버전을 구체적으로 지정하거나, '+' 기호를 통해 범위를 지정하는 방식으로 최신 버전을 자동으로 선택할 수도 있다. 이런 선언 방식은 프로젝트가 최신 라이브러리를 사용할 수 있도록 도와주지만, 때때로 호환성 문제를 야기할 수도 있다.
- 의존성 선언 예시코드(groovy)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.3.1.RELEASE' // Spring Boot 웹 스타터 의존성
testImplementation 'junit:junit:4.13' // JUnit 테스트 의존성
}
3-3. 의존성 리솔루션의 과정
- 'dependencies' 블록에 선언된 의존성은 Gradle에 의해 분석되고, 설정된 저장소에서 필요한 라이브러리를 찾아 자동으로 다운로드된다. 이 과정은 버전 충돌 해결, 트랜지티브 의존성 관리 등 복잡한 작업을 포함한다. 또한, 다운로드된 의존성들은 로컬 캐시에 저장돼서, 프로젝트를 다시 빌드할 때마다 모든 의존성을 다시 다운로드하지 않도록 한다. 이는 빌드 속도의 향상에 기여한다.
3-4. 클래스패스 설정의 중요성
- 모든 의존성이 다운로드되고 나면, 자동으로 프로젝트의 클래스패스에 추가된다. 이렇게 되면 프로젝트를 컴파일하거나 실행할 때 필요한 라이브러리들이 적절히 로드되어 사용된다. 클래스패스 설정은 프로젝트의 빌드와 실행 과정을 원활하게 만든다.
메이븐에 대해서도 알아보자!👇🏻👇🏻
반응형
'Spring 기초 > Spring 설정' 카테고리의 다른 글
[Spring] 스프링 빈 설정의 진화: XML에서 자바, 그리고 컴포넌트 기반으로 (0) | 2024.08.23 |
---|---|
Gradle: Implementation과 RuntimeOnly의 차이점 및 활용 방법 (0) | 2023.12.11 |
[Spring] yml vs properties 설정파일 비교 (1) | 2023.11.08 |
[Spring] Maven이란? (0) | 2023.11.08 |
Spring Boot: Gradle 버전 확인하기 (0) | 2023.10.26 |