반응형
Gradle
Groovy 언어를 기반으로한 빌드 도구
왜 maven이 아닌 gradle을 사용할까
- cache를 적용하여 빌드 속도를 줄일 수 있다.
- 스크립트 언어로 변수 설정, 로직 구현 등 반복되는 코드 양을 줄일 수 있다.
- task 설정, 모듈별 의존성 설정 등
- xml과 비교해 가독성이 높다.
init.gradle
초기화 스크립트, build시에 가장 먼저 실행
사용자 정보 및 실행 환경 초기화에 사용
gradle.properties
환경에 따라 값이 달라지는 파라미터 정의
settings.gradle
rootProject.name = 'study'
include 'simple'
빌드 대상 프로젝트를 설정
멀티 모듈 프로젝트에서 build 대상 프로젝트를 지정
build.gradle
프로젝트 의존관계, 태스크 정의. build를 위한 파일
plugin
Gradle Task의 집합
외부에서 작성된 plugin을 사용하려면 plugins로 정의해주면 된다.
- Task
- 어플리케이션 빌드부터 테스트까지 다양한 작업을 수행하는 단위
plugins{
id 'org.springframework.boot' version '2.6.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
- spring.dependency-management 플러그인은 spring-boot-dependencies 를 사용하여 사용중인 스프린 부트 버전에서 자동으로 의존성을 가져오게 된다.
- 스프링 부트 1.x 버전은 자동으로 적용되지만 2.x 버전은 build.gradle에 명시해주어야 한다.
- java 플러그인을 통해 compileJava, compileTestJava, jar, test, clean와 같은 자바 build 관련 Task들을 수행할 수 있다.
- buildscript+apply plugins보다 plugins 가 더 최신에 권장되는 방법이다. 멀티 모듈 프로젝트에서 subproject, allprojects를 의존성 문제때문에 권장하지 않게 되면서 모듈 전체에 설정하기 보다 모듈마다 설정하는 방식을 권장하는 것 같다. 참조
- subproject에 설정할 땐, 버전 정보 없이 plugins와 적용할 plugin의 id만 적어주면 된다.
Dependency Management
- compile: deprecated되고 implementation을 권장한다.
- implementation이 compile보다 빠르고 빌드 시 api가 노출되지 않아 implementation을 권장한다고 한다.
- implementation: 컴파일하는데 필요한 라이브러리 의존성을 추가한다. 컴파일, 런타임 모두 필요한 경우 사용
- compileOnly: 컴파일 과정에만 필요한 라이브러리에 사용한다. (e.g. lombok)
- runtimeOnly: 런타임 과정에만 필요한 라이브러리에 사용한다. (e.g. h2)
- 테스트 코드의 의존성을 추가하는 testImplementation, testCompileOnly, testRuntimeOnly 등이 있음
repositories
repositories {
mavenCentral()
}
라이브러리들을 가져올 원격 저장소를 정의한다.
variables
group = 'com.yaini'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
- group은 프로젝트의 groupId, version은 프로젝트의 버전을 명시해준다.
- gradle 로 프로젝트를 생성하면 sourceCompatibility 만 설정이 되는데, 검색을 하다보면 targetCompatibility 도 찾아볼 수 있다. sourceCompatibility는 자바 1.6 이상에서 사용하는 컴파일 메소드이고 targetCompatibility는 자바 1.5 이하에서 사용하는 컴파일 메소드 이다. 따라서 그 전 버전을 사용하지 않는다면 sourceCompatibility 만 있어도 무방하다.
BootJar, jar
ci/cd를 진행하던 중 build/libs에 jar 파일이 두 개가 생성되었고, 이 jar 파일 때문에 에러가 발생하였다.
스프링 부트 2.5 버전 이후부터 적용된 옵션이라고 한다. ( 이전 버전은 jar or war tasks are disabled로 생성되지 않는다. )
BootJar에 의해 생성된 jar은 의존성을 모두 포함하기 때문에 java -jar 실행 시 문제 없이 실행된다.
Jar에 의해 생성된 jar은 plain archive라고 하여, 어플리케이션 실행에 필요한 의존성을 포함하지 않고 소스코드의 클래스 파일과 리소스 파일만 포함한다. 이 jar 파일이 바로 plain이 붙은 jar 파일이다.
- 의존성을 포함하고 있지 않기 때문에 java -jar로 실행되지 않는다.
그러면 plain jar은 왜 필요할까?
- 멀티 모듈 프로젝트에선 application으로 실행시키기 위한 모듈 외에도 라이브러리의 역할을 하는 모듈들이 있다. (domain 모듈, core 모듈 등등) 이러한 모듈들은 bootJar가 아닌 Jar을 사용하여 build 해주어야 한다.
bootJar.enabled(true)
jar.enabled(false)
다음과 같이 설정해주면 jar 파일이 하나만 생성되게 된다.
코드
루트 프로젝트 gradle.build
plugins {
id 'org.springframework.boot' version '2.6.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.yaini'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
서브 프로젝트(어플리케이션) gradle.build
plugins {
id 'org.springframework.boot'
id 'io.spring.dependency-management'
id 'java'
}
group 'com.yaini'
version '0.0.1-SNAPSHOT'
bootJar.enabled(true)
jar.enabled(false)
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
test {
useJUnitPlatform()
}
전체 코드
https://github.com/yaini/Spring_Study/tree/spring-8-multi-module
참고
https://earth-95.tistory.com/132#BootJar�%--%--%--�%-D%--�%--%B-%--�%--%-D�%--%B-�%--%-C%--jar%---Executable%--Archive-
https://brunch.co.kr/@springboot/186
https://earth-95.tistory.com/132
https://velog.io/@yangju0411/스프링-부트-build.gradle-작성하기-간단-정리
https://robin00q.tistory.com/15
https://galid1.tistory.com/645
반응형