안녕하세요. 유저인사이트 박태양입니다.
저희는 프로젝트 빌드 도구로 Maven을 사용하고 있습니다. 학습비용이 없다는 점이 가장 큰 이유였는데요,
Gradle이 성능 및 가독성 면에서 Maven 보다 뛰어난것 같아 이번 기회에 도입해보려고 합니다.
주로 사용하게 되는 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 관련 코드도 알아보도록 하겠습니다. 감사합니다.
'세미나' 카테고리의 다른 글
Spring Boot 프로젝트에 Swagger 적용하기 (+인증) (1) | 2023.03.07 |
---|---|
ChatGPT 체험 후기 (0) | 2023.02.24 |
Redux와 Mobx 비교 체험기 (0) | 2023.02.09 |
Python의 win32com 으로 윈도우 프로그램 제어하기 (0) | 2023.02.03 |
Spring 개발자의 Django 체험기 (0) | 2023.01.18 |