Gradle

์„ค์น˜ ๋ฐฉ๋ฒ•

SDKMAN์„ ํ†ตํ•œ ์„ค์น˜ (๊ถŒ์žฅ)

sdk install gradle

macOS์—์„œ ์„ค์น˜

brew install gradle

Windows์—์„œ ์„ค์น˜

choco install gradle
scoop install gradle

์ˆ˜๋™ ์„ค์น˜

  1. Gradle ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ ์ตœ์‹  ๋ฒ„์ „ ๋‹ค์šด๋กœ๋“œ
  2. ์••์ถ• ํ•ด์ œ ํ›„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ PATH์— bin ๋””๋ ‰ํ† ๋ฆฌ ์ถ”๊ฐ€

๊ธฐ๋ณธ ๋ช…๋ น์–ด

# ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ
gradle build

# ํ…Œ์ŠคํŠธ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋นŒ๋“œ
gradle build -x test

# Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
gradle bootRun

# Gradle Wrapper ์‚ฌ์šฉ (๊ถŒ์žฅ)
./gradlew build
./gradlew bootRun

ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

์ƒˆ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” (๊ถŒ์žฅ)

# ์ƒˆ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir my-project
cd my-project

# Gradle ์ดˆ๊ธฐํ™” (๋Œ€ํ™”ํ˜•)
gradle init

์ˆ˜๋™์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

mkdir basic-demo
cd basic-demo
touch build.gradle

Gradle ํƒœ์Šคํฌ ํ™•์ธ

# ๋ชจ๋“  ํƒœ์Šคํฌ ๋ณด๊ธฐ
gradle tasks --all

# ๊ธฐ๋ณธ ํƒœ์Šคํฌ ๋ณด๊ธฐ
gradle tasks

์˜์กด์„ฑ ๋ฒ”์œ„ (Dependency Scope)

build.gradle ์˜ˆ์ œ

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

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

์ปค์Šคํ…€ ํƒœ์Šคํฌ ์ •์˜

// ํŒŒ์ผ ๋ณต์‚ฌ ํƒœ์Šคํฌ
task copy(type: Copy) {
    from 'src'
    into 'dest'
}

// ZIP ํŒŒ์ผ ์ƒ์„ฑ ํƒœ์Šคํฌ
task zip(type: Zip) {
    from 'src'
    archiveFileName = 'archive.zip'
}

Gradle Daemon

๋ฐ๋ชฌ ์ƒํƒœ ํ™•์ธ

# ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  Gradle ๋ฐ๋ชฌ ์ƒํƒœ ํ™•์ธ
gradle --status

๋ฐ๋ชฌ ์ค‘์ง€ ๋ฐฉ๋ฒ•

# ๋ชจ๋“  Gradle ๋ฐ๋ชฌ ์ค‘์ง€
gradle --stop

# ํŠน์ • ํ”„๋กœ์„ธ์Šค ID๋กœ ๋ฐ๋ชฌ ์ค‘์ง€ (Linux/macOS)
kill -9 <PID>

# ์‹คํ–‰ ์ค‘์ธ Gradle ๋ฐ๋ชฌ ์ฐพ๊ธฐ (Linux/macOS)
ps -ef | grep gradle

# ์‹คํ–‰ ์ค‘์ธ Gradle ๋ฐ๋ชฌ ์ฐพ๊ธฐ (Windows)
tasklist | findstr gradle

๋ฐ๋ชฌ ์„ค์ •

gradle.properties ํŒŒ์ผ์— ๋‹ค์Œ ์„ค์ • ์ถ”๊ฐ€:

# ๋ฐ๋ชฌ ๋น„ํ™œ์„ฑํ™” (ํ•ญ์ƒ ์ƒˆ ํ”„๋กœ์„ธ์Šค์—์„œ ๋นŒ๋“œ ์‹คํ–‰)
org.gradle.daemon=false

# ๋ฐ๋ชฌ JVM ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError

๋ฐ๋ชฌ ์ž๋™ ์ข…๋ฃŒ

