Gradle은 거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 오픈 소스 빌드 자동화 도구이다. Gradle은 빌드하려는 대상이나 빌드 방법을 거의 고정하지 않아 유연하다.
Gradle이 빌드하는 것이 프로젝트이다. 프로젝트에는 빌드 스크립트가 포함되며, 일반적으로 빌드 스크립트는 프로젝트의 루트 디렉토리에 있는 build.gradle 또는 build.gradle.kts라는 이름의 파일이다. 빌드 스크립트는 해당 프로젝트에 대한 태스크, 의존성, 플러그인 및 기타 구성을 정의한다. 단일 빌드에는 하나 이상의 프로젝트가 포함될 수 있으며 각 프로젝트에는 자체 하위 프로젝트가 포함될 수 있다.
태스크에는 코드 컴파일, 테스트 실행 또는 소프트웨어 배포와 같은 일부 작업을 실행하기 위한 로직이 포함되어 있다.
태스크는 다음과 같이 구성된다:
플러그인은 여러 프로젝트에서 로직과 구성을 재사용할 수 있는 수단을 제공한다. 플러그인을 사용하면 한번 작성된 태스크를 여러 빌드에서 사용할 수 있다. 또는 로깅, 의존성, 버전 관리와 같이 일반적으로 사용되는 구성을 한 곳에 저장할 수도 있다. 이로써 빌드 스크립트의 중복을 줄일 수 있다. 플러그인을 사용하여 빌드 프로세스를 적절하게 모델링하면 사용 편의성과 효율성을 크게 향상시킬 수 있다.
Gradle은 빌드 라이프사이클의 세 가지 단계에서 빌드 스크립트를 평가하고 실행한다:
초기화
빌드 환경을 설정하고 빌드에 참여할 프로젝트를 결정한다.
구성
빌드에 대한 태스크 그래프를 구성하고 설정한다. 사용자가 실행하려는 태스크에 따라 어떤 태스크를 어떤 순서로 실행해야 하는지 결정한다.
실행
선택된 태스크들을 구성 단계의 마지막에 실행한다.
빌드는 Gradle 프로젝트에서 태스크들을 실행하는 것이다. Gradle은 빌드를 구성하고 실행할 태스크를 선택한다. 요청된 태스크와 해당 의존성을 기반으로 가장 작은 태스크 집합을 실행한다.
Gradle 기반의 프로젝트에서 선언되는 모든 의존성들은 해당 의존성이 사용되어지는 특정한 scope가 있습니다.
예를 들어 어떤 의존성은 소스 코드를 컴파일하는데 사용되어지고, 어떤 의존성은 런타임에만 사용되어집니다.
테스트 환경에서만 사용되어야 하는 의존성들도 존재합니다.
Gradle에서는 의존성이 사용되는 scope를 configuration을 통해 명시합니다.
모든 configuration은 고유한 이름으로 식별할 수 있습니다.
🌱 Plugin과 configuration
많은 Gradle의 플러그인(plugin)들은 해당 플러그인에서 미리 정의한 configuration들을 프로젝트에 추가합니다.
예를 들어, 자바 플러그인은 코드 컴파일, 테스트 실행 등에 필요한 다양한 클래스패스(classpath)를 나타내기 위한 configuration들을 추가합니다.
다음은 configuration들이 특정한 목적을 위해 선언된 의존성을 사용하는 그림입니다.
출처: https://ttl-blog.tistory.com/1272
plugins : 프로젝트를 빌드하기 위해 여러가지 작업(컴파일, jar 파일 생성, ...)을 처리해줘야 하는데, 이런 작업들을 해주는 플러그인들이 존재한다. plugins 블록 안에 필요한 플러그인들을 지정해준다.
repositories : 저장소 정보를 관리하는 프로퍼티다. 소프트웨어를 등록하여 관리하는 장소를 가리킵니다. 로컬 환경이나 네트워크에 라이브러리를 공개하고 그 주소를 저장소로 등록하면 저장소에 있는 라이브러리를 그레이들이 취득하여 이용할 수 있다. mavenCentral() 이라는 메소드를 통해 중앙저장소를 사용할 수도 있다.
저장소는 각종 라이브러리 등이 등록된 일종의 소프트웨어 보관 장소라고 할 수 있다. 저장소에는 각종 프로그램이 등록되어 있어 그레들은 저장소로부터 필요에 따라 프로그램을 다운로드하여 이용할 수 있다.
dependencies : 의존성에 관한 설정을 관리하는 프로퍼티다. 여기에 필요한 라이브러리등의 정보를 기술하면 그 라이브러리를 참고할 수 있다. implementation는, 컴파일 할 때 접근할 수 있는 라이브러리고, testImplementation는, 테스트를 컴파일 할 때 접근할 수 있는 라이브러리다. complieOnly는, 컴파일 시에만, runtimeOnly는 런타임시에만 사용한다는 의미다.
ext : build.gradle 에서 사용하는 전역변수를 선언할 수 있는 블록이다. (멀티모듈일 시 주로 사용)
buildscript : 빌드하는 동안 필요한 처리를 모아놓는 곳이다. 그러므로 Gradle이 빌드되기 전에 실행되고, 이 안에서 dependencies와 repositories가 포함될 수 있다. (멀티모듈일 시 주로 사용)
task : task는 신입 개발자가 할 일이 없으므로 생략한다.
멀티 모듈 시, build.gradle에서 사용되는 키워드들은 뭐가 있을까?
allprojects는 전체 프로젝트에, subprojects는 하위 프로젝트에, 그리고 프로젝트 이름을 사용한 project는 해당하는 프로젝트에만 동작하는 설정이다.
