프로젝트에서 필요한 xml, properties, jar 파일들을 자동으로 인식하여 빌드해주는 도구이다.
Maven vs Gradle
- 두가지 기능이 메인이다.
빌드과정 자동화
와의존성 관리
. - 구글 트렌드상으로는
Maven
이 좀더 우세하다고는 하나,Maven
은 지는 해고Gradle
은 뜨는 해인 듯. 신규 프로젝트는Gradle
로 하는 게 대세라고 한다.
Maven
Ant
라는 툴을 대체하기 위해 만들어짐.Ant
는 빌드 기능만 있었는데,Maven
은 라이브러리 관리 기능이 추가되었음- pom.xml 파일로, 프로젝트의 외부 라이브러리(디펜던시)를 참조할 수 있게 명시 관리. 참조한 외부 라이브러리에 연관된 다른 라이브러리도 자동으로 관리됨. 따라서 세세한 부분까진 신경쓰지 않아도 된다고 한다.
Maven 대표 태그들
modelVersion
: maven의 버전groupId
: 프로젝트 내 그룹id. 일반적으로, 대표하는 사이트 도메인 역순으로 적음artifactId
: groupId 외에 프로젝트끼리 겹치지 않게 하기 위해 프로젝트에 id를 부여한 것version
: 프로젝트의 버전(개발 단계에 따라 알아서 작성하면 됨)name
: 프로젝트의 이름properties
: pom.xml 내에서 중복해서 쓰이는 상수를 여기서 갖다쓸 수 있게 정의한 것.${태그명}
형태로 사용하면 됨dependencies
: 의존하고 있는 디펜던시 목록. 하위에는 각 라이브러리마다<dependency>
태그를 사용해 구분함build
: 빌드와 관련된 정보를 설정하는 영역
pom.xml이 JavaScript로 치면 package.json에서 관리하는 dependencies와 비슷한 것 같다고 생각됨
Gradle
Groovy
스크립트를 활용한 빌드 관리 도구. 안드로이드의 표준 빌드시스템으로 채택되어있다.- 멀티프로젝트의 빌드에 최적화되어있음
Maven
에 비해 더 빠른 처리속도를 가지고, 더 간결한 구성이 가능하다.(xml이 불편한 것도 있고…)- 기존과 비교할 때 변경된 사항이 없으면 빌드를 패스하는 기능이 내장되어있다.(
Gradle
이 캐싱이 잘된다고 하던데, 그때문인가보다.) Maven
에pom.xml
이 있다면Gradle
은build.gradle
이 있다.Gradle
은gradle wrapper
를 통해, 따로 설치없이 사용할 수도 있다.
Gradle의 대표 용어들
-
plugins
: 여러 기능을 제공하기 위한 플러그인 설정- 참고로 java 플러그인은 자바 프로그램을 위한 기능을 제공하여
complieJava
라는 태스크는 이덕분에 사용 가능하며main/java
,test/java
등 프로젝트 구조에 규칙이 생김. apllication
이라는 플러그인 덕분에run
이라는 응용프로그램 실행이 가능함
- 참고로 java 플러그인은 자바 프로그램을 위한 기능을 제공하여
group
: 프로젝트 생성 시의 groupIdversion
: 애플리케이션의 버전. 임의의 버전을 쓰면 됨(우리팀에서는 날짜를 쓰더라.)sourceCompatibility
: 자바 버전. 자바소스를 뭘로 컴파일할지이다. 자바 1.6이상에서는 sourceCompatibility이고 1.5 이하에서는 targetCompatibility이다.buildscript > ext
: 그 인자를 buildScript 에서 전역변수로 사용하기 위해 사용되는 메서드이다. 예컨대 Kotlin 버전 등을 갖다쓸 때 여기에 정의하는 듯repositories
: 라이브러리가 저장된 위치 등 설정(그 라이브러리가 어디에 있는지).mavenCentral()
은 기본 메이븐 레포지토리를 의미한다.-
dependencies
: 디펜던시 설정implementation
: 일반적인 것developmentOnly
: 개발환경에서만testImplementation
: 테스트에서만
Gradle Lifecycle
- 초기화(
init
): 어느 프로젝트를 빌드하는지 결정하고 각각의 프로젝트들에 대해 Project 인스턴스를 생성한다. settings.gradle 파일의 내용이 실행되는 사이클이다. - 구성(
configure
): 빌드과정 내 모든 프로젝트의 빌드 스크립트를 실행한다. 이를 통해 프로젝트 객체를 구성한다. build.gradle 파일의 내용이 실행되는 사이클이다. - 실행(
exec
):2. 구성
단계에서 생성하고 설정된 task 중 실행할 것을 결정한다.
Gradle 멀티프로젝트
setting.gradle
은 gradle project의 root project에서 멀티프로젝트를 이어주는 역할을 한다.rootProject.name
은 루트프로젝트 이름을 정의하며, 이는 디렉토리명과는 무관하다고 한다.- 루트에 있는
build.gradle
에서는 모든 서브 프로젝트에 공통된 설정을 넣을 수 있다. - 부모 프로젝트에서 서브 프로젝트의 행위를 정의하는 것도 가능하다.
allprojects
는 말그대로 모든(전체) 프로젝트(현재 + 하위)를 의미한다. 반면subprojects
는 하위 프로젝트만 의미한다.project(':mobile')
이런식으로 하면 특정 프로젝트(이 예시에서는 mobile)만을 의미한다.- 서브프로젝트의
build.gradle
에서 프로퍼티를 들고 있게 해서 그 값에 따라 조건문을 걸어 실행여부를 다르게 만들 수도 있다. - 프로젝트 경로를 지정할 때, 콜론(
:
)은 최상위 프로젝트를 의미한다. 마치 terminal에서~
와 비슷한 느낌. 그 외엔 기본적으로 상대 경로로 인식한다. 이것도 terminal과 비슷함 - 명시적으로 정의하지 않으면 Gradle은 알파벳 순서에 따라 태스크를 실행한다. 단,
evaluationDependsOn
지정 혹은 task 내에dependsOn
키워드를 이용해서 의존성(타 프로젝트)을 명시하면 디펜던시부터 실행된다.
[참고자료]
https://www.youtube.com/watch?v=3Jp9kGDb01g
https://kwonnam.pe.kr/wiki/gradle/multiproject