gradle이란 오픈소스 빌드 자동화 툴로, 거의 모든 타입의 소프트웨어를 빌드할 수 있는 유연함을 가진다.
Gradle은 실행시켜야 하는 task만 실행시키고 다른 불필요한 동작은 하지 않으며, build cache를 사용함으로써 이전 실행의 task output을 재사용할 수 있어서 퍼포먼스가 뛰어나다는 장점이 있다. 그리고 JVM으로 실행되기 때문에 사용을 위해서 jdk를 설치해야한다는 특징이 있다.
Gradle 프로젝트 생성 후 Gradle에 관련되어 생성된 파일구조를 정리하면 아래와 같다.
├─ gradle
│ └─ wrapper
│ ├─ gradle-wrapper.jar
│ └─ gradle-wrapper.properties
├─ gradlew
├─ gradlew.bat
├─ build.gradle
└─ settings.gradle
각각의 파일의 의미에 대해 설명하면 아래와 같다.
gradlew: 리눅스 또는 맥OS용 실행 쉘 스크립트 파일
gradlew.bat: 윈도우용 실행 배치 스크립트 파일
gradle-wrapper.jar: JAR 형식으로 압축된 Wrapper 파일. gradlew나 gradlew.bat 파일이 Gradle task를 실행하는데 사용됨.
gradle-wrapper.properties: Gradle Wrapper 설정 정보 파일. Wrapper의 버전 등을 설정할 수 있음.
build.gradle: 프로젝트의 라이브러리 의존성, 플러그인, 라이브러리 저장소 등을 설정할 수 있는 빌드 스크립트 파일.
settings.gradle: 프로젝트의 구성 정보 파일. 멀티 프로젝트를 구성시 프로젝트를 모듈화할 경우, 하위 프로젝트의 구성을 설정할 수 있음.
이들 중 프로젝트 내용에 관한 설정을 하는 파일은 build.gradle이고 gradle자체의 버전을 바꾸는 것이 아닌 이상 초급자 수준에서는 이 build.gradle파일 외에는 수정할 일이 없다. 그렇다면 build.gradle 코드의 작성에 대해 알아보자.
실제 작성한 예제 프로젝트의 build.gradle코드를 보며 설명한다.
buildscript { // (1)
ext {
springBootVersion = '2.1.9.RELEASE'
}
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
(1) buildscript{}
프로젝트의 플러그인 의존성 관리를 위한 설정. ext는 build.gradle에서 사용하는 전역변수를 사용한다는 의미인데, 여기서는 springBootVersion 전역변수를 생성하고 그 값을 2.1.7.RELEASE로 한다는 의미이다. 즉, spring-boot-gradle-plugin이라는 스프링 부트 그래이들 플러그인의 2.1.7.RELEASE를 의존성으로 받는다는 의미이다.
// (2)
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
(2) 앞서 선언한 플러그인 의존성들을 적용할 것인지를 결정하는 코드. io.spring.dependency-management플러그인은 스프링부터의 의존성을 관리해주는 플러그인이라 꼭 추가해야 한다. java, eclipse, org.springframework를 포함한 이 네 개의 플러그인들은 스프링부트를 사용하기 위한 필수 플러그인들이라 항상 추가하면 된다.
repositories { // (3)
mavenCentral()
jcenter()
}
(3) repositories는 각종 의존성(라이브러리)들을 어떤 원격저장소에서 받을 지를 정한다. 기본적으로 maverCentral을 많이 사용하지만 최근에는 라이브러리 업로드의 난이도와 자동 업로드 등 지원하는 기능이 많기 jcenter를 많이 사용한다. (본 코드에서는 둘 다 등록하여 이용한 것이다.)
dependencies { // (4)
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.projectlombok:lombok')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
(4) dependencies는 프로젝트 개발에 필요한 의존성들을 선언하는 곳으로, 직접적으로 어떤 라이브러리를 이용하여 코드를 작성할 지 결정하는 것이다. 본 코드에서는 org.springframework.boot:spring-boot-starter-web과 org.springframework.boot:spring-boot-starter-test를 받도록 선언되어있다.
이동욱, "스프링 부트와 AWS로 혼자 구현하는 웹 서비스", 프리렉, 2019, p.30~39