[Spring Boot] build.gradle 정리

[Spring Boot] build.gradle 정리

Last Updated: 2025년 07월 05일

개인적으로 만든 사이트의 build.gradle 최종 설정 내용

plugins {
	id 'org.springframework.boot' version '3.5.3'
	id 'io.spring.dependency-management' version '1.1.7'
	id 'java'
	id 'jacoco'
	id "org.asciidoctor.jvm.convert" version "4.0.4"
}

group = 'kr.narrator'
version = "0.0.1-${new Date().format('yyyyMMdd_HHmm')}"

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(21)
	}
}

repositories {
	mavenCentral()
}

ext {
	JJWT_VERSION = "0.12.6"
	queryDslVersion = "5.1.0"
	snippetsDir = file("build/generated-snippets")
}

configurations {
	compileOnly { extendsFrom annotationProcessor }
	asciidoctorExt
}

dependencies {
	// Spring Boot Core
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-aop'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-cache'
	implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
	implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'

	// Optional Infra
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
	implementation 'org.springframework.boot:spring-boot-starter-mail'
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
	implementation 'io.micrometer:micrometer-registry-prometheus'
	implementation 'org.springframework.boot:spring-boot-starter-websocket'
	implementation 'org.springframework.boot:spring-boot-starter-webflux'

	// AWS (확장 시 별도 모듈로 분리 고려)
	implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

	// DB & JWT
	runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
	implementation "io.jsonwebtoken:jjwt-api:${JJWT_VERSION}"
	runtimeOnly "io.jsonwebtoken:jjwt-impl:${JJWT_VERSION}"
	runtimeOnly "io.jsonwebtoken:jjwt-gson:${JJWT_VERSION}"

	// https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-core
	//implementation 'org.springframework.ai:spring-ai-core:1.0.0-M6'

	// Swagger / OpenAPI
	implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9'

	// QueryDSL
	implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta"
	annotationProcessor(
			"jakarta.persistence:jakarta.persistence-api",
			"jakarta.annotation:jakarta.annotation-api",
			"com.querydsl:querydsl-apt:${queryDslVersion}:jakarta"
	)

	// MapStruct
	implementation 'org.mapstruct:mapstruct:1.6.3'
	annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3'
	annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'

	// Utils
	implementation 'org.jsoup:jsoup:1.20.1'

	// Java 8 Date and Time 타입 (LocalDateTime 등) JSON 직렬화를 위한 Jackson 모듈 추가
	implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'

	// Spring REST Docs
	asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor'
	testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'

	// Lombok
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	// Caffeine 캐시
	implementation 'com.github.ben-manes.caffeine:caffeine:3.2.0'

	// Testing
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

// QueryDSL 설정
def generatedDir = layout.buildDirectory.dir("src/main/generated")

tasks.withType(JavaCompile).configureEach {
	options.compilerArgs << "-parameters"
	options.generatedSourceOutputDirectory.set(generatedDir)
}

sourceSets.main.java.srcDirs += generatedDir

tasks.named('clean') {
	doFirst {
		delete generatedDir
	}
}

// Test & Docs
test {
	useJUnitPlatform()
	outputs.dir snippetsDir
	finalizedBy jacocoTestReport
}

// Jacoco 설정
jacoco {
	toolVersion = "0.8.13"
}

tasks.named('jacocoTestReport') {
	reports {
		html.required.set(true)
		xml.required.set(false)
		csv.required.set(false)
	}
}

tasks.named('asciidoctor') {
	inputs.dir snippetsDir
	configurations 'asciidoctorExt'
	sources { include("**/index.adoc") }
	baseDirFollowsSourceFile()
	dependsOn test
}

tasks.named('bootJar') {
	dependsOn asciidoctor
	from("${asciidoctor.outputDir}") {
		into 'static/docs'
	}
}

// 테스트 코드를 제외한 빌드 수행 또는 gradle build -x test
tasks.withType(Test) {
	enabled = false
}

You may also like