Gradle 관련 정리

최지웅·2025년 10월 16일

RECO

목록 보기
7/10

Package Manager
1. maven
a. how to work
2. gradle
a. how to work
b. groovy vs kotlin dsl
c. gradle vs gradle wrapper
3. diff

JDK manager
1. jenv
2. SDKMAN
3. jabba
4. diff

package manager

참고
패키지는 코드의 묶음인 라이브러리와는 약간 다르게, 코드의 배포를 위해 사용되는 코드의 묶음이다.
패키지는 일반적으로 라이브러리나 실행파일을 포함하며, 다음의 3가지 정보를 가지고 있는 코드의 배포단위이다.
컴파일한 소프트웨어의 바이너리, 환경설정 정보, 의존에 대한 정보

패키지를 동작시킬 때 기존 패키지의 동작을 위해 필요한 다른 패키지가 필요할 수 있는데, 추가로 설치하는 패키지 역시 또다른 패키지를 설치해야하는 상황이 발생할 수 있으며, 이를 Dependancy Hell이라고 한다. 이때 사용자는 수동으로 패키지를 관리하기 굉장히 어려워진다.

이 문제를 해결하기 위해 패키지 매니저를 사용한다.
각각의 패키지가 자신의 dependency에 대한 정보를 가지게 하여, 사용하고자 하는 패키지의 dependency를 패키질 매니저를 통해 쉽게 설치가 가능하다.

패키지 매니저가 하는 일은 아래와 같다.
1. 패키지의 dependency관리
2. 패키지의 보안 관리(신뢰할 수 있음_authenticity, 손상되지 않음_integrity 보장)
3. 여러 패키지를 기능에 따라 그룹으로 묶어 정리(성능 문제와 위기상황 대처 예방)
4. 패키지 압축 해제
5. Software reposiotry로 부터 패키지를 찾고, 다운로드, 설치, 업데이트 수행

언어 별 패키지 매니저의 종류는 아래와 같다.

maven

참고
빌드란 작성한 소스코드 java, 프로젝트의 파일 및 자원 xml, jpg, jar, properties 등을 JVM이나 Tomcat같은 WAS가 인식할 수 있는 구조로 패키징하는 과정 및 결과를 의미한다.

빌드 자동화 도구는 알맞은 패키지들을 모아서 실제 작동하는 완제풉으로 만드는 패키지 관리(build.gradle), 소스코드 컴파일(.java->.class), 테스트 자동화, 패키징(.class & resources -> .jar 혹은 .war), 배포의 전체 과정을 자동화한다.

Mavan은 자바용 프로젝트 관리 도구로 위에서 다룬 패키지 매니저로서의 역활(라이브러리, 패키지 찾고 다운로드)과 빌드 도구로서의 역활(컴파일, 테스트, 패키징 자동화)를 모두 수행한다.

maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해놓으면 자동으로 다운받으며, 프로젝트의 전반적인 lifecycle을 관리하는 도구로서 간단한 설정을 통한 배포 관리가 가능하다.

maven lifecycle은 미리 정해진 빌드 순서로서
default(일반적인 빌드 프로세스)
->clean(빌드 시 생성되었던 파일들을 삭제)
->validate(프로젝트가 필요한 모든 정보를 사용할 수 있는지 확인)
->compile(소스코드 컴파일)
->test(유닛 테스트. 생략 가능)
->package(컴파일된 소스와 리소스들을 jar, war 등의 배포를 위한 패키지 제작)
->verify(통합 테스트. 품질 기준 충족 여부 확인)
->install(패키지를 로컬 저장소에 설치)
->site(프로젝트 문서, 사이트 작성 및 생성)
->deploy(만들어진 package를 원격 저장소에 release)
를 의미한다.

이때 pom.xml은 필요한 디펜던시와 패키징 형태를 선언한 pom.xml을 사용하기에 maven이 정해진 규칙에 따라 알아서 빌드를 진행해 빌드 과정이 예측 가능하고, 간단하다. 하지만 if나 for과 같은 오직 없이 선언만 가능하다.

gradle

java, c/c++, python 과 같은 여러 언어를 지원하는 빌드 도구이다.
특징으로는 개발, 테스트, 스테이징, 프로덕션 환경 별 설정을 자동화해주어 실수로 잘못된 환경에서 코드가 실행되는 문제를 방지하고, 전체 빌드가 아닌 변경된 부분만 빌드하는 인크리멘탈 빌드로 빌드 시간을 단축해준다.

