Gradle이 Maven보다 설정 파일 작성이 간단하고 (Maven을 많이 써보지는 않아서 체감하지는 못했지만) build 속도도 빠르다고 하여 프로젝트에서 자주 사용해왔다.
빌드 도구인 Gradle에 대해 알아보자.
0. 사전 지식
빌드 (Build)
빌드란 소스코드 파일을 컴파일하여 실행할 수 있는 가공물로 변환하는 과정 또는 결과물을 의미한다.
즉, .java와 같은 소스 코드, .xml, .properties와 같이 프로젝트에서 쓰인 각각의 파일 및 자원 등을 JVM이나 Tomcat과 같은 WAS가 인식할 수 있도록 패키징하는 과정과 결과물이다.
빌드 도구 (Build Tool)
빌드 도구란 소프트웨어 개발에서 소스 코드를 실행 가능한 애플리케이션으로 만들어주는 도구이다.
빌드 과정을 자동화하여 관리하는 기능을 수행해주며, 소스코드에서 애플리케이션을 생성하며 사용되는 여러 가지 라이브러리를 자동으로 관리한다.
특징으로는
1. 개발자가 스크립트를 작성하여 다양한 작업을 수행할 수 있다.
예를 들어 소스코드 컴파일, 패키징, 테스트, 의존성 주입 및 배포를 할 수 있다.
2. 빌드 도구에 따라 스크립트 작성에 사용하는 문법이 다르다. XML, Groovy 등이 있다.
Apache ANT, Maven, Gradle 등이 빌드 도구에 해당한다.
세 가지의 특징은 다음과 같다.
Apache ANT | Maven | Gradle | |
특징 | - 이클립스 IDE에 기본 탑재 - 설정을 위해 XML 스크립트를 사용 - 2000년대 초반에 사용했지만, 최근엔 주로 레거시 시스템에서만 사용 |
- 설정을 위해 XML 스크립트를 기반으로 하며, pom.xml 파일로 의존성을 관리 | - 가장 최근(2012년)에 나온 빌드 도구로 기존 빌드 도구와 달리 Groovy 문법을 사용 - Build.gradle에 스크립트를 작성하여 사용 - 안드로이드 프로젝트의 표준 빌드 시스템으로 채택되어 있음 |
장점 | - 간단하고 사용하기 쉬움 | - 자동으로 라이브러리와 의존성(dependency)을 관리 (vs. Ant : X) - 빌드 스크립트가 정형화 되어있음 (vs. Ant : 정형화 X) - Life Cycle(라이프 사이클) 개념이 도입되어 빌드 순서 등을 정의할 수 있음 |
- 외부 라이브러리 관리 O - 유연하게 빌드 스크립트를 작성할 수 있음 - 빌드 속도가 빠름 (캐싱이 잘됨) - 기존 XML 기반 스크립트 작성에 비해 관리가 편함 |
단점 | - 복잡한 처리를 하려 하면 빌드 스크립트가 장황해져 관리가 어려움 - 외부 라이브러리를 관리하는 구조가 없음 |
- XML 자체의 한계가 있음 |
1. Gradle이란?
Gradle은 2012년에 나온 빌드 도구로, 기존 빌드 도구들과는 달리 Groovy 문법을 사용한다는 특징이 있다.
안드로이드 프로젝트의 표준 빌드 시스템으로 채택되어 있다.
Build.gradle에 스크립트를 작성하여 사용한다.
다음과 같은 장점이 있다.
- 외부 라이브러리를 관리할 수 있다.
- 유연하게 빌드 스크립트를 작성할 수 있다.
- 캐싱이 잘 되어 빌드 속도가 빠르다.
- 기존 XML 기반 스크립트 작성에 비해 관리가 편하다.
Gradle의 장점을 더 자세히 살펴보자.
2. Gradle의 장점
1) 간결한 스크립트
Gradle과 Maven의 예시 설정 파일이다.
xml 파일은 여는 태그, 닫는 태그 등이 있어 작성할 때도 더 번거롭고 가독성이 떨어진다.
- groovy 예제 (Gradle)
plugins {
// Java 플러그인 적용
id 'java'
}
// 프로젝트의 그룹과 버전 설정
group 'com.example'
version '1.0-SNAPSHOT'
// Java 소스 및 컴파일 버전 설정
sourceCompatibility = 1.8
targetCompatibility = 1.8
// 의존성 설정
dependencies {
// 외부 라이브러리 의존성 추가 (예: Apache Commons Lang)
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
- xml 예제 (Apache ANT, Maven)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
</project>
2) 빠른 빌드 속도
위의 이미지는 Gradle과 Maven의 빌드 속도를 비교한 그래프이다.
Gradle은 빌드 캐시를 이용한 점진적 빌드, 데몬 프로세스를 이용하여 매번 새롭게 빌드하지 않아 더 빠르게 빌드할 수 있다.
점진적 빌드 (Incremental Build)
빌드 결과물을 바탕으로 변경된 내용만 다시 빌드한다.
작업의 입출력을 추적하여 변경된 파일만 처리하여 작업한다.
이때, 이전 작업의 결과를 저장하고 작업의 입출적을 추적하기 위해 빌드 캐시를 이용한다.
데몬(Daemon) 프로세스
데몬 프로세스란 사용자와 상호작용하지 않고 주로 시스템이나 특정 서비스를 지원하거나 백그라운드 작업을 수행하는 프로세스이다.
데몬 프로세스를 통해 빌드 작업의 초기화 작업을 한 번 수행한 후 백그라운드에서 대기하고, 이를 여러 빌드 작업에 대해 재사용하여 중복 초기화 작업을 피해 속도를 향상시킬 수 있다.
3) 멀티 프로젝트 빌드
대규모 프로젝트는 멀티 모듈 프로젝트로 구성되는 경우가 많다.
Gradle을 이용하면 간단하게 각각의 모듈을 빌드할 수 있다.
3. Gradle 사용 방법
Gradle 프로젝트 구조
├── build.gradle
├── .gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── ...
...
Gradle 프로젝트는 위와 같이 구성된다.
각각의 구성요소에 대해서 알아보자.
.gradle
Gradle이 사용하는 폴더로, 작업(task)로 생성된 파일이 저장된다.
gradle
gradle-wrapper와 관련된 폴더이다. gradle-wrapper 실행 명령으로도 task를 실행할 수 있다.
여기에서 gradle-wrapper란, Gradle 빌드 도구를 특정 버전으로 고정시켜 프로젝트에서 특정 Gradle 버전을 사용할 수 있도록 하는 도구이다. 이를 사용하면 로컬에 Gradle을 설치하지 않아도 해당 프로젝트를 빌드하는데 필요한 Gradle 버전이 자동으로 다운로드되고 사용된다.
gradlew, gradlew.bat
gradle-wrapper의 실행 명령으로, gradlew는 Unix/Linux 기반 운영체제의 명령어, gradlew.bat은 Windows 명령어이다.
Gradle을 설치하지 않아도 이를 통해 빌드할 수 있다.
settings.gradle
프로젝트에 대한 설정 정보를 작성한다.
멀티 모듈 프로젝트에서 하위 모듈을 추가하거나 MSA 구조로 프로젝트를 구성할 때 이 파일에 명시를 해야 한다.
build.gradle
프로젝트에 필요한 의존성과 빌드 처리 내용을 작성하는 파일로, 프로젝트하면서 가장 많이 접하게 되는 gradle 파일이다.
src
개발하는 프로그램에 사용되는 파일이 모두 저장되는 폴더이다.
build.gradle
마지막으로 build.gradle의 구성을 살펴보자.
아래는 (gpt가 준..)build.gradle 파일 예시이다.
plugins {
// Java 플러그인 적용
id 'java'
}
// 프로젝트의 그룹과 버전 설정
group 'com.example'
version '1.0-SNAPSHOT'
// Maven Central Repository 사용을 위한 저장소 설정
repositories {
mavenCentral()
}
// Java 소스 및 컴파일 버전 설정
sourceCompatibility = 1.8
targetCompatibility = 1.8
// 의존성 설정
dependencies {
// 외부 라이브러리 의존성 추가 (예: Apache Commons Lang)
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
// 프로젝트의 메인 소스 디렉토리 설정
sourceSets {
main {
java.srcDirs = ['src/main/java']
}
}
// 프로젝트의 빌드 설정
// (여기에 추가적인 빌드 설정을 할 수 있습니다)
plugins
프로젝트에서 사용하는 Gradle 플러그인을 추가한다.
위 예시는 java 플러그인을 사용하고 있다. java 플러그인은 Java 프로젝트를 빌드하는데 필요한 여러 가능과 작업을 제공한다.
repositories
저장소를 의미하며, build.gradle에 기술된 각종 라이브러리를 다운로드하고 통합하여 저장하는 위치이다.
mavenCentral(), jcenter() 의 두 가지 저장소가 있다.
mavenCentral()은 Apache Maven 중앙 저장소를 이용하는 경우로, Gradle은 이 중앙 저장소를 그대로 사용할 수 있다.
jcenter()는 JCenter 저장소로, Maven, Gradle 등 각종 빌드 도구에서 사용할 수 있는 공개 저장소이다.
dependencies
의존성을 주입하는 위치이다.
의존성 옵션에는 아래와 같은 것들이 있다. 자세한 설명은 이곳을 참고하자.
- implementation : 의존 라이브러리 수정 시 본 모듈까지만 재빌드
- api(compile) : 의존 라이브러리 수정 시 본 모듈을 의존하는 모듈들도 재빌드
- compileOnly : compile에만 필요하고, runtime에는 필요 없는 라이브러리
- runtimeOnly : runtime에만 필요하고, compile에는 필요없는 라이브러리
- annotationProcessor : 어노테이션 기반 라이브러리를 컴파일러가 인식하도록 함 (lombok, queryDSL)
- classpath : 지정된 라이브러리를 클래스 경로에 추가. 컴파일 실행시까지 의존하는 라이브러리 지정에 사용
참고 자료
- Gradle로 멀티모듈 프로젝트 구성하기
- Maven과 Gradle의 차이점
- Gradle 기본 다지기 1편
- [요즘 IT] 자바 빌드 도구 'Gradle'의 특징과 사용 팁
- [Java] Gradle.. Gradle 말입니다. 자바 빌드 도구 🐘
- Gradle 의존성 옵션 정리(Compile VS implementation,옵션)
'Language > Java' 카테고리의 다른 글
[Java] BigInteger 사용하기 (0) | 2024.08.22 |
---|---|
[Java] Java 코딩테스트 기본 메소드 (0) | 2024.03.28 |
[Java] String compareTo() 메소드 (0) | 2024.02.25 |
[Java] JVM의 구조 (0) | 2024.02.04 |
java 오류 메시지 모음 (0) | 2023.02.10 |