ejyoo's 개발 노트

[Spring Boot 3.1.4] build.gradle 에 대한 정리 본문

BackEnd/Spring Boot

[Spring Boot 3.1.4] build.gradle 에 대한 정리

ejyoovV 2023. 9. 30. 12:50

본 글은 spring boot 기반의 Java 프로젝트를 처음 접하면서

build.gradle라는 파일에 들어가는 Gradle 빌드 스크립트에 대해서 정리하였다

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

repositories {
    mavenCentral() // 중앙 Maven 저장소 사용 지시 (Maven Central Repository)
}

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

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}



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'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'com.mysql:mysql-connector-j'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // QueryDSL Implementation
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

test {
    useJUnitPlatform()
}

/**
 * QueryDSL Build Options
 */
def querydslDir = "src/main/generated"

sourceSets {
    main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile) {
    options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

clean.doLast {
    file(querydslDir).deleteDir()
}

 

플러그인 추가

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

- id 'java' : Java 프로젝트를 위한 기본 Gradle 플러그인

- id 'org.springframework.boot' : Spring Boot의 Gradle 플러그인. Spring Boot 프로젝트의 생성, 실행 등을 지원

- id 'io.spring.dependency-management' : Spring 프로젝트의 의존성 버전을 자동으로 관리해주는 플러그인

 

저장소 설정

repositories {
   mavenCentral()
}

- mavenCentral() : 중앙 Maven 저장소를 사용하여 의존성을 획득

 

프로젝트 메타데이터 설정

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

 

Java 버전 설정

프로젝트가 Java 17 버전과 호환된다는 설정

java {
   sourceCompatibility = '17'
}

 

의존성 추가1

- 주요 Spring Boot 스타터 관련 의존성, Lombok, H2 데이터 베이스, MySQL 커넥터 포함

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'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'com.mysql:mysql-connector-j'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

의존성 추가2

QueryDSL 을 사용하기 위한 의존성 설정 부분

QueryDSL : JPA 엔터티를 기반으로 타입 세이프한 쿼리를 작성할 수 있게 하는 프레임워크

dependencies {
    // QueryDSL Implementation
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

com.querydsl:querydsl-jpa:5.0.0:jakarta

― QueryDSL 의 JPA 모듈을 위한 의존성

― Jakarta 는 Jakarta Persistence (JPA 2.2 이후의 버전)를 의미함. 이는 Java EE의 JPA 스펙과의 차이점을 나타내기 위함.

 

com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta

― APT (Annotaion Processing Tool) 모듈을 위한 의존성.

― APT 는 Annotaion을 기반으로 코드를 생성하기 위한 도구임.

― QueryDSL은 APT를 사용하여 JPA 엔터티에 기반한 Q-클래스를 생성함.

― Q-클래스는 QueryDSL 쿼리를 작성할 때 사용되는 타입 세이프한 클래스임.

― Gradle의 dependencyManagement 플러그인에서 가져온 QueryDSL 버전을 나타냄. 실제로 querydsl.version은 특정 QueryDSL 버전 문자열로 치환될 예정임.

 

jakarta.annotation:jakarta.annotaion-api

― jakarta Annotaions API 에 대한 의존성임. 

― Java의 기본 Annotaion들 (ex: @Override, @Deprecated 등) 이외의 추가적인 Annotaion을 제공

 

jakarta.persistence:jakarta.persistence-api

― Jakarta Persistence (JPA) API에 대한 의존성임.

― QueryDSL은 이 API를 사용하여 엔터티와 상호 작용을 구성함.

 

annotationProcessor

― 빌드 시간에 코드 생성 / 코드 검사 작업 수행하기 위해 사용

― 위의 코드에서는 QueryDSL의 Q-클래스를 생성하기 위해 해당 의존성들이 Annotaion Processor로 지정됨.

 

애노테이션 프로세서 구성

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

― Gradle에서 configurations 블록은 프로젝트의 의존성 그룹 (의존성 설정) 을 정의하고 구성하는데 사용

- compileOnly

― 프로젝트의 컴파일 시간에만 필요한 의존성을 나타냄 (런타임에서는 미포함)

― ex) Lombok : 소스코드 컴파일 시 Annotaion을 기반으로 코드 생성 / 런타임에는 이러한 추가 코드가 필요하지 않음.

- extendsFrom

― compileOnly가 다른 의존성인 annotaionProcessor로 부터 의존성을 상속받도록 함.

― annotaionProcessor 는 APT 를 위한 의존성을 나타냄. 이 설정을 통해 QueryDSL, Lomebok 과 같은 Annotaion Processor의 의존성을 정의할 수 있음.

― compileOnly 의존성 그룹에 annotaionProcessor의 의존성을 포함시키는 코드.

― Annotaion Processor를 컴파일 시간에만 사용할 수 있게 됨, 이 의존성들은 최종 생성된 아티팩트(JAR 파일)에는 포함하지 않음.

 

테스트 설정

JUnit 5를 사용하도록 Gradle에 지시

 test {
   useJUnitPlatform()
}

Gradle 빌드 스크립트 내에서 test 작업의 행동을 구성 / Gradle의 기본적인 작업

 프로젝트 내의 테스트 코드를 실행하는데 사용

Java 프로젝트에서 JUnit 또는 TestNG와 같은 테스트 프레임워크를 사용하여 테스트 코드를 작성하고 실행

useJUnitPlatform() : 'test' 작업이 JUnit5을 사용하여 테스트를 실행하도록 구성. (JUnit Jupiter 테스트 엔진 사용)

 

QueryDSL 빌드 옵션

QueryDSL 코드 생성에 필요한 Gradle 설정 

QueryDSL 은 JPA 엔터티를 기반으로 type safe한 쿼리를 작성할 수 있도록 도움을 주는 프레임워크

아래의 코드는

Q-클래스를 생성하기위한 디렉터리를 정의하고

해당 디렉터리를 Java 소스 디렉터리로 추가하며 

Q-클래스를 생성할 위치를 설정하고

빌드 출력을 정리할 때 생성된 Q-클래스를 삭제하도록 구성됨.

def querydslDir = "src/main/generated"
sourceSets {
   main.java.srcDirs += [ querydslDir ]
}
tasks.withType(JavaCompile) {
   options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}
clean.doLast {
   file(querydslDir).deleteDir()
}

- def querydslDir = "src/main/generated

querydslDir 변수는 QueryDSL에 의해 생성된 코드(Q-클래스)가 저장될 디렉터리의 경로를 정의.

 

- sourceSets 설정

sourceSets은 프로젝트의 소스코드와 리소스를 어디서 가져올지 구성함

main 소스 세트의 java 소스 디렉터리에 querydslDir을 추가하도록 설정함. Gradle은 이 디렉터리에 있는 QueryDSL로 생성된 Q-클래스를 일반 Java클래스처럼 컴파일함.

 

- tasks.withType(JavaCompile)

모든 JavaCompile 유형의 작업 (Java 소스코드를 컴파일하는 작업)에 대해 코드 생성 디렉터리를 querydslDir 로 설정함.

QueryDSL 의 Annotaion Processor 가 Q-클래스를 생성할 때 해당 디렉터리에 파일을 출력

 

- clean.doLast 설정

빌드 출력을 정리하는 기본 Gradle 작업임

clean 작업이 실행된 후 querydslDir 디렉터리를 삭제하도록 추가적인 작업을 정의함. (빌드를 깔끔하게 정리하기 위함)