카테고리 없음

Maven & Gradle

keumcloud 2023. 11. 17. 17:59

개발은 직접 작성한 코드만으로 하는 것이 아닌 많은 라이브러리들을 사용하여 진행

사용하는 라이브러리들의 수가 수십개, 수백개가 넘어가는 상황이 발생시, 관리하는 것이 어려워짐

Maven과 Gradle은 라이브러리들을 자동으로 관리해주어 이러한 문제들을 해결

프로젝트 생성, 데스트 빌드, 배포 등의 작업을 관리해주는 빌드 도구

 

Maven VS Gradle

1. Maven

1.1 정의

    • 자바용 프로젝트 관리 도구로 기존 Apache Ant의 대안으로 만들어짐
    • Apache Ant는 라이브러리 의존관리가 되지 않으며 프로젝트 빌드 시 모든 명령을 직접 작성해야 함
    • 가독성이 떨어지며 유지 보수 및 재사용이 어려움
    • 필요한 라이브러리를 pom.xml에 정의해두면 정의해둔 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 네트워크를 통해 자동으로 설치하여 관리 해줌
    • HTML을 획기적으로 개선하여 만든 마크업 언어인 XML 사용
    • 미리 설정된 라이프사이클(lifecycle)에 의하여 작업을 수행
    • 모든 기능이 플로그인 기반으로 동작

 

1.2 라이프사이클(lifecycle)

  • 미리 정해진 빌드 순서를 의미
  • 라이프 사이클의 각 단계를 Phase라고 하며 Phase는 의존 관계를 가지고 있어 해당 Phase가 수행되기 위해서는 이전 단계의 Phase가 모두 수행되어야 함

 

메이븐의 빌드 순서는 다음과 같음

  • clean : 이전 빌드에서 생성된 파일들을 삭제하는 단계
  • validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
  • compile : 프로젝트의 소스코드를 컴파일하는 단계
  • test : 유닛 테스트를 수행하는 단계( 이 단계에서 실패시 빌드 실패로 처리, 스킵 가능)
  • package : 실제 컴파일된 소스 코드와 리소스들을 jar 등의 배포를 위한 패키지로 만드는 단계
  • verify : 통합테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
  • install : 패키지를 로컬 저장소에 설치하는 단계
  • site : 프로젝트 문서를 생성하는 단계
  • deploy : 만들어진 package를 원격 저장소에 release하는 단계

 

1.3 Goal

 

  • 하나의 플러그인에서 여러 작업을 수행할 수 있도록 지원하며, 플러그인에서 실행할 수 있는 각각의 기능을 goal이라고 함
  • goal을 실행하는 과정을 빌드(build)라고 함
  • 플러그인의 goal을 실행하는 방법
  • -mvn groupid:artifactid:version:goal
  • -mvn plugin:goal

 

장점

  • 컴파일과 빌드를 동시에 수행할 수 있음
  • pom.xml 파일을 통해 관리하기 때문에 오픈소스 라이브러리 등의 관리가 용이
  • 배포 설정 파일을 관리하고 배포 파일을 생성할 수 있음

 

단점

  • 빌드 순서가 정해져 있어 Ant에 비해 자유도가 떨어짐
  • XML을 사용하여 라이브러리를 관리하기 때문에 가독성이 떨어짐

 

설치 방법

  • 메이블 홈페이지 접속 후 Binary zip archive 다운
  • 환경 변수 설정 - 시스템 변수 - 편집 - Path 변수에 Maven의 bin 폴더 경로 저장
  • cmd 콘솔창에 mvn -version 명령어로 확인

 

2. Gradle

