앤트(Ant)
XML 스크립트를 기반으로 하고 최근에 나온 빌드 도구들과 달리 자동으로 라이브러리를 업데이트 하는 기능이 없기 때문에 현재는 주로 레거시 시스템에서만 사용되고 있다.
메이븐(Maven)
자바 프로젝트의 라이프 사이클(Life Cycle)을 XML 파일로 정의하여 빌드, 테스트, 배포 등을 자동화하는 빌드 도구
- POM(Project Object Model)을 이용하여 프로젝트 정보, 라이브러리, 의존성 등을 정의하고 이를 기반으로 빌드 프로세스를 수행한다.
- 중앙 저장소(Central Repository)라는 중앙화된 라이브러리 저장소를 제공하여 필요한 라이브러리와 의존성을 쉽게 관리할 수 있다.
그래들(Gradle)
자바를 비롯한 다양한 언어로 작성된 프로젝트를 관리할 수 있는 Groovy 기반의 빌드 도구
- build.gradle에 스크립트를 작성한다.
- 현재 안드로이드 프로젝트의 표준 빌드 시스템으로 채택되어 있다.
- 높은 유연성과 확장성을 가지고 있으며, 다양한 빌드 시나리오를 처리하기에 용이하다.
Gradle을 사용해야하는 이유
- 간결한 스크립트
- 빌드 속도
- 멀티 프로젝트 빌드
- 하나의 프로젝트 안에 여러 모듈이 동시에 개발될 경우 각각 따로 빌드 작업을 하면 번거로울 뿐만 아니라 실수가 생기기도 쉽다.
Gradle이 빌드 속도가 빠른 이유
- 점진적 빌드
- 이미 빌드된 파일들을 모두 다시 빌드하는 것이 아닌 바뀐 파일들만 빌드한다.
- 빌드 캐시
- 이전 빌드의 결과물을 다른 빌드에서 사용할 수 있다.
- 데몬 프로세스
- 서비스의 요청에 응답하기 위해 오랫동안 살아있는 프로세스인데 Gradle의 데몬 프로세스는 메모리 상에 빌드 결과물을 보관한다. 이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 매우 적은 시간만 소요된다.
build.gradle
gradle에서 빌드 작업에 필요한 기본 설정, 동작 등을 정의하는 파일
plugins
plugin이란 Gradle Task의 집합이다. Gradle Task는 애플리케이션 빌드부터 테스트까지 다양한 작업을 수행하는 작업 단위를 뜻한다.
gradle 빌드 자동화 기능을 확장하기 위해 추가적으로 제공되는 기능.
plugins 블록을 사용하여 외부 플러그인을 선언 하면 Gradle은 해당 플러그인을 다운로드하고 빌드에 적용한다.
예를들어, java 플로그인을 선언하면 빌드에 필요한 Java 컴파일러 및 빌드 도구를 제공한다.
Gradle 2.1 이후에 도입되었으며, 기존의 apply plugin: 문법 대신 사용된다.
plugins {
id 'java'
}
※ 플러그인 버전의 유무 차이는?
플러그인 버전을 명시하지 않을 경우 gradle 내부에서 정의해둔 내장 플러그인을 사용하고
버전을 명시할 경우엔 repositories {} 에 지정한 외부 저장소에서 외부 플러그인을 다운로드 받아 사용한다.
repositories
프로젝트에서 사용할 외부 저장소를 정의하는 데 사용된다.
- mavenCentral() 또는 jcenter()와 같은 미리 정의된 저장소를 사용하거나, 직접 저장소를 추가할 수 있다.
dependencies
프로젝트가 의존하는 외부 라이브러리와 모듈을 정의하는데 사용된다.

compile을 사용하는 경우
- A 모듈을 수정하게 되면 A 모듈을 의존하는 모든 모듈이 rebuild 된다. (시간이 오래걸림)
implementation을 사용하는 경우
- A 모듈을 수정하게 되면 A 모듈을 직접적으로 의존하는 모듈인 B 모듈 까지만 rebuild 한다. (빠름)
- 사용자에게 필요이상의 API를 노출하는 것은 불필요하다. (Facade 패턴), Compile을 사용하면 연결된 모든 모듈의 API가 노출된다.
의존성 옵션들
- api: 내부 의존성을 컴파일과 런타임 모두에 보이는 API 의존성,
의존 라이브러리 수정시 본 모듈을 의존하는 모듈들도 재빌드, 본 모듈을 의존하는 모듈들도 해당 라이브러리의 api를 사용할 수 있음. - implementation: 내부 의존성을 런타임에서만 보이는 구현 의존성
- compileOnly: 컴파일시에만 사용되는 의존성 정의
- runtimeOnly: 런타임시에만 사용되는 의존성 정의
- test + Implementation, CompileOnly, RuntimeOnly: 해당 의존성을 테스트시에만 사용하도록 정의
- classpath: 지정된 라이브러리를 클래스 경로에 추가할 수 있다. 컴파일 실행시까지 의존하는 라이브러리 지정에 사용한다.
※ 디펜던시 버전의 유무 차이는?
디펜던시 버전을 명시하지 않을 경우 repositories {} 에 지정한 저장소에서 가장 최신 라이브러리를 다운 받는다.
마이너 버전 중 최신 유지
dependencies {
implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.0.+'
}
메이저 버전 중 최신 유지
dependencies {
implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.+'
}
settings.gradle
여러가지로 사용할 수 있지만 가장 많이 사용하는것은 멀티모듈을 사용할 때 설정이다.
rootProject.name = 'devktak' // 루트 프로젝트
include 'sub-devktak' // 하위 모듈
allprojects, subprojcets, project
멀티 모듈인 경우 allprojects는 전체 프로젝트에, subprojects는 하위 프로젝트에, 그리고 프로젝트 이름을 사용한 project는 해당하는 프로젝트에만 동작하는 설정
Gradle Wrapper
※ gradle wrapper의 장점은?
gradlew 스크립트는 Gradle Wrapper를 사용하여 Gradle 빌드를 실행하는 데 사용된다.
Gradle Wrapper는 Gradle 빌드를 실행하기 위해 로컬 시스템에 Gradle을 설치하지 않고도 Gradle 빌드를 실행할 수 있도록 하는 도구이다.
Gradle Wrapper를 사용하면 프로젝트에서 사용되는 Gradle 버전을 지정할 수 있으므로, 팀 내에서 모든 개발자가 같은 Gradle 버전을 사용하여 일관성 있는 빌드를 수행할 수 있다.
또한 Gradle Wrapper를 사용하면 Gradle 설치 및 관리를 담당하는 작업을 줄일 수 있다.