mavan은 빌드 스크립트를 xml언어를 사용하여 작성했지만, gradle은 jvm에서 동작하는 Groovy기반의 DSL(Domain Specific Language)를 사용한다. dsl은 특정 분야의 문제를 해결해 만들어진 전용 언어로, 소프트웨어 빌드라는 목적에 최적화된 dsl이 gradle이다. 이를 이용해 빌드에 필요한 단어들로 간결하게 지시내릴 수 있다.(반대로 범용적인건 General Purpose Language_python 등)
gradle의 groovy(명령형 프로그래밍 언어)는 if else등의 조건문, 반복문의 사용으로 유연하게 빌드 스크립트를 작성할 수 있다.

Groovy는 자바 문법과 유사하여 학습 장벽이 낮므며 Maven의 pon.xml을 Gradle용으로 변환할 수도 있고 Mavan의 중앙 저장소도 지원하여 maven에서 사용하던 라이브러리를 그대로 사용할 수 있다.

아래는 조건문을 이용하여 보조 자원을 제품에 포함시키기 위해 복사하는 예시이다.

// build.gradle 파일
task customCopy { // customCopy라는 작업을 선언
    def dayOfWeek = new Date().format('E') // 오늘 요일을 가져오는 코드

    if (dayOfWeek in ['토', '일']) { // 만약 오늘이 주말이면
        from 'source/weekend'      // weekend 폴더에서 원본을 복사
    } else {                        // 만약 오늘이 주말이 아니면
        from 'source/weekday'       // weekday 폴더에서 원본을 복사
    }
    into 'build/target' // 복사의 대상을 지정.
}

groovy vs kotlin dsl

참고, 참고2
위에 언급했듯이 gradle은 소프트웨어 빌드라는 목적에 최적화된 DSL(Domain Specific Language)인 groovy를 사용한다고 했다.

그러나 구글에서 Android의 새로운 빌드 언어로 Groovy가 아닌 Kotlin DSL을 선택했다.

Kotlin DSL은 Gradle, Android 등 여러 영역에서 정적 타입 검사, 람다 함수, 확장 함수 같은 Kotlin 언어의 장점을 살린 DSL이다.

둘 다 강력한 도구로서 dsl 구축에 사용되는데 kotlin dsl은 주로 안드로이드 및 kotlin 프로젝트에, groovy dsl은 다양한 프로젝트 및 스크립트에 사용 가능하다는 사용 범위의 차이가 존재한다.

또한 kotlin dsl이 무조건적으로 좋은 것은 아니다.
Gradle은 한번 빌드한 결과를 Build Cache에 저장하는데 캐시가 무효화 되거나 Clean명령을 사용하면 Gradle은 캐시를 지우고 새로 빌드를 수행한다. 이 때 정적 타이필이라는 Kotlin의 특징으로 인해 Kotlin dsl은 캐시 없이 빌드 시 모든 변수의 타입을 미리 검사하고 확정하는 검사 과정으로 인해 Groovy보다 더 긴 시간이 걸리게 된다.
또한, 새로운 라이브러리 버전이 나왔을 시 groovy dsl보다 kotlin dsl에서 조금 늦게 지원되는 경우가 존재한다.

결론
신규 프로젝트 이며 안정성과 IDE 지원이 중요하다면 Kotlin DSL을
기존 groovy 프로젝트를 유지보수하며, 빌드 속도가 1초라도 중요하며 캐시를 자주 비우는 경우 Groovy DSL을 사용하는 것이 좋다.

gradle vs gradle wrapper

참고
Gradle은 CI/CD를 위해 코드 컴파일, 테스트, 패키징, 의존성 관리, 배포 등 빌드 과정을 자동화해주는 도구입니다.
장점: 캐싱을 이용한 빠른 빌드가 가능합니다.
사용법: 시스템에 특정 버전의 Gradle을 직접 설치하고 관리해야 합니다. (하지만 시스템에 gradle을 직접 설치하지 않고, 프로젝트에 포함된 gradlew을 이용하는 것이 표준)

Gradle의 작동 단계
Gradle은 Groovy 문법을 기반으로 초기화 → 구성 → 실행 3단계에 따라 작동합니다.

  • 초기화 단계: settings.gradle과 루트 build.gradle을 이용해 프로젝트 설정과 빌드 단위를 결정합니다.
  • 구성 단계: 각 프로젝트의 build.gradle 설정을 적용합니다. 이 때 Gradle은 소스코드와 설정 변경 유무를 확인하고, 변경사항이 없으면 build task를 건너뜁니다.
  • 실행 단계: 구성 단계에서 생성된 task 중 사용자가 요청한 대상을 실행합니다. (./gradle build 등)

