안녕하세요! 백엔드 개발자 Kerry 입니다.
오늘은 회사에서 Multi Module 환경을 세팅하면서 Gradle & Groovy에 대해 학습한 내용을 정리해보려고 합니다!
개인적으로 학습한 내용을 정리하는 글이며 틀린 점이 있다면 가감없이 알려주세요!! 언제나 환영입니다!!
Gradle을 한 문장으로 정리하자면, "강력한 빌드 자동화 툴" 입니다. 주로 Java나 Scala와 같은 JVM 프로젝트에 많이 쓰이며 다양한 프로그래밍 언어를 지원합니다. Gradle은 주로 컴파일, 바이너리 패키징, 테스트 실행화 같은 빌드, 테스트, 배포 프로세스의 자동화를 지원합니다.
Gradle은 DSL을 활용한 Script 코드로 Build Process를 명시합니다. 잠깐, 여기서 말하는 DSL은 Domain Specific Language로 특정 분야에 최적화된 프로그래밍 언어를 뜻하며, 여기선 Build Process와 Configuration을 명시하는데 특화된 프로그래밍 언어입니다.
Gradle의 DSL로 가장 대표적인 언어는 Groovy와 Kotlin이 있으며 정통적으로 groovy를 많이 쓰지만 kotlin이 늘어나고 있는 추세 입니다.
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework:spring-core:5.3.0'
testImplementation 'junit:junit:4.13.0'
}
위는 Groovy로 작성한 대표적인 Gradle Build Script 입니다.
Gradle에서 가장 많이 사용하고 대표적인 DSL이며 Build 순서와 설정을 읽기 편리합니다.
build.gradle 이라는 파일명 내부에 작성되어 동작합니다.
plugins {
id("java")
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework:spring-core:5.3.0")
testImplementation("junit:junit:4.13.0")
}
위는 Kotlin DSL로 만들어진 Gradel Build Script 입니다.
build.gradle.kts 라는 파일명 내부에 작성되어 동작합니다.
Kotlin DSL is Now the Default for New Gradle Builds
gradle은 groovy 언어를 통해서 build script를 잘 짜다과 왜 kotlin dsl을 기본으로 바꿨을까요?
이유는 크게 타입 안정성과 생산성 향상 이 2가지로 볼 수 있습니다.
기본적으로 Groovy는 동적 타입 프로그래밍 언어로 스크립트 작성이 쉽지만 그만큼 실수가 발생하면 잡기가 쉽지 않습니다. 반면 kotlin은 정적 타입 프로그래밍 언어로 컴파일 시, 오류를 쉽고 빠르게 잡아내줄 수 있어 유지보수가 더욱 쉽습니다.
gradle은 JVM 프로젝트에 많이 사용되는데 대표적인 언어가 Java와 kotlin이 있습니다. 특히 kotlin이 안드로이드 뿐 아니라 백엔드 언어로도 쓰이면서 Intellij & Kotlin & Gradle 조합이 많아졌습니다. 그렇기 때문에 Gradle 또한 kotlin으로 작업할 수 있다면 하나의 프로그래밍 언어로 서비스 프로그래밍 뿐 아니라, 빌드, 테스트, 배포 스크립트를 작성할 수 있어 생산성이 향상됩니다.
무엇보다 kotlin은 Intellij를 만든 JetBrains에서 만든 언어이기 jetBrains 계열 IDE에서 Kotlin DSL을 사용할 경우 매우 뛰어난 개발 경험을 얻을 수 있습니다.
Gradle은 Dependency Management로 주로 Maven Central과 jcenter를 사용합니다. Dependency Management는 npm 처럼 외부 의존성을 명시하고, 버전을 관리할 수 있는 것입니다. 이 Dependency Management는 자동으로 로컬 머신에다가 캐시해둬서, 빌드 성능과 성능을 향상시킵니다.
Gradle은 Incremental Builds를 지원합니다. Incremental Builds는 이전 Build와 비교해서, 변경이 생긴 부분만 Build tasks를 진행하는 것으로 중복 build를 하지 않기 때문에 속도가 비약적으로 빨라집니다.
주로 checksums과 timestamps를 통해 다시 build를 할지 말지 결정합니다.
Gradle은 여러 개의 서브 프로젝트로 구성된 multi project를 지원합니다. 각각의 서브 프로젝트는 각각의 dependencies와 tasks를 가지고 있습니다. 그래서 각각을 빌드 및 테스트할 수 있습니다. 그러나 이것들을 묶어서 하나의 build script로 만들어서 구성할 수 있습니다. 그렇기 때문에 큰 프로젝트, microservice 같은 서비스에 매우 유용합니다!
Build Scans는 Build Insights를 제공하는 기능입니다. Insightdpsms Build performance, dependencies, 그리고 각 tasks 별 수행 시간 등을 report 형태로 제공합니다. 다른 사람들과 공유할 수 있기 때문에 어느 부분에서 병목인지, 어디서 개선 시켜야하는지 판단할 수 있습니다.
이번 시간에는 Gradle의 가장 기본적인 개념을 정리해봤습니다. spring 프로젝트를 만들면 기존적으로 제공하던 gradle 파일만 보고, 블로그나 gpt의 내용을 무지성 붙여넣기만 했는데, 이번에 gradle을 정리하면서 아 이래서 이렇게 했구만! 을 이해할 수 있어서 좋았습니다 ^^
다음 시간에는 groovy의 기본 문법을 정리하고, 간단한 gradle 프로젝트를 만드는 법을 포스팅하려고 합니다.(kotlin dsl로 하고 싶지만 회사에서 쓰는 언어가 groovy이기 때문에... kts는 다음 기회에...)