Gradle(그래이들) 개념 및 특징
Gradle(그래이들)이란?
유연성과 성능에 중점을 둔 오픈 소스 빌드 자동화 도구
Groovy Script 를 이용한 Build 자동화 시스템
같은 빌드 도구인 Ant, Maven의 장점을 모아 2012년에 출시
Android OS의 빌드 도구로 채택
간결함 / 빠른 속도 / 유연성 / 확장성 / 다양하고 많은 문서화 등의 장점이 있음
📌 빌드 관리 도구 ( = Gradle / Maven / Ant )
- 프로젝트에서 필요한 xml, properties, jar 파일들을 자동으로 인식하여 빌드해주는 도구
- 빌드 되기전 미리 소스 코드를 컴파일, 테스트, 정적분석 등을 하여 실행가능한 앱인지 확인 및 빌드 실행을 해줌
- 프로젝트의 정보 관리, 테스트 빌드, 배포 등의 작업을 해줌
- 배포작업 ⇒ 배포가 되는 위치로 빌드 된 jar, war 파일을 제공해줌
- 외부 라이브러리를 참조하여 자동으로 다운로드 및 업데이트 관리 해줌
- 개발 된 제일 주된 목적
- 개발 전엔 필요한 라이브러리가 있다면 모두 다운받아 라이브러리에 수동으로 추가해주고, 버전 업이 되었는지까지 개발자가 직접 확인하는 작업이 필요했다. ⇒ 이런 번거로운 부분을 빌드 관리 도구가 관리해줌
📌 Groovy 문법
- JVM 위에서 동작하는 동적 타입 프로그래밍 언어
- JVM 언어 중 하나로 DSL에 의한 확장성이 좋은 언어
- Java와 유사한 문법 구조로 학습에 용이
- Java처럼 소스 코드를 컴파일하여 클래스를 생성할 수도 있고, 컴파일을 거치지 않고 직접 실행할 수도있어 스크립트로 사용할 수 있음
- Java 뿐 아니라 Python, Ruby 등에 많은 영향을 받은 프로그래밍 언어로 문법이 간결함
- 대부분 Gradle Script를 작성하기 위해 사용되고 있음
- Gradle Kotlin이 등장하고 나서는 Gradle Groovy를 Gradle Kotlin으로 많이 전환하는 추세임
✅ Gradle 기능
- Incremental Builds (증분 빌드)
Java Complie과 같은 내장 작업은 입력 집합(Java소스파일)과 출력 집합(class파일)을 선언 Gradle은 위의 정보를 사용하여 작업이 최신 상태이고, 작업을 수행해야하는지를 확인 입/출력이 변경되지 않은 경우 Gradle은 해당작업을 건너뛸 수 있음 ⇒ 불필요한 빌드를 또 할 필요가 없음
- Build Caching (캐싱 구축)
작업이 다른 컴퓨터에서 이미 실행 된 경우 Gradle은 로컬에서 실행을 건너뛰고 대신 빌드 캐시에서 작업의 출력을 로드할 수 있음
- Incremental Subtasks (증분 하위 작업)
Gradle은 빌드 실행 간에 작업의 입/출력이 변경되었음을 발견하면 작업이 다시 실행됨 task incremental API를 사용하여 어떤 파일이 변경되었는지를 알 수 있기 때문에 모두 빌드 할 필요없이 변경된 작업만 독립적으로 빌드할 수 있음
- Incremental Annotation Processing (증분 주석 처리)
- Parallel Execution(병렬 실행)
Worker API를 통해 작업 및 작업 내 작업의 병렬 실행을 허용함 ⇒ 병렬 처리는 매우 세분화되기 때문에 성능이 훨씬 빨라짐
- Task timeouts (작업시간 초과)
모든 task에 실행 시간을 제한하는 데 사용되는 제한 시간 속성이 존재함 작업이 제한 시간에 도달하게 되면 해당 작업 실행 스레드가 중단되고 빌드가 완료될 수 있음
✅ Gradle 기본 구조
- 모든 Gradle Script는 하나 이상의 Project로 구성됨 / 모든 Project는 하나의 task로 구성됨
- Gradle Script > Project > task
- Project
- 소스를 jar로 모으거나, 자바 프로젝트를 컴파일 하거나, 테스트를 실행하고, 어플리케이션을 배포하는 등의 업무로 구성된다.
- Task
- 작업의 최소 단계
- Project
- Gradle Script > Project > task
- Gradle은 자바 6버전 이상의 JVM 환경에서 사용가능
- Gradle 설치 또는 Gradle wrapper를 이용하여 실행환경을 구성
✅ Gradle 용어
- /.gradle /gradle
- gradle 버전별 엔진 및 설정 파일
- /.idea
- 에디터 관련 파일들
- /gradlew /gradlew.bat
- gradle 명령파일
- gradlew : Unix용 실행 스크립트 / gradlew.bat : Windows용 실행 스크립트
- /settings.gradle
- 빌드할 프로젝트 정보 설정(트리형태로 멀티프로젝트 구성)
- /build.gradle
- 프로젝트 빌드에 대한 모든 기능 정의
- 의존성이나 플러그인 설정 등을 위한 스크립트 파일
- /src
- 자바소스파일
- /gradlew-wrapper.jar
- Wrapper 파일
- /gradle-wrapper.properties
- Gradle Wrapper 설정 파일
- Gradle Wrapper
- 사용자가 Gradle을 설치하지 않았어도 Gradle tasks를 실행할 수 있도록 도움
- 프로젝트 생성자와 사용자가 동일한 버전의 Gradle 사용할 수 있음
- repositories
- 라이브러리가 저장된 위치 등 설정
- mavenCentral() : 기본 Maven Repository
- dependencies
- 라이브러리 사용을 위한 의존성 설정
✅ Gradle Life-Cycle
1. (Script)초기화 단계
Gradle의 Script 파일을 읽거나 Gradle의 도메인 객체가 생성되는 단계
- Script 파일 확인 및 읽기
- 멀티 or 싱글 프로젝트 판단 ⇒ settings.gradle 로 확인 ⇒ Setting 객체 생성
- Gradle을 이용한 멀티 프로젝트 관리 ( https://jojoldu.tistory.com/123 )
- Setting 객체를 이용하여 각 프로젝트의 org.gradle.api.Project 객체 생성
- 명령어 옵션 및 인수 설정
2. 구성 / 프로젝트 설정 단계
프로젝트를 빌드하기 위해 필요한 정보 및 자원들에 대한 설정이 이루어지는 단계
- 참조 중인 라이브러리 확인 ⇒ build.gradle
- build.gradle에 있는 task를 읽어 Task Container를 이용하여 task 객체 및 task 그래프 생성
3. task 실행 단계
그래프에서 대상이 되는 task를 확인하여 빌드를 실행
- task 추출 및 실행
✅ Ant vs Maven vs Gradle
Ant
- xml 기반의 빌드 스크립트
- 빌드 기능만 가지고 있음
- 그 외 기능은 개발자가 수동으로 관리 해줘야함
- 라이브러리 추가 or 버전 관리등
- 자유로운 빌드 단위 지정
- 간단하고 사용하기 쉬움
- Life-Cycle 없음
Maven
- 자바의 대표적인 관리 도구
- Ant를 대처하기 위해 개발
- 프로젝트 외부 라이브러리를 쉽게 참조할 수 있게 pom.xml 파일로 명시하여 관리
- 라이브러리 추가 시 해당 라이브러리가 참조되고 있는 다른 라이브러리까지 관리
- Life-Cycle 도입
- pom.xml로 편하게 라이브러리/의존성 관리
⇒ xml 기반의 빌드는 대규모 프로젝트로 갈 수록 복잡해짐
⇒ Life-Cycle이 중요한 이유?
- 빌드의 순서를 지정할 수 있음
- 빌드가 잘 못 된 경우 싹 밀고 새롭게 빌드를 할 수 있음
Gradle
- Maven에 비해 더 빠른 처리 속도를 가지고 있음
- 멀티 프로젝트(Multi-Project) 빌드에 최적화하여 설계
- Maven에 비해 더 간결한 Script 구성이 가능함
- 이유? Groovy 언어로 Script 작성하기 때문
- xml로 스크립트를 작성하면 태그로 되어있기 때문에 태그 열고 닫고, 위상에 대한 정렬도 해줘야하기 때문에 Groovy로 작성한 스크립트 보다 복잡함
- 아직까지는 메이븐이 점유율이 높지만 Gradle이 점점 치고 올라오는 추세
- 지금까지 메이븐으로 빌드 관리를 해왔기 때문에 갑자기 변경되긴 어려운것
- 대규모 프로젝트에서 성능이 좋음
- 간략하고 간편한 스크립트 작성
- 빌드 재사용 가능 ⇒ 빌드가 된건 패스하는 기능이 있음
- Gradle을 설치할 필요없이 사용할 수 있음(⇒ Gradle Wrapper)
- Maven : pom.xml / Gradle : build.gradle
📚 참고자료
https://www.youtube.com/watch?v=3Jp9kGDb01g
외부라이브러리 대표 사이트 : https://mvnrepository.com/
Gradle 공식 사이트 : https://docs.gradle.org/current/dsl/
Groovy : https://honeyinfo7.tistory.com/242