본문 바로가기
Back/Spring Boot

[Gradle] biuld.gradle 살펴보기

by 은z 2023. 9. 5.

Gradle ???

자바에서 외부 라이브러리를 가져다 쓴다는 의미는 결국 외부 라이브러리의 .jar를 가져와서 classpath에 추가하는 것이다.

build.gradle이라는 파일에 가져다 쓸 라이브러리의 이름, 버전을 명시하면 gradle이 자동으로 jar파일을 다운 받고 추가해준다.

요약해서 말하면 gradle은 오픈소스 빌드 자동화 툴이다.

 


1. 구조 살펴보기

프로젝트 구조 사진 디렉토리 /파일 설명
/.gradle
/gradle
gradle 버전별 엔진 및 설정 파일
gradlew
gradlew.bat
gradle 명령 파일
setting.gradle 빌드할 프로젝트 정보 설정
builld.gradle 플젝트 빌드에 대한 모든 기능 정의
/src 자바 소스 파일

 

📌build.gradle이라는 파일에 빌드정보를 정의하여 프로젝트에서 사용하는 환경 설정, 빌드방법, 라이브러리 정보 등을 기술하여 빌드 및 프로젝트의 관리환경을 구성한다.

 

그럼 이제 build.gradle 파일을 살펴보자.

 

2. build.gradle 파일 하나씩 뜯어보기

 

아래 코드는 예제일뿐이다. 자신의 프로젝트 상황에 맞게 재수정 해야한다. 참고만 하자!

buildscript {
	ext {
		// SpringBoot 2.7.9 라이브러리 의존성 버전 참고 : https://docs.spring.io/spring-boot/docs/2.7.9/reference/htmlsingle/#appendix.dependency-versions
		springBootVersion = '2.7.9'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.9'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
	id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
	id 'idea'
	id 'eclipse-wtp'
}

group = 'kr.co.testing'
version = '0.0.1-'+ new Date().format('yyyyMMddHHmmss')
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
compileJava.options.encoding = 'UTF-8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenLocal() // 로컬 저장소 사용
	mavenCentral() // 원격(중앙) 저장소 사용
}

dependencies {

	// SpringBoot
	implementation "org.springframework.boot:spring-boot-starter-web:${springBootVersion}"
	implementation "org.springframework.boot:spring-boot-starter-security:${springBootVersion}"
	developmentOnly "org.springframework.boot:spring-boot-devtools:${springBootVersion}"


	// MariaDB
	runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'


	// JUnit5
	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
	testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

tasks.named('test') {
	useJUnitPlatform()
}

jar{
	enabled = false
}

 

✔️plugin 설정

plugin은 재사용 가능한 빌드 로직을 패키지화하여 task로 제공해 빌드시 사용할 수 있도록 제공한 것이고,

plugins블록은 사용할 플러그인을 선언하는 블록이다.

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.9'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
	id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
	id 'idea'
	id 'eclipse-wtp'
}

 

📌 id 'java' 

- Java 프로젝트를 위해 정의. test, jar 등의 task를 제공한다.

 

📌 id 'war' 

- 어플리케이션 소스를 war파일로 패키징 해주는 task를 제공한다.

 

✔️Option 설정

group, version, sourcecompatibility은 option에 해당한다.

 

group = 'kr.co.tesing'
version = '0.0.1-'+ new Date().format('yyyyMMddHHmmss')
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
compileJava.options.encoding = 'UTF-8'

📌group : 생성될 artifact의 그룹명

📌version : release 버전을 나타낸다. build를 수행하면 jar파일 뒤에 version이 붙어서 나온다.

📌sourcecompatibility : 자바 소스를 컴파일 할 때 사용한 java version

 

✔️저장소 설정

repository는 프로젝트 빌드에 필요한 dependencies를 어디서 다운 받을 것인가를 지정한다.

mavenCentral은 maven의 중앙저장소이다.

repositories {
	mavenLocal() // 로컬 저장소 사용
	mavenCentral() // 원격(중앙) 저장소 사용
}

 

✔️의존성 설정

dependencies{}에 프로젝트가 작업을 수행하는데 필요한 의존성들을 적는다. 의존성을 추가하면 해당 의존성이 의존하는 하위 의존성들도 함께 설치되고 반대로 삭제되면 하위 의존성들도 함께 제거된다.

 

dependencies {

	// SpringBoot
	implementation "org.springframework.boot:spring-boot-starter-web:${springBootVersion}"
	implementation "org.springframework.boot:spring-boot-starter-security:${springBootVersion}"
	developmentOnly "org.springframework.boot:spring-boot-devtools:${springBootVersion}"


	// MariaDB
	runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'


	// JUnit5
	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
	testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

📌testImplementation : 테스트 코드를 수행할때만 적용하는 모듈

📌testAnnotationProcessor : 테스트 코드를 수행할때만 적용하는 annotation

 

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

📌annotationProcessor : 컴파일러가 annotation을 확인할 때 해당 모듈의 것도 확인해달라는 뜻이다

 

 

✔️테스팅

테스트 또한 gradle을 통해 간단히 할 수 있다.

tasks.named('test') {
	useJUnitPlatform()
}

 

 

✔️Spring Boot 2.5 버전부터 gradle build 시에 jar 파일 2개 생성되는 현상 방지하기

Spring boot 2.5버전 부터 별도의 설정을 하지 않을 경우 jar로 패키징할 때, 2개의 jar 파일이 생성된다.

(프로젝트이름-버전.jar   프로젝트 이름-버전-plain.jar)

 

참고로!

👀plain archive

- plain이 붙은 파일을 plain archive라고 부르는데, plain archive는 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고, 작성된 소스코드의 클래스 파일과 리소스 파일만 포함한다. 

- gradle 의 "jar" task 로 생성

- 모든 의존성이 존재하는 게 아니기에 java -jar  명령어로 실행 시 당연히 에러 발생

👀executable archive

-반면 -plain 키워드가 없는 jar 파일을 executable archive 라고 부른다. 이 파일은 어플리케이션 실행에 필요한 모든 의존성을 함께 빌드한다.

- gradle 의 "bootJar" task 로 생성

- 모든 의존성 포함되어 있기에 java -jar 명령어로 실행 가능


📌빌드 시 build.gradle 파일에 아래와 같이 설정을 추가하면 executable jar 파일만 생성된다.

jar{
	enabled = false
}

 

댓글