Maven vs Gradle (Groovy)

문상우·2023년 7월 14일
0
post-thumbnail

빌드 (Build)

❗ 소스코드 파일을 컴파일에서 실행할 수 있는 가공물로 변환하는 과정 또는 결과물이다.

우리가 작성한 소스코드 (Java), 프로젝트에서 쓰인 각각의 파일 및 자원 등 (.xml, jpa, jpg, properties) 을 JVM이나 Tomcat 같은 Web Application Server가 인식할 수 있는 패키징하는 과정 및 결과물이라고 할 수 있다.

즉, 소스코드와 관련된 여러 작업을 통해 실행 가능한 소프트웨어 제품물을 생성하는 과정이고, 이 과정은 소스 코드의 컴파일, 테스트, 패키징, 문서화, 배포 등을 포함한다.


빌드 관리 도구 (Build Management Tool)

❗ 빌드 과정을 자동화하고 관리하기 위해 사용하는 도구이다.

소스코드에서 어플리케이션 생성을 하면서 여러가지 여부 라이브러리를 사용하는데, 빌드 관리 도구는 사용자가 직접 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리해준다. 개발자가 빌드 프로세스를 간편하게 정의하고 실행할 수 있도록 도와주며, 자세하게는 소스코드 컴파일, 의존성관리, 테스트 실행, 패키징, 배포 등의 작업을 도와준다.

예전에는 빌드 관리 도구로 Apache Ant를 많이 썼다고 하는데, 라이브러리 의존 관리가 안된다는 이유로 요즘은 Maven과 Gradle을 쓴다고 한다.

하는 일

  1. 종속성 다운로드 (의존성 관리)
  2. 소스코드 → 바이너리코드로 컴파일
  3. 바이너리 코드 패키징
  4. 테스트 실행
  5. 프로덕션 시스템에 배포
  • 컴파일, 테스트, 패키징, 배포 등의 작업을 자동화 해준다.
  • 프로젝트 관리를 간편하게 하고 의존성 관리, 빌드 프로세스의 일관성을 유지하는데 도움을 준다.

Maven

자바 전용 프로젝트 Lifecycle 관리 목적 빌드 도구이며, Apache Ant의 의존 관리 불편함을 해결하고자 만들어졌다. Spring에서 사용할 수 있다. Apache Software Foundation에서 개발되었다. XML 기반의 프로젝트 객체 모델 (Project Object Model, POM)을 사용하여 프로젝트를 관리한다. 프로젝트의 구조와 라이프사이클, 라이브러리 의존성, 빌드 설정 등을 POM 파일에 정의한다.

특징

  1. LifeCycle : 정해진 Lifecycle에 의해 작업을 수행하고, 전반적인 프로젝트 관리 기능을 포함하고 있다.
  2. 프로젝트 모델링 : Maven은 필요한 라이브러리를 pom.xml 에 저장한다.
  3. 플러그인을 통한 전역적인 재사용 : Maven은 빌드에 대한 대부분의 책임을 각 플러그인에 위임한다.
  4. 공통 인터페이스 : Maven 이전에는 각 개발환경에 대한 빌드 프로세스를 파악하는데 시간이 걸렸다.

설정파일

setting.xml

Maven을 빌드할 때, 의존 관계에 있는 라이브러리와 플러그인을 중앙저장소 → 로컬저장소 (개발자 Local) 로 다운로드 하게 되어있다. 그리고 로컬저장소의 기본 위치는 USER_HOME/.m2/repository 인데, setting.xml을 통해 원하는 로컬 저장소의 경로를 지정 및 변경 가능하다.

pom.xml

root에 존재하는 xml 파일로, 프로젝트마다 1개씩 가지고 있다. 필요한 라이브러리를 pom.xml에 정의하면, 해당 라이브러리 실행, 설치에 필요한 다른 라이브러리까지 관리하고 네트워크를 통해서 자동으로 다운받아 준다.

동작과정

  1. POM 작성
    • Maven 프로젝트는 POM 파일을 기반으로 구성된다.
    • POM 파일에는 프로젝트의 속성, 의존성, 빌드 설정 등이 정의된다.
  2. 의존성 관리
    • POM 파일에서 필요한 라이브러리 및 외부 의존성을 정의한다.
    • Maven은 이러한 의존성을 자동으로 다운로드하여 프로젝트에 포함시킨다.
  3. 빌드
    • Maven은 프로젝트를 빌드하기 위한 명령어(’mvn clean install’)를 실행한다.
    • 빌드 단계에서는 소스 코드의 컴파일, 테스트, 패키징, 리소스 복사 등을 수행한다.
  4. 배포
    • 빌드가 성공적으로 완료되면, Maven은 빌드 결과물을 로컬 레포지토리에 설치하거나 원격 레포지토리에 배포한다.

