스프링부트를 공부하는 과정 중에 Gradle을 알아보게 되었다.
Gradle 은 간단하게 말하자면 오픈소스 빌드 도구이다.
빌드 도구란 개발에 있어서 자동으로 빌드를 도와주는 프로그램으로 이미 maven이나 ant 같은 도구들이 널리 사용되고 있다. 그렇다면 이 Gradle은 왜 쓰는걸까???
Gradle 이란?
특징
- Ant처럼 매우 유연한 범용 빌드 도구.
- Maven과 같은 구조화 된 build프레임워크 (구조의 전환이 가능).
- Maven, Ivy등의 기존 저장소 인프라 또는 pom.xml 파일과 ivy.xml 파일에 대한 migration의 편이성 제공
- 멀티 프로젝트 빌드 지원.
- 의존성 관리의 다양한 방법 제공
- Build script를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)을 사용
- 기존 Build를 구성하기 위한 풍부한 도메인 모델 제공.
- Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드 지원
장점
- Ant, Maven과 같은 기존의 빌드툴은 xml형식을 이용하여 정적인 설정정보를 구성했다.
Gradle은 Groovy라는 언어를 이용하여 코드로서 설정정보를 구성하기 때문에 구조적인 장점이 있다. - xml의 구조적인 틀을 벗어나 코딩에 의한 간결한 정의가 가능하다.
- 프로젝트를 설정주입방식으로 정의하기 때문에 maven의 상속 구조보다 재사용에 용이하다.
기본구조
- 모든 Gradle script는 하나 이상의 project로 구성되며, 모든 프로젝트는 하나이상의 task로 구성된다.
- Project : 소스를 jar로 모으거나, 자바 프로젝트를 컴파일하거나, 테스트를 실행하고, 어플리케이션을 배포하는 등의 업무로 구성된다.
- Task : 작업의 최소단위이다.
Task간 의존관계 설정과 함께 흐름에 따른 구성이 가능하며, 동적인 테스크의 생성도 가능하다. Gradle Tasks
- Gradle은 자바6버전 이상의 VM환경에서 사용이 가능하며, 설치를 하거나 gradle wrapper를 이용하여 실행환경을 구성할 수 있다.
디렉토리 구조 | 디렉토리 / 파일 | 설명 |
/.gradle /gradle |
gradle 버전별 엔진 및 설정 파일 | |
/.idea | 에디터 관련 파일들 | |
/gradlew /gradlew.bat |
gradle 명령파일 | |
/settings.gradle | 빌드할 프로젝트 정보 설정 (트리형태로 멀티프로젝트 구성) |
|
/build.gradle | 프로젝트 빌드에 대한 모든 기능 정의. | |
/src | 자바 소스 파일 |
Build Lifecycle
Build 3단계 Gradle Build Lifecycle
- 초기화(Initialization) : 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성.
settings.gradle 파일에서 프로젝트 구성 (멀티프로젝트, 싱글프로젝트 구분) - 구성(Configuration) : 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행. (프로젝트 객체 구성)
configured Task 실행 - 실행(Execution) : 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상 결정.
gradle 명령행에서 지정한 태스크 이름 인자와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 Task들을 실행
Build 설정파일
- settings.gradle : 프로젝트 구성 설정.(싱글프로젝트의 경우 생략 가능)
- Gradle은 멀티프로젝트를 구성하여 프로젝트간의 의존성 및 서브프로젝트, 교차 프로젝트를 구성할 수 있다. Gradle MultiProject
- build.gradle : 빌드에 대한 모든 기능 정의.
사용법
build.gradle 파일에 빌드정보를 정의하여 프로젝트에서 사용하는 환경 설정, 빌드방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성한다.
plugin 설정
plugin은 미리 구성해 놓은 task들의 그룹이며, 특정 빌드과정에 필요한 기본정보를 포함하고, 필요에 따라 정보를 수정하여 목적에 맞게 사용할 수 있다.
- plugin을 이용한 빌드파일 설정 gradle plugin
spring intializr를 사용한 springboot 기본 프로젝트 생성에 따른 gradle 설정
plugins {
id 'org.springframework.boot' version '2.3.0.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id 'war'
}
// project info
group = 'com.example'
// project version
version = '0.0.1-SNAPSHOT'
// JDK version source compatibility
sourceCompatibility = '1.8'
- Java 프로젝트를 위해 정의한 'JAVA 플러그인'에서는 compileJava, classes, test, jar 등의 task를 제공한다.
Gradle Java Plugin - Web 프로젝트를 위한 'WAR 플러그인'에서는 어플리케이션 소스를 war파일로 묶어주는 war task를 제공한다.
Gradle War Plugin
저장소 설정
Gradle은 Maven repository, JCenter repository, Ivy directory 등 다양한 저장소를 지원한다. Gradle repository
repositories {
mavenLocal() // maven 로컬 캐시 저장소
mavenCentral() // maven 중앙 저장소
maven { url "http://repo.company.com/maven" } // maven 원격 저장소
}
repositories로 다운로드 받은 jar는 $USER_HOME/.gradle/caches/modules-2/files-2.1/ 경로에 캐시된다.
의존관계 설정
Gradle은 java의 의존성 관리를 위해 다양한 '구성'을 제공하고 있다.
- implementation : 프로젝트 컴파일 과정에서 필요한 라이브러리
- providedCompile : compile시에는 필요하지만, 배포시에는 제외될 dependency를 설정한다.
(war plugin이 설정된 경우에만 사용 가능하다) - providedRuntime : runtime시에만 필요하고, 실행환경에서 제공되는 dependency를 설정한다.
(war plugin이 설정된 경우에만 사용 가능하다) - testImplementation : test 시에 필요한 dependency 관리.
이외에는 Gradle Dependency manaement에서 확인하자.
의존관계는 group, name, version 순으로 의존성을 기술한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
테스팅
Gradle을 통해서 테스트 또한 간편하게 할 수 있다. 테스팅에 관련된 글을 여기서 확인하자. Gradle Testing
- Gradle은 Test시에 특정 테스트만 진행할수도 있음
- 테스트의 결과를 따로 받아볼수도 있음.
- 테스트를 detection하고 그룹화 하여 테스트 진행할수 있도록 도움을 주고 있음.
아래 코드를 사용하여 jUnit5를 사용할수 있다. 위에 springboot stater test를 통해서 dependency 주입되어 테스트가 가능하다.
test {
useJUnitPlatform()
}
이제 풀 코드를 보게되면
plugins {
id 'org.springframework.boot' version '2.3.0.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id 'war'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
참고
- https://medium.com/@goinhacker/%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94-1-%EB%B9%8C%EB%93%9C-%EC%9E%90%EB%8F%99%ED%99%94-by-gradle-7630c0993d09
- https://www.egovframe.go.kr/wiki/doku.php?do=show&id=egovframework%3Adev3.6%3Adep%3Abuild_tool%3Agradle
'Java > Gradle' 카테고리의 다른 글
Intellij에서 Gradle로 멀티프로젝트 관리하기!!! (0) | 2020.05.21 |
---|
댓글