# ๋ฐ๋ชฌ ์œ ํœด ์‹œ๊ฐ„ ์„ค์ • (๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„, ์˜ˆ: 1์‹œ๊ฐ„)
org.gradle.daemon.idletimeout=3600000

๋ฐ๋ชฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

Gradle Wrapper (๊ถŒ์žฅ)

gradle wrapper
gradle wrapper --gradle-version=8.7
./gradlew build  # Linux/macOS
gradlew.bat build  # Windows

์ปค์Šคํ…€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •

repositories {
    mavenCentral()
    
    maven {
        url 'https://repo.mycompany.com/maven2'
        credentials {
            username = 'username'
            password = 'password'
        }
    }
    
    // JCenter๋Š” ๋” ์ด์ƒ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ
    // jcenter()
}

๋ช…๋ น์ค„ ์ธ์ž ์ „๋‹ฌ

# Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ธ์ž ์ „๋‹ฌ
./gradlew bootRun --args='--server.port=9090 --spring.profiles.active=dev'

๋ฉ€ํ‹ฐ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

// settings.gradle
rootProject.name = 'my-project'
include 'app', 'library'

// root build.gradle
allprojects {
    repositories {
        mavenCentral()
    }
}

subprojects {
    apply plugin: 'java'
    
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
    }
}

Gradle vs Maven ๋น„๊ต

ํŠน์„ฑ Gradle Maven
๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ Groovy ๋˜๋Š” Kotlin DSL (๊ฐ„๊ฒฐํ•˜๊ณ  ์œ ์—ฐํ•จ) XML (์ƒ๋Œ€์ ์œผ๋กœ ์žฅํ™ฉํ•˜๊ณ  ๊ฒฝ์ง๋จ)
์„ฑ๋Šฅ ์ฆ๋ถ„ ๋นŒ๋“œ, ๋นŒ๋“œ ์บ์‹œ, ๋ณ‘๋ ฌ ์‹คํ–‰์œผ๋กœ ๋” ๋น ๋ฆ„ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
์˜์กด์„ฑ ๊ด€๋ฆฌ ๋™์  ๋ฒ„์ „, ์ „์ด์  ์˜์กด์„ฑ ์ œ์™ธ, ์„ธ๋ฐ€ํ•œ ์ œ์–ด ์ค‘์•™ ์ €์žฅ์†Œ, ์ „์ด์  ์˜์กด์„ฑ ๊ด€๋ฆฌ
์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋งค์šฐ ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์ด ์žˆ์ง€๋งŒ ๋œ ์œ ์—ฐํ•จ
ํ•™์Šต ๊ณก์„  ๋” ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„  (์œ ์—ฐ์„ฑ์œผ๋กœ ์ธํ•ด) ์ƒ๋Œ€์ ์œผ๋กœ ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›€
IDE ์ง€์› ์ฃผ์š” IDE์—์„œ ์ง€์› ์ฃผ์š” IDE์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ง€์›
์ปค๋ฎค๋‹ˆํ‹ฐ ์„ฑ์žฅ ์ค‘์ด์ง€๋งŒ Maven๋ณด๋‹ค ์ž‘์Œ ์˜ค๋žœ ์—ญ์‚ฌ์™€ ํฐ ์ปค๋ฎค๋‹ˆํ‹ฐ
์ ํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ๋ณต์žกํ•˜๊ณ  ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ, ์ปค์Šคํ…€ ๋นŒ๋“œ ๋กœ์ง ํ‘œ์ค€์ ์ธ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์ ํŠธ

Gradle์˜ ์žฅ์ 

Maven์˜ ์žฅ์ 

์ „ํ™˜ ๊ณ ๋ ค์‚ฌํ•ญ

Maven์—์„œ Gradle๋กœ ์ „ํ™˜์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด:

์ฐธ๊ณ  ์ž๋ฃŒ

What Else?
inflearn react api server -50% ํ• ์ธ์ฟ ํฐ: 20652-ab1f1cd4c373 buy me a coffee