Gradle

❗ Groovy 기반의 강력한 빌드 자동화 도구로서, Maven을 대체할 수 있는 프로젝트 구성 관리 및 범용 필드 툴이다.

Ant Builder와 Groovy Script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용 가능하고 스프링부트와 안드로이드에서 사용된다.

Groovy DSL(Domain-Specific Language)을 사용하여 빌드 스크립트를 작성하며, 다양한 작업을 수행할 수 있다. Groovy의 문법과 기능을 사용하여 빌드 프로세스를 정의하고 관리하며, Maven과 마찬가지로 구조, 빌드 설정, 의존성 관리 등을 정의할 수 있다.

특징

  1. 간결함 : xml의 구조적인 장점이 있지만, 문서의 양 자체가 비대해지는 단점이 있는데, Gradle은 코딩에 의한 간결한 정의가 가능하다.
  2. 재사용 용이 : 프로젝트 설정 주입 방식 (Configuration Injection)으로 정의하여 Maven의 상속 구조보다 재사용에 용이하다.
  3. 구조적인 장점 : Build Script를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)를 사용하여 코드로서 설정 정보를 구성하기 때문에 구조적인 장점이 있다.
  4. 편리함 : Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드를 지원한다.
  5. 멀티 프로젝트 : 애초에 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다.
  6. 지원 : Maven과 Ivy repository를 완전 지원한다.

설정 파일

setting.gradle

프로젝트 구성을 설정할 때, 작성하는 파일이다. 보통 프로젝트간의 의존성 및 서브 프로젝트, 교차 프로젝트 같은 멀티 프로젝트를 구성할 때 사용한다. 단, 싱글 프로젝트의 경우에는 생략할 수 있다.

build.gradle

간단하게, 빌드에 대한 모든 기능을 정의하는 파일이다. 프로젝트에서 사용하는 환경 설정, 빌드 방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성한다.


동작과정

  1. 빌드 스크립트 작성
    • Gradle 프로젝트는 Groovy DSL을 사용하여 빌드 스크립트를 작성한다.
    • 빌드 스크립트에는 프로젝트의 설정, 의존성, 빌드 태스크 등이 정의된다.
  2. 의존성 관리
    • 빌드 스크립트에서 필요한 라이브러리 및 외부 의존성을 정의한다.
    • Gradle은 필요한 의존성을 자동으로 다운로드하여 프로젝트에 포함시킨다.
  3. 빌드
    • Gradle은 빌드 스크립트에 정의된 태스크를 실행하여 프로젝트를 빌드한다.
    • 빌드 단계에서는 컴파일, 테스트, 패키징 등의 작업을 수행한다.
  4. 배포
    • 빌드가 성공적으로 완료되면, Gradle은 빌드 결과물을 로컬 레포지토리에 설치하거나 원격 레포지토리에 배포한다.

결론

빌드는 소스 코드를 실행 가능한 형태로 변환하는 작업..! 이를 통해 소프트웨어 제품물을 생성한다. 빌드 관리 도구는 위 빌드 과정을 자동화하고 관리하는 도구이다. 이를 통해 개발자는 빌드에 필요한 설정과 의존성 관리를 간편하게 처리할 수 있다. 또한, 일관된 빌드 환경을 유지하고, 빌드 과정을 자동화 함으로써 생산성을 향상시킬 수 있다.

Maven, Gradle은 위 빌드 관리 도구로 쓰이고, 빌드 프로세스의 설정과 의존성 관리, 테스트 실행, 패키징, 배포 등을 지원한다. 또한, 현재는 JVM 위에서 실행되는 동적 프로그래밍 언어 Groovy 스크립트로 빌드된 Gradle을 더 선호하는 경향이 있다. 또한, Gradle Kotlin이 등장하고 난 후에는 Gradle Groovy를 Gradle Kotlin으로 많이 전환하는 추세가 있다.


[참고]

Maven과 Gradle의 차이점

https://velog.io/@alicesykim95/Maven과-Gradle의-차이점

chat GPT
https://chat.openai.com/

profile
평범한 대학생의 코딩일기

0개의 댓글