Spring Gradle 과 Maven

‍박태우·2024년 9월 25일

Spring

목록 보기
1/6
  • 우리가 Spring Initializer 를 통해 프로젝트를 시작할 때 Gradle 또는 Maven 을 선택하라고 한다.
    이 둘의 차이가 정확이 무엇이고 각자의 장단점을 알아보고자 이 포스팅을 작성한다.

1. 빌드 관리 도구

  • 빌드 관리 도구는 작성한 java 코드와 프로젝트 내에 필요한 각종 xml, properties, jar 파일을 JVM 과 WAS
    (Web Application Server, ex : Apache Tomcat) 가 인식할 수 있도록 패키징을 해주는 빌드 과정 즉 빌드 자동화 도구 이다.

    특장점으로는 별도의 패키지 관리가 필요 없다. 여러 라이브러리의 의존성과 관리를 자동으로 해주기 때문에 편리하다는 장점이 존재


2. Maven 알아보기

  • Java 용 프로젝트 관리도구로서 Apache 의 Ant 대안으로 만들어짐
  • pom.xml 파일을 이용해 다양한 외부 라이브러리의 종속성 관계, 프로젝트, 빌드 순서를 명시한다.
  • 외부 저장소에서 필요한 라이브러리와 플러그인들을 다운로드 하고, 로컬 시스템의 캐시에 모두 저장한다.

  • 예시 pom.xml
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>

Apache 의 Ant 가 뭘까?
=> 자바 프로그래밍 언어에서 사용하는 자동화된 소프트웨어 빌드 도구이다. 톰캣을 빌드하기 위한 도구로서 만들어 짐

참고 : https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_%EC%95%A4%ED%8A%B8


3. Gradle 알아보기

  • Apache Maven 과 Apache Ant 에서 볼 수 있는 개념들을 사용하는 대안으로서 나온 프로젝트 관리 툴 (오픈소스)
  • Groovy 언어 또는 Kotlin 언어를 사용한다.
  • 업데이트가 반영된 빌드의 부분은 더 이상 재실행 되지 않는 장점이 있다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.2.4.RELEASE'

4. Maven VS Gradle

  • Gradle :
    1) 작업 의존성 그래프를 기반
    2) 설정 주입 방식을 제공
    3) concurrent 에 안전한 캐시 허용

-> 2개 이상의 프로젝트에서 동일한 캐시 사용 시 서로 overwrite 되지 않도록 checksum 기반의 캐시를 사용, 그리고 캐시를 repository 와 동기화 시킬 수 있다.


  • Maven :
    1) 고정적이고 선형적인 단계의 모델을 기반
    2) 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 한다.
    3) Maven 으로 설정된 프로젝트는 Gradle 로 마이그레이션이 가능하다.

=> 성능 측면에서는 모두 다중 모듈 빌드를 병렬로 실행 할 수 있지만, Gradle은 task가 업데이트 되었고 안되었고를 체크하기 때문에 incremental build 를 허용한다.

incremental build : 반복적인 빌드 과정에서 변경된 소스코드의 의존하고 있는 대상들마 다시 빌드 (즉 모두 빌드 하지 않는다.)

=> 그래서 프로젝트의 규모가 커질 수록 빌드시간의 차이도 늘어난다.
(Gradle 이 더 좋음)

PLUS 코드적인 차이

  • Maven
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.programming.mitra</groupId>
    <artifactId>java-build-tools</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
            </plugin>
        </plugins>
    </build>
</project>

Maven 의 경우 빌드하기위한 명령어로 mvn package 를 사용한다.

  • Gradle
apply plugin:'java'
apply plugin:'checkstyle'
apply plugin:'findbugs'
apply plugin:'pmd'
version ='1.0'
repositories {
    mavenCentral()
}
dependencies {
    testCompile group:'junit', name:'junit', version:'4.11'
}

Gradle 의 경우 빌드하기위한 명령어로 gradle tasks --all 을 사용한다.

=> 확실히 Gradle 의 코드가 가독성 좋고 간결 한 것을 확인 할 수 있다.


5. 빌드를 하는 이유

  • 그럼 이러한 빌드를 하는 이유가 뭘까?
  1. 의존성 관리 : 외부 라이브러리를 자동으로 관리하기 위함
  2. 패키징 : .jar, .war 파일로 의존성 파일들이 패키징 되는 데 이는 나중에 배포 시에 사용이 된다.
  3. 코드 컴파일 : Java 소스 코드를 바이트코드로 컴파일 하여 JVM 에서 실행
  4. 테스트 실행 : 빌드 프로세스를 통해 단위 테스트, 통합 테스트 등을 실행하여 애플리케이션의 안정성을 확인 할 수 있다. (Junit)
  5. 환경 설정 및 최적화 : 애플리케이션의 환경 설정, 프로파일을 구분해서 개발환경, 테스트환경, 배포환경에서 각각 다른 설정을 적용할 수 있게 도와줌 또한 빌드 과정에서 코드 압축, 난독화 등 최적화 수행
  6. 배포 : 빌드를 통해 생성된 패키지 파일 (jar) 파일을 클라우드 서버를 이용하여 배포할 수 있도록 한다.

=> 위와 같이 빌드를 하는 수많은 이유가 존재한다.

profile
잘 부탁드립니다.

0개의 댓글