티스토리 뷰

Programming/Java&Spring

Maven과 Gradle

Namhyun Sung 2019. 11. 23. 15:02

우선 Maven과 Gradle을 간략하게 알아보자.

1.Maven


  • Apache의 이름 아래 2004년 출시되었다.
  • Ant를 사용하던 개발자들의 불편함을 해소 + 부가기능 추가

Maven은 무엇인가?


  • 빌드를 쉽게 할 수 있도록 해준다.
  • pom.xml을 이용한 정형화된 빌드 시스템
  • 뛰어난 프로젝트 정보 제공
    • Change log document created directly from source control
    • Cross referenced sources
    • Mailing lists
    • Dependency list
    • Unit test reports including coverage
  • 개발 가이드 라인 제공
  • 테스트 소스 코드를 별도의 병렬 소스 트리에 보관
  • 테스트 케이스 명명 규칙을 사용하여 테스트 위치 및 실행
  • 테스트 케이스에 환경을 설정하고 테스트 준비를 위해 빌드를 사용자 정의하지 않아도 된다.
  • 새로운 기능을 쉽게 설치할 수 있고 업데이트할 수 있음

2.Gradle


  • Ant와 Maven의 장점을 모아모아 2012년 출시
  • Android OS의 빌드 도구로 채택 됨

Gradle이란 무엇인가?

  • Ant처럼 유연한 범용 빌드 도구
  • Maven을 사용할 수 있는 변환 가능 컨벤션 프레임 워크
  • 멀티 프로젝트에 사용하기 좋음
  • Apache Ivy에 기반한 강력한 의존성 관리
  • Maven과 Ivy 레파지토리 완전 지원
  • 원격 저장소나, pom, ivy 파일 없이 연결되는 의존성 관리 지원
  • 그루비 문법 사용
  • 빌드를 설명하는 풍부한 도메인 모델

3.Gradle이 Maven보다 좋은 점


  • Build라는 동적인 요소를 XML로 정의하기에는 어려운 부분이 많다.
  • Maven은 설정 내용이 길어지고 가독성 떨어진다.
  • 의존관계가 복잡한 프로젝트 설정하기에 부적절하다
  • 상속구조를 이용한 멀티 모듈 구현이 가능하다.
  • 특정 설정을 소수의 모듈에서 공유하기 위해서는 부모 프로젝트를 생성하여 상속하게 해야 함 (상속의 단점 생김)
  • Gradle은 Groovy를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다.
  • Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 커버했다. 설정 주입 시 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.

4.마무리


Spring Framework를 처음 공부를 시작하면서 Maven을 처음 접했다.

스프링에 대해서 공부하는 시간이 길어지고 github나 여러 강의에서 코드 많이 보면서 Gradle을 많이 사용한다는 것을 느꼈다. 그래서 최근에는 Gradle을 사용해보기 시작했다.

짧은 시간 사용했지만 Gradle 빌드 도구를 사용하면서 느낀 장점은

첫번째, 설정 내용이 짧다. 기본 설정만 추가하여 프로젝트를 생성해봐도 알 수 있다.
의존성은 Spring Web,Spring Data JPA, H2, Lombok, Thymeleaf만을 추가했다.

먼저 Maven을 보자

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

다음은 Gradle설정 파일이다.

plugins {
    id 'org.springframework.boot' version '2.2.1.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

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

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

보다시피 길이에 차이도 있고, Gradle이 한눈에 더 잘 들어온다는 장점이 있다.

다음으로 멀티 프로젝트를 구성하는데 편리하다는 점이었다. Maven은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만 Gradle은 설정 주입 방식으로 이를 해결한다.

아직 소규모, 토이프로젝트만 진행하다보니 테스트 코드를 수가 많지 않아 비교하기가 어렵지만 Gradle 사이트에서 Maven과 Gradle 비교 글을 만 봐도 확실한 차이를 느낄 수 있었다.

이외에도 Gradle이 가지는 장점이 많다. 앞으로 Spring과 관련된 많은 프로젝트를 하다보면 Gradle의 장점을 더 많이 느낄 수 있을 거 같다.

5.참고


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함