본문 바로가기

세미나

Maven 프로젝트 Gradle로 변환하기

728x90

안녕하세요. 유저인사이트 박태양입니다.

저희는 프로젝트 빌드 도구로 Maven을 사용하고 있습니다. 학습비용이 없다는 점이 가장 큰 이유였는데요,
Gradle이 성능 및 가독성 면에서 Maven 보다 뛰어난것 같아 이번 기회에 도입해보려고 합니다.

빌드 속도 비교 (소스파일 약 100개 기준)


주로 사용하게 되는 clean compile 기능에서 큰 성능차이를 보여줍니다.
점유율은 아직 Maven이 더 높은 것 같습니다. (관련 저작권이 없어 링크로 대체합니다.)


실습을 통해 Gradle 설치 및 적용방법을 알아보도록 하겠습니다.

Gradle 홈페이지에서 Gradle 설치파일을 받아, C:\Gradle 경로에 압축을 풀고,
시스템 환경 변수에서 Path를 추가하여 설치를 완료합니다. (C:\Gradle\gradle-7.6\bin)
정상적으로 설치되었다면 gradle -v 명령어를 통해 설치된 버전을 확인할 수 있습니다.

 

PS C:\Users\Userinsight\IdeaProjects\test-Billing> gradle init
Starting a Gradle Daemon (subsequent builds will be faster)

Found a Maven build. Generate a Gradle build from this? (default: yes) [yes, no] yes

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] no

> Task :init
Maven to Gradle conversion is an incubating feature.
Get more help with your project: https://docs.gradle.org/7.6/userguide/migrating_from_maven.html

BUILD SUCCESSFUL in 21s
2 actionable tasks: 2 executed

 

프로젝트의 pom.xml 파일이 있는 경로에서 gradle init 명령어를 통해 마이그레이션을 진행할 수 있습니다.
Maven 빌드 파일을 기반으로 생성하고, 스크립트 언어는 Groovy를 사용하도록 하겠습니다.

정상적으로 진행되었다면 build.gradle, setting.gradle 파일이 생성되고

IntelliJ 기준 우측 하단에 Load Gradle 버튼이 나타납니다.

 

/*
 * This file was generated by the Gradle 'init' task.
 */

plugins {
    id 'java-library'
    id 'maven-publish'
}

repositories {
    mavenLocal()
    maven {
        url = uri('https://repo.maven.apache.org/maven2/')
    }
}

dependencies {
    api 'org.springframework.boot:spring-boot-starter-data-jpa:2.5.6'
    api 'org.springframework.boot:spring-boot-starter-jdbc:2.5.6'
    api 'org.springframework.boot:spring-boot-starter-thymeleaf:2.5.6'
    api 'org.springframework.boot:spring-boot-starter-web:2.5.6'
    api 'org.springframework.boot:spring-boot-starter-security:2.5.6'
    api 'org.springframework.boot:spring-boot-starter-validation:2.5.6'
    ...
    api 'org.jxls:jxls-poi:2.10.0'
    api 'org.jxls:jxls-reader:2.0.6'
    runtimeOnly 'org.postgresql:postgresql:42.2.24'
    compileOnly 'com.querydsl:querydsl-apt:4.4.0'
}

group = 'group'
version = '0.0.1-SNAPSHOT'
description = 'description'
java.sourceCompatibility = JavaVersion.VERSION_11

publishing {
    publications {
        maven(MavenPublication) {
            from(components.java)
        }
    }
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

tasks.withType(Javadoc) {
    options.encoding = 'UTF-8'
}

생성된 build.gradle 파일입니다.

우측 Gradle Task 에서 classes를 클릭하면 컴파일을 진행할 수 있습니다.

 

error: cannot find symbol ...


최초 컴파일 시 Q클래스 관련 오류가 뜨는데요, Querydsl 사용을 위해 별도의 작업이 필요합니다.
build.gradle 파일에 아래 플러그인 및 코드를 추가합니다. (코드 출처 : 인프런)

 

id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
   jpa = true
   querydslSourcesDir = querydslDir
}
sourceSets {
   main.java.srcDir querydslDir
}
compileQuerydsl{
   options.annotationProcessorPath = configurations.querydsl
}
configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
   querydsl.extendsFrom compileClasspath
}


추후 컴파일 시에 지정된 경로에 QClass 파일이 생성되도록 해주는 코드입니다.

 

수정 후 다시 컴파일해보니, get 메서드 관련 오류가 발생하였습니다.

Lombok 플러그인의 @Getter가 제대로 동작하지 않은것인데요,
아래 디펜던시를 추가하여 Lombok이 정상 동작하도록 설정해줍니다.

 

compileOnly 'org.projectlombok:lombok:1.18.26'
annotationProcessor 'org.projectlombok:lombok:1.18.26'


정상적으로 컴파일되는것을 확인할 수 있습니다.

마지막으로 Gradle 관련 파일을 gitignore 처리해주고, Maven 관련 파일을 지워줍니다.
gitignore 관련 코드는 이곳에서 자동으로 생성할 수 있습니다.


Gradle로 Migration 자체는 어렵지 않았지만, Querydsl 및 Lombok 플러그인을 사용한다면 별도의 작업이 필요했습니다.
(Querydsl은 공식 홈페이지에서 Maven 설정방법만 제공하고 있습니다.)

Gradle이 개선된 성능 및 가독성 향상을 보여줬지만,
아직까지 Maven이 우세인 점유율을 보면 무리해서 Gradle로 넘어갈 필요는 없어보입니다.

추후에, GitLab CI 관련 코드도 알아보도록 하겠습니다. 감사합니다.

728x90