1. Gradle
빌드 자동화 시스템
실행 가능한 jar파일을 만들어준다
Java, Android, and Kotlin, C++ 등 개발자를 위한 빌드도구
2. build.gradle
- Gradle 기반의 빌드 스크립트
- 소스 코드를 빌드하고 라이브러리들의 의존성을 쉽게 관리
- groovy 혹은 kotlin 언어로 작성
- gradle을 이용해서 프로젝트를 생성하면 아래와 같이 SourceSet을 구성해준다.
- 그렇기 때문에 gradle로 프로젝트를 생성하지 않으면 SourceSet의 구성이 달라진다.
3. Gradle Basics
< Gradle 구성>
- Project
빌드하고 싶은 애플리케이션이나 라이브러리
- Build 스크립트(build.gradle)
프로젝트를 빌드하는 단계를 적은 파일
프로젝트 당 build 스크립트가 한 개 이상
- Dependency Management
프로젝트에 필요한 외부 리소스들을 선언하고 풀어주는 역할
- Tasks
기본 작업 단위 - 코드 컴파일, 테스트 실행
- Plugins
4. build.gradle파일 구성
plugins{} :
여기에 추가한 내용은 재사용 가능한 빌드 로직을 패키지화하여 task로 제공해 빌드시 사용할 수 있도록 도와준다
Options
group = 'com.sparta' : 아티팩트의 그룹명
version = '0.0.1=SNAPSHOT' : realse될 버전
sourceCompatiblity = '17' : java 소스를 컴파일할 때 사용되는 java 버전
configurations :
configurations {
compileOnly {
extendsFrom annotationProcessor // compileOnly가 dependency의 anntoationProcessor를 상속하도록 설정
}
smokeTest.extendsFrom testImplementation // smokeTest 에서도 testImplementation을 사용할 수 있다
}
dependencies {
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'junit:junit:4.13'
smokeTest 'org.apache.httpcomponents:httpclient:4.5.5'
}
repositories
repositories{ mavenCentral() } : 프로젝트 빌드에 필요한 의존성을 다운받을 저장소. 여기서는 maven 저장소
mavenCentral은 maven의 중앙저장소로 gradle 내장 함수 mavenCentral()을 이용해 중앙저장소에 있는 의존성들을 가져온다. // 자신의 maven reposity를 구축하여 사설 저장소로도 쓸 수 있다.(maven,ivy를 사용)
repositories{
mavenCentral()
}
# 프로젝트 빌드에 필요한 의존성을 다운받을 저장소. 여기서는 maven 저장소
# mavenCentral은 maven의 중앙저장소로 gradle 내장 함수 mavenCentral()을 이용해
# 중앙저장소에 있는 의존성들을 가져온다. 자신의 maven reposity를 구축하여
# 사설 저장소로도 쓸 수 있다.(maven,ivy를 사용)
dependecies :
Dependency Configuration
apiElements와 runtimeElements는 구성 요소가 라이브러리를 컴파일하거나 실행할 때 사용
- apiElements
- 해당 라이브러리 컴파일
- 해당 라이브러리를 컴파일하는데 필요한 모든 요소를 검색
- runtimeElements
- 해당 라이브러리를 실행
- 해당 라이브러리를 컴파일하는데 필요한 모든 요소를 검색
compileClasspath, runtimeClasspath : 구성 요소 자체를 실행하는 데 필요한 모든 요소를 검색할 때 사용한다.
- compileClasspath : 소스를 컴파일할 때 사용할 classPath
- runtimeClasspath : 소스를 실행시 사용할 classPath
api, implementation, compileOnly, runtimeOnly : 사용자가 의존성을 선언할 때 사용 / 라이브러리마다 필요한 시점이 다르기 때문에 거기에 맞게 사용
- api
- 컴파일 타임에 필요한 라이브러리
- 의존 라이브러리가 수정되는 경우 본 모듈을 의존하는 모든 모듈들을 재빌드
ex) A <- B <- C 의 구조에서 C에서는 A 접근이 가능하며 A가 수정되면 B, C가 재빌드된다
- implementation
- 내부적으로만 사용되고 사용자에게는 의존성을 노출시키지 않게 선언??
- 런타임 시점에 노출 / 의존 라이브러리를 수정해도 본 모듈까지만 재빌드
ex) A <- B <- C 의 구조에서 C에서는 A에 접근할 수 없고, A 수정 시 B까지만 재빌드한다
- compileOnly
- 컴파일 시점에 꼭 필요한 라이브러리
ex) Lombok - 컴파일 시에만 빌드하고 빌드 결과물에는 포함하지 않는다 -> 컴파일하면서 코드로 풀어짐
- 컴파일 시점에 꼭 필요한 라이브러리
- runtimeOnly
- 컴파일 시점에는 필요 없지만 런타임 시점에 필요한 라이브러리
ex) Loggin 관련 라이브러리, DB 관련 라이브러리
- 컴파일 시점에는 필요 없지만 런타임 시점에 필요한 라이브러리
- annotationProcessor : annotation processor를 명시하기 위해 사용
dependencies {
// JWT
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
//json
implementation 'org.json:json:20230227'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
compile project(':sub')
#==> 프로젝트 의존성을 사용하면 해당 프로젝트에서 다른 프로젝트의 의존성을 가져올 수 있다
runtime files('common.jar', 'system.jar')
#==>
#일반 jar파일의 경로를 적어주어 의존성을 추가할 수 있다.
#이렇게 하면 maven 중앙저장소나 사설저장소에 넣지 않고도 의존성을 추가 가능
}
tasks.named() :
tasks.named('test') {
useJUnitPlatform() // JUnit플랫폼을 이용하여 'test'라는 이름의 task를 추가한다
}
sourceSets{} :
mapper.xml 파일을 resuorces 폴더에 넣고 싶지 않을 때 사용
빌드 시 XML파일을 ClassPath에 포함시켜준
sourceSets {
main {
resources { // 리소스 파일을 찾는다.
srcDirs = ["src/main/java", "src/main/resources"] // 이 경로에서
includes = ["**/*.xml", "**/application.properties"] // 이 유형의 파일을
}
}
}
resources 하위는 package경로가 아닌 directory 경로로 접근하게 된다.
점(.)으로 패키지 간 구분이 안된다.
참조
gradle 파일 이해하기
개요 지금까지 build.gradle 파일을 사용해서 java와 spring 파일들을 빌드했지만, 구조를 정확히 알지 못하는 느낌을 받았다. 그래서 gradle 파일이 어떤식으로 구성되는지 공부해 보려고 한다. settings.g
hyunwook.dev