본문 바로가기

WEB개발

[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의 중앙 저장소도 지원하기 때문에 라이브러리를 모두 그대로 가져다 사용할 수 있다.

 

BUILD

 

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

 

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

 

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

 

 

Gradle의 장점:

 

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

 

Gradle의 단점:

 

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

 

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'
 
sourceCompatibility = 1.8
targetCompatibility = 1.8
 
version = '1.0'
 
//버전 관리
def version = [
    spring: '4.3.4.RELEASE',
    servletAPI: '3.1.0',
    commonsCollections: '3.2.1',
    junit: '4.12',
    slf4j: '1.7.12'
]
 
//프로젝트를 빌드하고 나면 프로젝트 정보도 같이 지워지는데, Gradle 프로젝트임을 인식 시켜준다
//프로젝트 우클릭시 [run as] - [gradle build]가 표시되도록 해준다
eclipse {
    project.natures "org.springsource.ide.eclipse.gradle.core.nature"
    wtp {
        facet {
            facet name: 'jst.web', version: '3.1' // Servlet Spec version 지정
            facet name: 'jst.java', version: '1.8' //Java version 지정
        }
    }
}
 
//jar 파일에 대해서 설정한다
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version
    }
    //manifest : MANIFEST.MF 파일에 들어갈 속성=값 정보를 설정한다. 이 파일은 jar 파일 안에 META-INF에 들어간다.
    
}
 
//의존 라이브러리를 가져올 저장소 설정
repositories {
    mavenCentral()
    //mavenCentral() : Maven 중앙 서버를 저장소로 지정한다. 서버의 기본 URL은 http://repo1.maven.org/maven2/이다.
}
 
//의존성 라이브러리 주입
//여기에 의존성 추가해준 라이브러리들이 자동으로 빌드된다.
dependencies {
    providedCompile "javax.servlet:javax.servlet-api:${version.servletAPI}"
    compile "org.springframework:spring-webmvc:${version.spring}"
    compile "org.slf4j:slf4j-api:${version.slf4j}"
    compile group: 'commons-collections', name: 'commons-collections', version: "${version.commonsCollections}"
    testCompile group: 'junit', name: 'junit', version: "${version.junit}"
}
 
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' //인코딩을 UTF-8로 통일 
 
//test 정보를 설정한다
test {
    systemProperties 'property': 'value'
}
 
//아카이브파일(.jar) 배포를 설정한다
uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

 

 

 

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