2.1 정의

  • Ant와 Maven의 장점을 모아 만든 오픈소스 기반의 빌드 자동화 시스템
  • 스크립트 언어로 구성되어 있기 때문에 XML과 달리 변수선언, if, else, for 등의 로직이 구현 가능하여 간결하게 구성 가능
  • Maven 레파지토리를 동일하게 사용할 수 있음
  • Goovy와 Kotlin 기반 DSL로 작성
  • Goovy : JVM에서 실행되는 스크립트 언어
  • Kotlin : 100% JAVA와 호환이 가능한 프로그래밍 언어로써 간결한 문법과 안정성이 높음
  • DSL(Domain Specific Language) : 특정 도메인에 국한해 사용하는 언어이며 비개발자가 사용하도록 고안된 경우도 있어 일반적인 프로그래밍 언어보다 훨씬 쉬운 사용성을 가짐
  • DSL의 반대 개념으로는 GPL(General Purpose Language)가 있으며 C, C++, JAVA, Kotlin 등이 이에 해당함
  • Kotlin DSL : Kotlin으로 작성된 DSL, Gradle 빌드 기본 언어로 채택
  • Maven에 비해 빌드 속도가 빠름

 

2.2 Groovy DSL VS Kotlin DSL

  • Gradle 빌드 파일을 Groovy는 동적 언어로 Kotlin은 정적 언어로 타입을 지정
  • 타입 검사시 정적 언어의 경우 컴파일 단계에서 스크립트 오류를 검출 할 수 있음
  • 동적 언어의 경우 빌드 스크립트가 실행될때까지 오류 검출 할 수 없음
  • Kotlin DSL의 경우 다른 DSL에 비해 간결하고 가독성이 높은 코드를 작성할 수 있으며 Kotlin만의 기능(람다식, 확장함수, Null 안전성)으로 보다 효율적으로 작성 가능

 

장점

2.3 직관적인 코드와 자동완성

  • Gradle은 Markup Language가 아닌 Groovy나 Kotlin으로 스크립트를 짤 수 있기 때문에 가독성이 뛰어남
  • Kotlin DSL을 사용할 수 있게 되어 자동완성과 코드 찾기가 가능해져 매우 편리해짐

 

2.4 다양한 Repository 사용 가능(maven 레파지토리도 사용 가능)

  • maven Repository, JCenter 등 Repository에 대한 정의만 해주면 다양한 저장 공간 사용 가능
  • 새로 프로젝트를 생성하면 Repository가 정의 되며 해당 레포지토리는 dependency용 Repository와 plugin용 Repository에 대한 정의가 분리되어 있음

 

2.5 각 작업에 필요한 라이브러리들만을 가져오는 작업

  • 안드로이드 프로젝트를 만든뒤 build.gradle을 보면 여러 라이브러리에 대한 implementation이 있는 것을 확인 할 수 있다.
  • 즉 필요한 라이브러리를 가져오는 것을 뜻한다. implementation 자리에 androidTestImplementation, testImplementaion, debugImplementation 등 원하는 라이브러리를 가져올 수 있다.

 

2.6 빠른 빌드 속도

  • 점진적 빌드, 이미 빌드된 파일들은 두고 바뀐 파일들만 빌드 가능
  • 빌드 캐시, 두개 이상의 빌드가 돌아갈 경우 하나의 빌드에서 사용되는 파일들이 다른 빌드에서도 사용이 된다면 빌드 캐시를 이용해 이전 빌드의 결과물을 다른 빌들에서 사용 할 수 있음
  • 데몬 프로세스, 데몬 프로세스는 메모리 상에 빌드 결과물을 보관하며 한번 빌드된 경우 다음 빌드시 매우 적은 시간만으로 빌드가 가능

 

단점

2.7 새로운 지식 습득

  • 기존 Maven에 익숙해진 개발자들이 XML가 아닌 Groovy 문법과 Kotlin 문법을 배우는 것은 적지 않은 비용이 듬
  • 실제로 Gradle이 성능면으로 보나 가독성으로 보나 훨씬 우월하지만 아직 Maven 사용률이 Gradle보다 높은것을 확인 할 수 있음 

 

2.8 설치 방법

  • Gradle 홈페이지 접속 후 binary-only or complete (checksums) 다운
  • 환경 변수 설정 - 시스템 변수 - 편집 - Path 변수에 Gradle의 bin 폴더 경로 저장
  • cmd 콘솔창에 gradle -v 명령어로 확인