본문 바로가기

WEB개발

Gradle, Maven

Maven과 Gradle은 둘 다 Java 프로젝트 빌드를 자동화하기 위한 도구입니다. 이들의 가장 큰 차이점은 Maven이 XML을 사용하여 프로젝트를 구성하고 빌드하는 반면, Gradle은 Groovy 또는 Kotlin DSL을 사용하여 프로젝트를 구성하고 빌드합니다. 이러한 차이점으로 인해 각각의 장단점이 있습니다.

 


MAVEN

Ant는 비교적 자유도가 높은 편(Ant : 전처리 / 컴파일 / 패키징 / 테스팅 / 배포 가능)이나 Maven은 정해진 라이프사이클에 의하여 작업 수행하며, 전반적인 프로젝트 관리 기능까지 포함. (Build Tool + Project Management)


Maven의 장점:

  • XML 구문이 간단하고 명확하여 이해하기 쉽습니다.
  • Maven은 중앙 저장소에서 의존성을 다운로드하고 관리하는데 강력한 기능을 제공합니다.
  • 미리 정의된 라이프사이클 플러그인을 제공하여 간단한 명령어로 빌드할 수 있습니다.

Maven의 단점:

  • XML 파일은 상당히 복잡하고 길어질 수 있습니다.
  • 커스텀 빌드 로직을 구현하기가 어렵습니다.
  • 빌드 성능이 다소 떨어질 수 있습니다.

 

LIFE CYCLE

Default(Build) : 일반적인 빌드 프로세스를 위한 모델이다.


Clean
: 빌드 시 생성되었던 파일들을 삭제하는 단계

[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test --- [INFO] Deleting C:\Users\wooye\workspace-test2\TestWeb\target


Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
Compile : 프로젝트의 소스코드를 컴파일 하는 단계

 

Test : 유닛(단위) 테스트를 수행 하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)

test-compile을 통해 test 코드를 컴파일합니다. (junit과 같은 단위 테스트가 만약 정상적으로 동작하지 않는다면 빌드가 멈춥니다.)

[INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.055 s [INFO] Finished at: 2023-04-18T14:08:12+09:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project test: Fatal error compiling: tools.jar not found: C:\Program Files\Java\jre1.8.0_301\..\lib\tools.jar -> [Help 1]


Pacakge : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등등의 파일 등의 배포를 위한 패키지로 만드는 단계


Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계

 

Install : 패키지를 로컬 저장소에 설치하는 단계, install을 하게 된다면 로컬 레파지토리에 배포합니다. (로컬 레파지토리인 ~/. m2/repository)

[INFO] Installing C:\Users\wooye\workspace-test2\TestWeb\target\test-1.0.0-BUILD-SNAPSHOT.war to C:\Users\wooye\.m2\repository\com\woo\test\1.0.0-BUILD-SNAPSHOT\test-1.0.0-BUILD-SNAPSHOT.war [INFO] Installing C:\Users\wooye\workspace-test2\TestWeb\pom.xml to C:\Users\wooye\.m2\repository\com\woo\test\1.0.0-BUILD-SNAPSHOT\test-1.0.0-BUILD-SNAPSHOT.pom


Site : 프로젝트 문서와 사이트 작성, 생성하는 단계
Deploy : 만들어진 package를 원격 저장소에 release 하는 단계

 

 


 

GRADLE

 

Gradle은 앞서 살펴본 Ant와 Maven이 가진 장점을 모아 만들었다. 의존성 관리를 위한 다양한 방법을 제공하고 빌드 스크립트를 XML 언어가 아닌 JVM에서 동작하는 스크립트 언어 ‘그루비’ 기반의 DSL(Domain Specific Language)를 사용한다.

 

그루비(Groovy)는 자바 문법과 유사하여 자바 개발자가 쉽게 익힐 수 있는 장점이 있으며 Gradle Wrapper를 이용하면 Gradle이 설치되지 않은 시스템에서도 프로젝트를 빌드할 수 있다.

심지어 메이븐(Maven)의 pom.xml을 Gradle 용으로 변환할 수도 있으며 Maven의 중앙 저장소도 지원하기 때문에 라이브러리를 모두 그대로 가져다 사용할 수 있다.

DSL(Domain-Specific Language)은 특정 도메인이나 문제 영역에 특화된 프로그래밍 언어입니다. 일반적인 프로그래밍 언어와 달리, DSL은 특정 작업을 더 효율적으로 수행할 수 있도록 설계됩니다. DSL은 특정 애플리케이션 또는 문제를 해결하기 위해 사용하는 도구로, 그 목적에 맞는 구문과 기능을 제공하여 사용자가 더 직관적이고 간결하게 작업할 수 있도록 돕습니다.

 

 

BUILD

 

1. 초기화(init) : 단일/멀티 프로젝트 빌드 지원. 초기화 단계에서는 어느 프로젝트를 빌드하는지 결정하고 각각의 프로젝트들에 대해 Project 객체를 생성한다.

 

2. 구성(configure) : 빌드에 속하는 모든 프로젝트의 빌드 스크립트를 실행한다. 이를 통해 프로젝트 객체를 구성한다.

 

3. 실행 (exec) : 구성 단계에서 생성하고 설정된 태스크 중에 실행할 것을 결정한다. gradle 명령행에 인자로 지정한 태스크 이름과 현재 디렉토리를 기반으로 태스크를 결정하여 실행한다.

 

 

Gradle의 장점:

 

  • Gradle은 Kotlin이나 Groovy와 같은 좀 더 간결한 DSL을 사용하기 때문에 가독성이 좋습니다.
  • 빌드 성능이 매우 빠릅니다. 특히 대규모 프로젝트에서 이점이 큽니다.
  • 커스텀 빌드 로직을 구현하기가 쉽습니다.

 

Gradle의 단점:

 

  • DSL이 좀 더 복잡하여 이해하기 어렵습니다.
  • Maven과 비교하여 덜 성숙한 생태계를 가지고 있습니다.
  • Gradle은 강력하지만 복잡한 기능을 가지고 있어, Maven보다 처음 사용하기 어렵습니다.
  • 따라서 프로젝트의 크기, 복잡도, 성능 요구 사항 및 개발자의 선호도에 따라 Maven 또는 Gradle 중 어느 것을 선택할지 결정해야 합니다.

 

build.gradle

plugins {
	id 'java' //Java 프로젝트로 설정합니다.
	id 'org.springframework.boot' version '3.4.3' //Spring Boot 플러그인으로, Spring Boot 애플리케이션을 빌드하고 실행할 수 있게 해줍니다. 버전 3.4.3이 지정되어 있습니다.
	id 'io.spring.dependency-management' version '1.1.7' // Spring 프로젝트에서 의존성 관리를 돕는 플러그인입니다. 버전 1.1.7을 사용합니다.
}

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

java { //사용하려는 Java 버전을 설정합니다. 여기서는 Java 17을 사용하도록 지정하고 있습니다. 이는 JDK 17을 사용하여 컴파일하고 실행할 수 있도록 보장합니다.
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

/**
implementation: 이 의존성은 애플리케이션에서 실제로 필요하며, 런타임에 포함됩니다. 예를 들어, spring-boot-starter-web은 웹 애플리케이션을 위한 기본 스타터입니다.

compileOnly: 컴파일 타임에만 필요한 의존성으로, 런타임에는 포함되지 않습니다. lombok은 코드 생성을 위한 라이브러리로, 컴파일 시에만 필요합니다.

developmentOnly: 개발 중에만 필요한 의존성으로, spring-boot-devtools는 개발 중에 리로드 등을 지원하는 도구입니다.

annotationProcessor: lombok의 애너테이션 프로세서를 사용하려면 이 의존성이 필요합니다.

testImplementation: 테스트에 필요한 의존성으로, spring-boot-starter-test는 테스트용 Spring Boot 스타터입니다.

testRuntimeOnly: 테스트 런타임에만 필요한 의존성으로, JUnit 플랫폼 런처가 포함됩니다.
 */
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

 

 

JAVA Version별 Gradle 호환성 확인

https://docs.gradle.org/current/userguide/compatibility.html

 

Compatibility Matrix

Gradle runs on the Java Virtual Machine (JVM), which is often provided by either a JDK or JRE. A JVM version between 8 and 23 is required to execute Gradle. JVM 24 and later versions are not yet supported. Executing the Gradle daemon with JVM 16 or earlier

docs.gradle.org

 

 

 

STS, GRADLE연동

https://aristatait.tistory.com/66

 

Spring + Gradle 연동하기

첫번째 과제인 Spring + Maven 연동하기 를 무사히 마치고 두번째 과제를 받았다. 사실 동시에 받았긴 하지만... 두번째 과제는 Spring + Gradle 연동하기 이다. 표현이 조금 애매하긴 한데, 결국 Gradle(이

aristatait.tistory.com

 

 

 

 


 

https://madplay.github.io/post/what-is-gradle

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=writer0713&logNo=221659376934

'WEB개발' 카테고리의 다른 글

[URL] request url  (0) 2024.02.29
[Spring Boot] 인텔리제이 Intellij 정적리소스 자동리로드  (0) 2024.01.31
[SPRING] AOP  (0) 2023.03.08
[SPRING] BEAN  (0) 2023.03.06
[Spring] 주석2 (Annotation)  (0) 2023.01.19