개발을 하면서 Maven과 Gradle 선택에 있어서 아무 관심없이 Gradle을 선택하여 개발을 했다.
Gradle을 사용했던 이유로 Maven보다 파일이 깔끔하고 읽기 쉽기 때문에 Gradle을 사용했었다.
얼마전 Maven프로젝트를 Gradle로 변경하면서 이 두가지의 차이점에 뭐가 있을지 궁금해져서 찾아보았다.
Maven과 Gradle은 대표적인 빌드 관리 툴(build management tools)이다. 이는 소프트웨어 개발에서 코드 컴파일, 테스트 실행, 패키징, 배포 등 다양한 작업을 자동화 하는데 사용이 된다.
빌드 관리 툴을 사용을 하면 여러 방면에서 이점을 얻을 수 있다.

자바 전용 프로젝트 Lifecycle 관리 목적의 빌드 도구이며 Apache Ant의 단점을 해결하기 위해 만들어 졌다.
Apache Ant의 단점
Apache Ant는 초기의 빌드 도구로 많은 프로젝트에서 사용이 되었지만 몇 가지 부분에서 다소 불편한 점이 있었다.
Xml 스크립트의 복작성이라는 문제로 빌드 과정이 복잡해질수록 스크립트의 길이가 길어지고 관리가 힘들어 졌다. Ant 자체에는 의존성 관리 기능이 포함되어 있지 않기 때문에, 외부 라이브러리를 관리하기 위해 별도의 툴을 사용하거나 직접 수동으로 관리를 해야 한다는 의존성 관리의 부재 문제점이 있고, 표준화된 빌드 생명주기에 대한 부분과 재사용성과 유지보수성에 대한 문제 등 여러 방면에서 불편한 점이 있었다.
Maven은 초기에 사용을 했던 Apache Ant의 불편한 점을 보완하여 탄생했다. 일단 정해진 Lifecycle로 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있으며, pom.xml 파일을 통해 의존성을 선언하고 Maven 중앙 저장소를 통해 자동으로 의존성을 다운 및 관리가 가능하다. 다양한 플러그인을 사용하여 빌드 과정의 각 단계를 커스터마이징하고 확장할 수 있다. 마지막으로 Ant에 비해 간격하고, 프로젝트 설정을 명확하게 해주는 XML형태의 파일을 사용한다.

pom.xml
Maven은 프로젝트 기본 설정 파일로, 프로젝트의 의존성, 플러그인, 빌드 설정 등을 정의를 한다.
이 파일은 프로젝트 구조와 생명 주기를 관리하며, 표준화된 빌드 프로세스를 제공한다. 주요 구성요소에서 프로젝트의 그룹ID, 아키택트ID, 버전, 의존성 목록, 플러그인 설정 등이 포함된다.
setting.xml
Maven의 사용자별 또는 글로벌 설정을 정의하는 파일로, 특정 사용자나 환경에 맞게 Maven의 동작을 커스터마이즈 가능하다.
pom.xml
프로젝트의 루트 디렉토리에 위치해 있다. 해당 파일은 프로젝트의 기본 설정 파일로, 프로젝트 의존성, 플러그인, 빌드 설정 등을 정의를 하는데 사용이 된다.
settings.xml
사용자별 설정 파일: ~/.m2/settings.xml (리눅스/맥), C:\Users{username}.m2\settings.xml(윈도우)
글로벌 설정 파일: M2_HOME/conf/settings.xml (M2_HOME은 Maven이 설치된 디렉토리)에 위치하며, 해당 파일은 Maven의 전역 설정을 정의한다. 사용자별 또는 시스템 전체에 적용되는 설정을 관리할 수 있다.

Maven을 대체 가능한 빌드 관리 툴이다. Gradle은 더욱 현대적인 빌드 도구로, 유연성과 성능을 중시하며 Groovy 또는 Kotlin DSL을 사용한 스크립트 기반 설정을 특징으로 한다.
Groovy DSL
Groovy DSL는 동적 타이핑 언어로, 문법이 유연하고 간결하다는 특징으로 코드를 더 적게 작성을 하면서 많은 작업을 수행할 수 있다는 장점이 있다.
Gradle의 초기 버전에서 부터 기본적으로 지원 되었다.
Kotlin DSL
Kotlin DSL은 Gradle 5.0 부터 정식 지원된 빌드 스크립트 언어로,Kotlin언어를 기반으로 둔다.
특징으로는 정적 타이핑 언어로, 컴파일 시점에 타입을 체크를 한다. 이는 IDE의 강력한 지원(자동 완성, 리펙토링)을 받을 수 있게한다. 그리고 정적 타이핑과 널 안정성 기능 덕분데 더 안전하고 오류가 적은 코드를 작성할 수 있다.
Groovy DSL 또는 Kotlin DSL을 사용하여 설정 파일을 작성할 수 있다. 이렇게 되면 더 직관적이고 유연한 구성을 가능하게 해준다. 그리고 다양한 레포지토리를 지원하며 의존성 트랜지티브 관리를 지원한다.
또한 빌드 작업을 테스크로 정의하고, 테스크 간의 종속성을 설정하여 빌드 과정을 유연하게 관리할 수 있다. 프로젝트 설정 주입 방식으로 정의하여 Maven의 상속 구조보다 재사용성에 용이하다.

build.gradle
프로젝트의 빌드 스크립트로, 빌드에 대한 모든 기능을 정의하는 파일이다. 환경 설정, 빌드 방법, 라이브러리 정보 등을 기술하여 빌드 및 프로젝트의 관리 환경을 구성한다.
settings.gradle
프로젝트 구성을 설정하는 파일이다. 멀티 프로젝트를 구성할 때 사용하며, 프로젝트간의 의존성 및 서브 프로젝트, 교차 프로젝트 등을 정의한다. 싱글 프로젝트의 경우에는 생략이 가능하다.