[SpringBoot] gradle 설정
by 핫도구오늘은 gradle 설정에 대해 알아 볼 예정이다. gradle 설정 중 가장 중요하다고 생각되는 부분인 build.gradle 혹은 build.gradle.kts 중 후자의 것을 예로 들어 알아 볼 예정이다.
여기에서 가장 크게 나뉘는 것은 plugins, 프로젝트 메타데이터, configurations, repositories, dependencies, tasks, sources sets 등이 존재한다. 또한, 이들에게서는 항상 필수적인 설정이 존재하지만 선택적으로 진행되는 설정 또한 존재한다. 하지만 기본 구조 또한 존재하는데 기본구조는 아래와 같다.
plugins { } // 1. 플러그인 선언
repositories { } // 2. 저장소 설정
dependencies { } // 3. 의존성 관리
tasks { } // 4. 태스크 설정
plugins
plugins에는 기본적으로 필수적으로 설정해야하는 java 프로젝트 기본 기능설정, springboot 설정, 의존성 버전 설정이 꼭 들어가야 하며 이 코드는 아래와 같다.
plugins {
id("java")
id("org.springframework.boot") version "3.2.0"
id("io.spring.dependency-management") version "1.1.4"
}
이뿐 아니라 kotlin 지원, 코드 품질 관련, Docker 관련 설정은 선택적으로 사용하면 되며 코드는 아래와 같다.
plugins {
// Kotlin 지원
kotlin("jvm") version "1.9.21"
kotlin("plugin.spring") version "1.9.21"
// 코드 품질
id("org.sonarqube") version "4.4.1.3373"
id("jacoco")
// Docker
id("com.google.cloud.tools.jib") version "3.4.0"
}
물론, 더 많은 선택지가 존재하지만, 너무 많기 때문에 조금만 추렸다.
repositories
의존성(라이브러리)을 다운로드할 저장소를 지정한다. 대부분의 Java 라이브러리는 Maven Central에 있다. 그래서 이를 저장할 중앙 저장소를 필수로 지정하고 필요하다면 추가로 저장소를 추가할 수 있으며 코드는 아래와 같다.
repositories {
mavenCentral() // Maven 중앙 저장소 (필수)
// 필요시 추가 저장소
google() // Android 관련
maven { url = uri("https://repo.spring.io/milestone") } // Spring Milestone
}
프로젝트 메타데이터
기본설정은 group, version, descripton으로 나눌 수 있으며 group은 프로젝트를 만든 조직, 회사 또는 그룹을 식별하는 고유한 이름이며 version은 프로젝트의 현재 릴리스 버전을 이야기한다. descripton은 프로젝트가 어떤 역할을 하는지에 대한 간략한 설명이고 java 버전에 대한 설정도 해주면 아래와 같다.
group = "com.example"
version = "1.0.0-SNAPSHOT"
description = "프로젝트 설명"
java {
sourceCompatibility = JavaVersion.VERSION_17
}
추가적인 설정은 JavaDoc, Sources JAR 생성, 특정 JDK 강제, 인코딩 설정 등이 들어갈 수 있다. 이 예로는 아래와 같다.
java {
// JavaDoc, Sources JAR 생성
withJavadocJar()
withSourcesJar()
// 특정 JDK 강제
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
// 인코딩 설정
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
options.compilerArgs.add("-parameters")
}
의존성 관리
여기에는 굉장히 많은 것들이 들어갈 수 있으며 pom.xml에서도 굉장히 많은 의존성을 관리했음을 필자는 알 수 있다.
이 중 기본적으로 사용하는 Rest API, JPA, 인증/인가, Bean Validation, 데이터베이스, lombok, QueryDSL, API 문서, 테스트 등등을 관리할 수 있다.
아래는 Spring Boot Starter의 기본 설정들이다.
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-validation")
}
아래는 각각 인메모리DB, MYSQL, PostegreSQL, MariaDB에 대한 설정이다.
dependencies {
runtimeOnly("com.h2database:h2")// 인메모리 DB
runtimeOnly("com.mysql:mysql-connector-j")// MySQL
runtimeOnly("org.postgresql:postgresql")// PostgreSQL
runtimeOnly("org.mariadb.jdbc:mariadb-java-client")// MariaDB
}
아래는 lombok을 통한 반복적인 코드 작성을 안해도 되는 springboot코드이다.
configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}
dependencies {
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
}
아래는 DevTools (자동 재시작)이 되는 코드이다.
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
이 외에도 QueryDSL, SwaggerUI를 사용하는 API문서화, 테스트 할 수 있는 코드는 아래와 같다.
val queryDslVersion = "5.0.0"
dependencies {
implementation("com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta")
implementation("com.querydsl:querydsl-core:${queryDslVersion}")
annotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}:jakarta")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")
annotationProcessor("jakarta.persistence:jakarta.persistence-api")
}
// Q클래스 생성 위치 설정
sourceSets {
main {
java {
srcDirs("build/generated/sources/annotationProcessor/java/main")
}
}
}
dependencies {
// Swagger UI 자동 생성
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0")
}
dependencies {
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
// TestContainers (실제 DB로 테스트)
testImplementation("org.testcontainers:testcontainers:1.19.3")
testImplementation("org.testcontainers:mysql:1.19.3")
}
tasks.withType<Test> {
useJUnitPlatform()
}
추가기능
추가기능에는 대표적으로 JWT인증, 이메일, 캐싱, 모니터링 등이 존재한다. 아래 코드들은 각각 JWT인증, 이메일, 캐싱, 모니터링을 나타낸다.
dependencies {
// JWT 인증
implementation("io.jsonwebtoken:jjwt-api:0.12.3") // JWT 인터페이스
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3") // JWT 구현체
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3") // JSON 처리
// 이메일
implementation("org.springframework.boot:spring-boot-starter-mail")
// 캐싱
implementation("org.springframework.boot:spring-boot-starter-cache") // Spring 캐시 추상화
implementation("com.github.ben-manes.caffeine:caffeine") // 고성능 캐시 구현체
// 모니터링
implementation("org.springframework.boot:spring-boot-starter-actuator") // 애플리케이션 모니터링
implementation("io.micrometer:micrometer-registry-prometheus") // 메트릭 수집/저장
}
이를 통해 사용자 인증, 인증 메일 발송, 반복 조회 성능 향상, 실시간 모니터링 시스템을 활용할 수 있다.
빌드, 실행
아래 코드는 JAR 빌드에 관한 것이다.
tasks.jar {
enabled = false // plain jar 비활성화
}
tasks.bootJar {
enabled = true
archiveFileName = "${project.name}-${project.version}.jar"
}
아래 코드는 프로파일별 실행에 관한 코드이다.
tasks.bootRun {
args("--spring.profiles.active=local")
jvmArgs = listOf("-Xmx2g", "-XX:+UseG1GC")
}
gradle 명령어
기본적으로 4가지 빌드, 실행, 테스트, 클린 명령어를 자주사용하며 추가적인 명령어 또한 존재하지만 현재는 기본적인 명령어만 생각할 것이다.. 아래에는 기본 명령어이다.
// 빌드
./gradlew build // mac
gradlew build // window
// 프로젝트 컴파일 + 테스트실행 + JAR 파일 생성
// build/libs/ 폴더에 실행 가능한 JAR 생성
// 실행
./gradlew bootRun // mac
gradlew booRun // window
// Spring Boot 애플리케이션 직접 실행
// 개발 중 테스트용으로 사용
// 테스트
./gradlew test // mac
gradlew test // window
// /src/test 폴더의 모든 테스트 코드 실행
// build/reports/tests에 결과 리포트 생성
// 클린
./gradlew clean // mac
gradlew clean // window
// build 폴더 전체 삭제
// 이전 빌드 결과물 제거하여 깨끗한 상태에서 시작
여기까지 gradle 설정에 대해 알아봤다. 이를 기반으로 프로젝트를 시작하고 필요에 따라 기능을 추가하면 된다.
'JAVA > SPRING&SPRINGBOOT' 카테고리의 다른 글
| [SpringBoot] Spring MVC의 핵심, Controller와 요청 처리 (0) | 2025.11.03 |
|---|---|
| [SpringBoot] 애노테이션(Annotation) (0) | 2025.10.30 |
| [SpringBoot] 프로젝트 구조 알아보기 (0) | 2025.10.23 |
| [SpringBoot] application.properties, application.yml (0) | 2025.10.20 |
| [SpringBoot] maven VS gradle (0) | 2025.10.10 |
블로그의 정보
AquaMan
핫도구