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
}
'Back > Spring Boot' 카테고리의 다른 글
[SpringBoot] 외장 tomcat에 JNDI 설정 (+war) (1) | 2023.10.23 |
---|---|
[SpringBoot] war로 배포하기, 외장 톰캣 구동 (+Trouble Shooting) (1) | 2023.10.11 |
[SpringBoot] @Valid 어노테이션으로 collection 객체 검증 (0) | 2023.01.30 |
[Spring Boot] .jar 배포 후 resources 파일 경로 찾기 (2) | 2022.06.10 |
[SpringBoot] @Valid 어노테이션으로 validation 유효성 검사하기 (0) | 2022.02.08 |
댓글