Gradle 빌드 스크립트 기본¶
PHASE 1 | 개발 환경 & 도구
키워드:build.gradle,plugins,dependencies,implementation,testImplementation,runtimeOnly,DSL,증분 빌드,빌드 캐시
Gradle이란?¶
Spring Boot 프로젝트를 빌드하고 의존성을 관리하는 도구.
Maven과 함께 Java 생태계에서 가장 많이 쓰이며, 요즘 Spring Boot 프로젝트는 대부분 Gradle을 사용한다.
build.gradle 핵심 구조¶
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.0'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'com.mysql:mysql-connector-j'
}
plugins vs dependencies¶
| plugins | dependencies | |
|---|---|---|
| 역할 | Gradle(빌드 도구) 자체에 기능 추가 | 애플리케이션 코드 실행에 필요한 라이브러리 |
| 비유 | 공장 설비 | 제품 재료 |
| 예시 | Spring Boot 플러그인 → bootJar 명령어 활성화 |
spring-boot-starter-web → @RestController 사용 가능 |
Spring Boot 플러그인은 Gradle이 Spring Boot 앱을 빌드하는 방법을 알게 해준다.
Spring Boot 스타터는 내 코드가 동작할 때 실제로 필요한 라이브러리다.
비유: plugins는 공장 설비, dependencies는 제품 재료.
설비(plugins)는 공장이 돌아가기 위한 것이고, 재료(dependencies)는 실제 제품을 만들기 위한 것이다.
dependencies 키워드 3가지¶
implementation¶
- 컴파일 시점 + 런타임 시점 모두 필요한 라이브러리
- 내 코드에서 직접
import해서 사용하는 것들 - 예:
spring-boot-starter-web,spring-boot-starter-data-jpa
testImplementation¶
- 테스트 코드에서만 사용하는 라이브러리
- 실제 배포 파일(jar)에는 포함되지 않음
- 예:
spring-boot-starter-test(JUnit5, Mockito 포함)
runtimeOnly¶
- 코드 작성 시에는 불필요하지만 실행 시점에 반드시 필요한 라이브러리
- 코드에서 직접
import하지 않음 - 예:
mysql-connector-j(MySQL 드라이버)
왜 MySQL 드라이버가 runtimeOnly인가?
내 코드는 JDBC 인터페이스를 통해 DB에 접근한다. MySQL 드라이버를 직접 import하지 않지만,
실행 시 실제 MySQL 연결이 필요하므로 그때 드라이버가 필요하다.
Task란?¶
Task는 Gradle이 수행하는 작업 단위다.
예를 들어 compileJava, test, build, bootRun 같은 명령이 모두 task다.
build: 프로젝트 빌드test: 테스트 실행bootRun: Spring Boot 애플리케이션 실행
Gradle은 여러 task를 조합해서 빌드 과정을 수행한다.
DSL이란?¶
DSL(Domain Specific Language)은 특정 목적에 특화된 언어다.
Gradle은 빌드 스크립트 작성을 위해 Groovy 또는 Kotlin 기반의 DSL을 사용한다.
| Groovy DSL | Kotlin DSL | |
|---|---|---|
| 파일명 | build.gradle |
build.gradle.kts |
| 타입 | 동적 타입 | 정적 타입 |
| 자동완성 / 오류 감지 | 약함 | 강함 |
| 트렌드 | 기존 프로젝트 | 신규 프로젝트 |
XML(Maven)과 비교하면 같은 의존성을 훨씬 간결하게 표현할 수 있다.
// Gradle DSL
implementation 'org.springframework.boot:spring-boot-starter-web'
<!-- Maven XML -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Gradle vs Maven 비교¶
| Gradle | Maven | |
|---|---|---|
| 스크립트 형식 | Groovy / Kotlin DSL | XML |
| 가독성 | 높음 | 낮음 (XML 장황함) |
| 빌드 속도 | 빠름 (증분 빌드, 캐시 지원) | 상대적으로 느림 |
| 현재 트렌드 | Spring Boot 프로젝트 표준 | 레거시 프로젝트에 많음 |
증분 빌드 (Incremental Build)¶
전체를 다시 빌드하지 않고 변경된 부분만 빌드한다.
Maven은 기본적으로 매번 전체를 다시 빌드하기 때문에 프로젝트가 커질수록 속도 차이가 커진다.
빌드 캐시 (Build Cache)¶
한 번 빌드한 결과를 저장해뒀다가 동일한 입력이면 다시 빌드하지 않고 캐시에서 가져온다.
팀 단위 개발에서 특히 효과적이다.
증분 빌드와 빌드 캐시는 별개의 기능이다.
증분 빌드는 "변경된 것만 빌드", 캐시는 "동일한 입력이면 빌드 자체를 생략".