dev.jaieve 공부기록

[Spring] 빌드 관리 도구, Maven과 Gradle이란 무엇인가? 본문

Back/Springboot

[Spring] 빌드 관리 도구, Maven과 Gradle이란 무엇인가?

제이브 2021. 7. 18. 17:33

국비훈련과정을 이수하면서 이클립스를 이용한 Spring Maven 기반의 프로젝트를 수행해왔다.

최근 코멘토를 통해 개발직 현업 실무에서 쓰는 환경을 따라해보는 기회를 얻으면서 인텔리제이를 설치하고 Gradle 기반의 프로젝트를 처음 접하게 됐다.

Maven은 pom.xml로 라이브러리를 관리하던것과 달리 application.properties(또는 .yml)과 build.gradle로 dependencies를 관리하는 것을보며 보다 편하게 개발환경을 세팅할 수 있었다.

하지만 그 차이점을 몰라서 블로그에 정리하면서 빌드 관리도구에 대해 이해해보고자 한다. 

 

'빌드'와 '빌드 툴' 에 대한 이해

빌드란 소스코드 파일을 실행 가능한 소프트웨어 산출물로 만드는 과정을 말한다.

예를 들어 게임회사에서 게임을 개발하는 것은 '개발'이며, 게임 사용자가 자신의 노트북에 게임을 설치하고 실행하는 것을 '빌드'라고 이해하면 된다.

(빌드의 단계중에는 컴파일이란 단계가 포함되어 있다.)

빌드 관리 도구(빌드 툴)은 기술의 빠르게 발전하면서 계속 늘어나는 라이브러리의 추가, 프로젝트를 진행하면서 라이브러리 버전의 동기화 등을 해소하고자 등장한 도구이다.

빌드 관리 도구에는 메이크, 엔트, 메이븐, 그레이들이 있다.

2000년, Java 프로젝트 관리를 위해 빌드 도구로 Apache Ant가 등장했다. 이후 더 강력한 Apache Mavne이 등장했고, 지금도 Java 빌드 도구의 표준으로 본다고 한다.

Maven이란?

Apache Maven은 자바용 프로젝트 관리도구이다.

아파치 앤트를 사용하던 개발자들의 불편함을 해소시키며 부가기능을 추가하여 세상에 등장. 메이븐은 내가 사용할 라이브러리뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운로드해준다.

아래에서 Gradle의 좋은 점에 대해 설명하겠지만 여전히 Maven의 사용률은 Gradle을 앞서고 있으며 구글 트랜드 지수도 Maven이 Gradle을 앞선다.

Maven은 XML 기반의 빌드 처리를 작성한다. 간단한 내용이라면 상관 없지만, 복잡한 내용을 작성하게 되면 XML 기반 의한 묘사는 상당히 어려워 진다.

장점

  • 협업의 편리성과, 러닝 커브를 고려했을 때도 역시 Maven을 사용하는 팀이 많다.

Maven 설정 파일

  • setting.xml
    • setting.xml 파일에서 원하는 로컬저장소의 경로를 지정, 변경이 가능하다.
    • 메이븐을 빌드할 때 의존 관계에 있는 라이브러리, 플러그인을 중앙 저장소에서 개발자pc로 다운로드할 때 기본 설정이 'USER_HOME/.m2/repository'이다.
  • pom.xml
    • Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용한다. 
    • 의존성 추가를 할 수 있으며 프로젝트에 설정된 라이브러리, 설정 등을 알 수 있다. 
    • <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo-maven</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo-maven</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>​

Gradle

Gradle은 안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며, JAVA, C/C++, Python등을 지원한다.

지금까지의 빌드툴 (메이크, 엔트, 메이븐)의 장점을 모아서 만든 프로젝트 관리 도구입니다. 엔트와 메이븐의 XML 정적 코딩도 아니며, 메이크와 같은 동적 스크립트 형식이다.

JVM(Java Virtual Machine)언어인 Groovy를 사용하여 자바 문법과 거의 동일하게 사용 가능하다.

Groovy는 Java 가상머신에서 실행되는 스크립트 언어이며, Java와 마찬가지로 소스 코드를 작성하고, Java 가상머신에서 동작하지만, Java와 달리 소스코드를 컴파일 할 필요는 없다.

Groovy는 Java와 호환되기 때문에 Java 클래스 파일을 그대로 Groovy 클래스로 사용할 수 있으며, 문법도 Java와 가까워서 어떤 사람들은 Groovy를 Java의 방언 중 하나라고 생각하는 사람도 있다고 한다. 이런 Groovy를 용하여 빌드 처리를 작성하고, 실행하는 것이 Gradle이다.

장점과 특징

  • Maven과 Ant의 장점을 조합하여 만든 빌드 도구이다.
  • gradle 의 빌드 스크립트는 groovy 라는 언어로 작성해야 하므로 maven 의 xml 에 비하면 친숙하진 않지만 확장성이 뛰어나다.
  • build.gradle을 이용한 정형화된 빌드 시스템이다.
  • maven 은 프로젝트가 커질수록 빌드 스크립트의 내용이 길어지고 가독성이 떨어지는 반면, gradle 은 훨씬 적은 양의 스크립트로 짧고 간결하게 작성할 수 있다.
  • 멀티 프로젝트에 용이하다
  • maven 의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만 gradle 은 설정 주입 방식으로 이를 해결한다. 그래서 gradle 은 멀티 프로젝트에 매우 적합하며, 빌드 속도는 다양한 시나리오 상에서 10~100배 가량이 빠르다.

단점

  • 그동안 사용해왔던 Maven과 이제는 익숙해진 XML을 버리고 Gradle과 Groovy문법을 배우는 것은 적지않은 비용이 든다. 협업을 하는 경우, 프로젝트 구성과 빌드만을 위해 모든 팀원이 Groovy 문법을 익여야 한다는 사실은 Gradle를 사용하는데 큰 걸림돌이 된다.

Gradle 설정 파일

  • build.gradle : 메이븐의 pom.xml 과 비슷한 플러그인, 의존성 추가를 위한 파일
    plugins {
    	id 'org.springframework.boot' version '2.5.2'
    	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    	id 'java'
    }
    
    group = 'me.harry'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '11'
    
    repositories {
    	mavenCentral()
    }
    
    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-web'
    	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    	implementation 'mysql:mysql-connector-java'
    	testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    
    test {
    	useJUnitPlatform()
    }​

Gradle이 Maven보다 좋은 점

  • Gradle이 시기적으로 늦게 나온만큼 사용성, 성능 등 비교적 뛰어난 스펙을 가지고있다.
  • Gradle은 Groovy를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다.
    • Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 커버했다.
    • 설정 주입 시 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.

Reference

  1. https://jisooo.tistory.com/entry/Spring-빌드-관리-도구-Maven과-Gradle-비교하기
  2. https://okky.tistory.com/179
  3. https://araikuma.tistory.com/460
  4. https://mylupin.tistory.com/39
  5. https://tyrannocoding.tistory.com/16
반응형