Gradlew (Gradle Wrapper) 란?
Gradle Wrapper는 특정 버전의 Gradle을 프로젝트에 포함시켜, 개발 환경에 Gradle을 사전 설치할 필요 없이 일관된 빌드 환경을 제공하는 도구입니다.

특징:

  • 개발자는 별도로 Gradle을 설치하거나 버전을 관리할 필요가 없습니다.
  • 여러 개발자가 동일한 Gradle 버전으로 작업하도록 강제하여 팀 프로젝트의 빌드 일관성을 유지합니다.
  • 최초 실행 시 지정된 버전의 Gradle을 다운로드하므로 인터넷 연결이 필요합니다.

diff maven, gradle

위 내용을 기반으로 차이점을 정리하면 아래 표와 같다.

구분Maven (메이븐)Gradle (그래들)
설정 방식pom.xml (선언적인 XML 문서)build.gradle (명령형 프로그래밍 코드 - Groovy/Kotlin DSL)
핵심 철학규칙과 표준 (정해진 Lifecycle)유연성과 성능
성능상대적으로 느림매우 빠름 (캐싱, 점진적 빌드)
유연성낮음 (정해진 규칙 안에서만 동작)높음 (if, for 등 프로그래밍 로직으로 복잡한 빌드 제어 가능)
주 사용처전통적인 기업 프로젝트, 안정성 중시안드로이드 앱, 대규모/최신 프로젝트, 성능 중시

jdk manager

참고
JDK(Java Development Kit)는 자바 프로그램 개발을 위한 핵심 도구와 라이브러리를 포함하는 소프트웨어 개발 키트이다. 자바 언어로 애플리케이션을 개발하고 실행하는 데에 필요한 모든 도구(자바 컴파일러, 자바 가상 머신, 자바 API 라이브러리, 도구와 유틸리티, 개발 문서와 예제 코드)를 제공한다.

다양한 자바 프로젝트를 개발하며, 각각에 맞는 새로운 JDK를 다운로드하고 해당 폴더를 환경변수로 등록해야하는 번거로운 문제를 해결하기 위한 프로그램이 JDK manager이다.

jenv

참고
다양한 Java version을 하나의 컴퓨터에서 사용할 수 있게 해주는 JDK manager로, 프로젝트 마다 다른 자바 버전을 사용할 경우 사용에 용이하다. HOME, PATH등의 환경변수를 조작할 필요를 덜어준다.

다만 JDK를 직접 설치해주지는 않으며 jenv add 를 이용하여 jenv에게 어떤 버전의 JDK가 설치되어 있는지 알려줘야 한다.

java 버전 변경 시 global, local, shell을 이용하여 범위를 지정할 수 있다.

sdkman

참고, 참고2
unix기반 플랫폼에서 월활하게 작동하며, JDK설치부터 버전관리까지의 기능을 지원한다. 또한 java뿐 아니라 gradle, maven, kotlin, scala등의 jvm 생태계의 거의 모든 개발 도구(SDK)를 설치하고 관리할 수 있다.

단점으로 특정 디렉터리에서 특정 jdk 버전을 사용하는 기능은 지원하지 않기에, 별도로 direnv라는 도구를 병행해서 사용한다.

jabba

참고
JDK 설치, 버전 관리만을 위한 도구로서 특화되어 SDKMAN보다 use 명령의 속도가 빠르다. windows, macOS, Linux를 모두 지원한다.
단점으로는 기본 sdk버전 지정 기능이 없고(별도 명령어로 가능), 디렉토리 별 버전 기능이 완전 자동이 아니라 디렉토리에 들어가 jabba use명령을 한 번 실행해주어야 한다.

diff jenv, sdkman, jabba

구분jenvSDKMAjabba
요약설치된 JDK를 전환만 해줌JDK와 각종 도구를 설치하고 전환까지 다 해줌윈도우에서도 잘 되고, 다양한 JDK를 골라 설치 가능
JDK 설치❌ (수동 설치 후 등록)✅ (명령어로 자동 설치)✅ (명령어로 자동 설치)
관리 범위오직 Java 버전 관리Java, Gradle, Maven, Kotlin 등 JVM 생태계 전반다양한 Java 배포판
지원 플랫폼Linux, macOSLinux, macOS, WSLWindows, Linux, macOS
추천 대상가볍게 버전 전환만 하고 싶은 사용자대부분의 자바/JVM 개발자윈도우 사용자 또는 여러 JDK 배포판을 테스트하는 사용자
profile
이제 4학년!!!

0개의 댓글