Spring

[Spring Boot] Gradle์ด๋ž€? Gradle ์˜์กด์„ฑ ์„ค์ •ํ•˜๊ธฐ

๋ฆผ ๋ฆผ 2020. 10. 6. 01:04
๋ฐ˜์‘ํ˜•

๐Ÿ˜ Gradle์ด ๋ญ์•ผ?

์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋นŒ๋“œ ํˆด์„ Maven๊ณผ Gradle ์ค‘์— ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์Šคํ”„๋ง ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋ถ€์ŠคํŠธ์ฝ”์Šค ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์ขŒ๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ฉด์„œ ์ปค๋ฆฌํ˜๋Ÿผ์— ๋”ฐ๋ผ Maven ๋นŒ๋“œ ํˆด์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์„ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ์ƒˆ๋กญ๊ฒŒ Gradle ๋นŒ๋“œ ํˆด๋„ ์‚ฌ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‘˜ ์‚ฌ์ด์— ํฐ ์ฐจ์ด๋Š” ๋Š๋ผ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Gradle์„ ์‚ฌ์šฉํ•˜๋‹ˆ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Maven์—์„œ ์‚ฌ์šฉํ•˜๋Š” XML์— ๋น„ํ•ด ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ์ฐจ์ด ์ •๋„๋งŒ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๋นŒ๋“œ ํˆด ์ค‘์— ์ œ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ Gradle์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. โœ๏ธ๐Ÿ™‚

 

Gradle์ด๋ž€?

Gradle์€ ์˜คํ”ˆ์†Œ์Šค ๋นŒ๋“œ ์ž๋™ํ™” ํˆด์ด๋‹ค. Gradle์€ ๊ฑฐ์˜ ๋ชจ๋“  ํƒ€์ž…์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•จ์„ ๊ฐ€์ง„๋‹ค.

 

Gradle์˜ ํŠน์ง•

1. High performance

Gradle์€ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•˜๋Š” task๋งŒ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ๋ถˆํ•„์š”ํ•œ ๋™์ž‘์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋˜, build cache๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ด์ „ ์‹คํ–‰์˜ task output์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๊ณ„์—์„œ๋„ build cache๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

2. JVM foundation

Gradle์€ JVM์—์„œ ์‹คํ–‰๋˜๊ณ , JVM์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JDK๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Java Standard API๋ฅผ ๋นŒ๋“œ ๋กœ์ง์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Gradle์„ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์‹คํ•ผํ•  ์ˆ˜ ์žˆ๋‹ค.

3. Conventions

Gradle์€ Maven์œผ๋กœ๋ถ€ํ„ฐ ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ฐจ์šฉํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ผ Java ํ”„๋กœ์ ํŠธ์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•˜๋‹ค๋ฉด ์ปจ๋ฒค์…˜์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ฑฐ๋‚˜ task๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ์ปจ๋ฒค์…˜ ๊ธฐ๋ฐ˜์˜ ๋นŒ๋“œ๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. Extensibility

Gradle์„ ํ™•์žฅํ•˜๋ฉด ๊ณ ์œ ์˜ task ํƒ€์ž…์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ชจ๋ธ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

5. IDE, Build Scan support

Android Studio, IntelliJ IDEA, Eclipse ๋“ฑ์˜ IDE์—์„œ Gradle์„ ์ž„ํฌํŠธํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” Build Scan์„ ์ง€์›ํ•œ๋‹ค.

 

Spring Boot ํ”„๋กœ์ ํŠธ์—์„œ Gradle

Gradle ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Gradle ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์ด ์ค‘์— Gradle ๊ด€๋ จ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋กœ ๊ฐ„์ถ”๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

โ”œโ”€ gradle
โ”‚       โ””โ”€ wrapper
โ”‚       โ”œโ”€ gradle-wrapper.jar
โ”‚       โ””โ”€ gradle-wrapper.properties
โ”œโ”€ gradlew
โ”œโ”€ gradlew.bat
โ”œโ”€ build.gradle
โ””โ”€ settings.gradle

  • gradlew
    ๋ฆฌ๋ˆ…์Šค ๋˜๋Š” ๋งฅOS์šฉ ์‹คํ–‰ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๋‹ค.
  • gradlew.bat
    ์œˆ๋„์šฐ์šฉ ์‹คํ–‰ ๋ฐฐ์น˜ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๋‹ค.
  • gradle-wrapper.jar
    JAR ํ˜•์‹์œผ๋กœ ์••์ถ•๋œ Wrapper ํŒŒ์ผ์ด๋‹ค. gradlew๋‚˜ gradlew.bat ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ ์•ˆ์— ์„ค์น˜๋˜๋Š” ์ด ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ Gradle task๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • gradle-wrapper.properties
    Gradle Wrapper ์„ค์ • ์ •๋ณด ํŒŒ์ผ์ด๋‹ค. Wrapper์˜ ๋ฒ„์ „ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • build.gradle
    ํ”„๋กœ์ ํŠธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ, ํ”Œ๋Ÿฌ๊ทธ์ธ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ €์žฅ์†Œ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๋‹ค.
  • settings.gradle
    ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์„ฑ ์ •๋ณด ํŒŒ์ผ์ด๋‹ค. ๋ฉ€ํ‹ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋“ˆํ™”ํ•  ๊ฒฝ์šฐ, ํ•˜์œ„ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ๊ด€๋ฆฌ

 

Gradle dependency overview

์˜์กด์„ฑ์€ ์ข…์ข… ๋ชจ๋“ˆ๋กœ ์ œ๊ณต๋˜๋Š”๋ฐ, ์ด ๋ชจ๋“ˆ๋“ค์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ณณ์„ repository๋ผ๊ณ  ํ•œ๋‹ค. repository๋Š” ๋กœ์ปฌ ์ €์žฅ์†Œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์›๊ฒฉ ์ €์žฅ์†Œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. Gradle์—๊ฒŒ ์–ด๋””์„œ ์˜์กด์„ฑ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ๊ฑด์ง€ ์•Œ๋ ค์ค˜์•ผ ํ•˜๋Š”๋ฐ, repository ์„ ์–ธ์„ ํ†ตํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

Gradle์€ ํŠน์ • task๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์˜์กด์„ฑ๋“ค์„ ๋Ÿฐํƒ€์ž„์‹œ์— ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋ฐ›๊ฑฐ๋‚˜ ๋กœ์ปฌ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค. ๋ฉ€ํ‹ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด ๊ณผ์ •์„ dependency resolution์ด๋ผ๊ณ  ํ•œ๋‹ค.

Gradle์€ ํ–ฅํ›„์— ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์˜์กด์„ฑ ํŒŒ์ผ๋“ค์„ dependency cache๋ผ๊ณ  ํ•˜๋Š” ๋กœ์ปฌ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์„ค์ •์€ build.gradle ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค. build.gradle ํŒŒ์ผ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”Œ๋Ÿฌ๊ทธ์ธ, ์ €์žฅ์†Œ, ์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” Groovy์™€ Kotlin ์–ธ์–ด๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ Groovy๋กœ ์ž‘์„ฑ๋œ๋‹ค.

plugins {
    id 'org.springframework.boot' version '2.3.2.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'com.lim'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.webjars:bootstrap:4.5.0'
    implementation 'org.webjars:jquery:3.5.1'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

1. Declaring repositories

repository์—๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. repository๋ฅผ ํ˜•์‹๊ณผ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ๋ถ„์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

  • Format์— ๋”ฐ๋ฅธ ๊ตฌ๋ถ„
    • Maven ๊ธฐ๋ฐ˜ ์ €์žฅ์†Œ(๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ์ด๋Š” Maven Central, JCenter, Google Android ๋“ฑ์ด ์žˆ๋‹ค.)
    • Ivy ๊ธฐ๋ฐ˜ ์ €์žฅ์†Œ
    • ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ ํ˜•์‹ ์ €์žฅ์†Œ
  • Connectivity์— ๋”ฐ๋ฅธ๊ตฌ๋ถ„
    • ์ธ์ฆ ์ฒด๊ณ„๊ฐ€ ๊ตฌ์„ฑ๋œ ์ €์žฅ์†Œ(BasicAuthentication, DigestAuthentication, HttpHeaderAuthentication๋“ฑ์˜ ์ธ์ฆ ์ฒด๊ณ„๊ฐ€ ์žˆ๋‹ค.)
    • HTTPS, SFTP, AWS S3, Google Cloud Storage ๋“ฑ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์›๊ฒฉ ํ”„๋กœํ† ์ฝœ๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ์ €์žฅ์†Œ

 

repositories {
    mavenCentral()
}

์œ„์˜ ์ฝ”๋“œ์—์„œ Gradle์ด ์˜์กด์„ฑ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ์ €์žฅ์†Œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
Maven Central ์ €์žฅ์†Œ์—์„œ ์˜์กด์„ฑ์„ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •๋˜์–ด์žˆ๋‹ค.

Gradle repository notation

๋งŒ์•ฝ Bintray JCenter, Google Android ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด jcenter(), google() ๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

2. Dependency Configuration

Gradle ํ”„๋กœ์ ํŠธ์—์„œ ์„ ์–ธ๋œ ๋ชจ๋“  ์˜์กด์„ฑ์€ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ์˜์กด์„ฑ์€ ์ปดํŒŒ์ผ ํ•  ๋•Œ์—๋งŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ์˜์กด์„ฑ์€ ๋Ÿฐํƒ€์ž„ํ•  ๋•Œ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์˜์กด์„ฑ์˜ ๋ฒ”์œ„๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์„ dependency configuration์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • Implementation: ๊ตฌํ˜„ํ•  ๋•Œ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • compileOnly: ์ปดํŒŒ์ผํ•  ๋•Œ์—๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ๋Ÿฐํƒ€์ž„ ๋•Œ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • runtimeOnly: ๋Ÿฐํƒ€์ž„ ๋•Œ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • testImplementation: ํ…Œ์ŠคํŠธํ•  ๋•Œ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.

3. Declaring Dependencies

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.webjars:bootstrap:4.5.0'
    implementation 'org.webjars:jquery:3.5.1'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

์ด ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•  ์˜์กด์„ฑ์„ configuration๊ณผ ํ•จ๊ป˜ ์„ ์–ธํ•ด์ค€๋‹ค. Spring Boot์—์„œ๋Š” starter์„ ํ†ตํ•ด ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ๋”ฐ๋ผ์„œ starter๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ฒ„์ „์„ ๋”ฐ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

reference

๋ฐ˜์‘ํ˜•