프로젝트에서 작성한 java 코드와 프로젝트 내에 필요한 각종 xml, properties, jar 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징 해주는 빌드 과정 == "빌드 자동화 도구"
필요한 라이브러리들을 설정파일을 통해 자동으로 다운로드 해주고 이를 간편히 관리해주는 도구
Gradle과 Maven은 모두 자바 기반의 프로젝트를 위한 빌드 도구입니다. 즉, 소스 코드를 컴파일하고 패키지를 만들며 테스트와 배포를 관리하는 등의 작업을 자동화해주는 도구입니다. 그러나 두 도구는 설계 철학과 기능면에서 몇 가지 중요한 차이점을 가지고 있습니다.
구성 방식:
Maven은 XML 기반의 pom.xml 파일을 이용하여 프로젝트를 구성합니다. Maven의 구성은 간단하고 명확하며, 표준적인 디렉토리 구조와 생명 주기를 사용합니다. 그러나 복잡한 빌드 요구 사항에 대한 유연성이 부족합니다.
Gradle은 Groovy나 Kotlin을 기반으로 한 도메인 특정 언어(DSL)를 사용하여 프로젝트를 구성합니다. Gradle의 구성은 복잡한 빌드 요구 사항을 처리할 수 있는 유연성을 제공합니다.
성능:
Maven은 기본적으로 모든 작업을 매번 실행합니다. 즉, 이전에 빌드된 결과를 재사용하지 않습니다.
Gradle은 증분 빌드를 지원하여 이전에 변경되지 않은 작업을 재실행하지 않습니다. 이 기능은 큰 프로젝트에서 시간을 절약하는 데 도움이 됩니다.
다양한 프로젝트 유형 지원:
Maven은 주로 자바 프로젝트에 사용됩니다.
Gradle은 자바뿐만 아니라 Groovy, Kotlin, C/C++, Python 등 다양한 언어를 지원합니다. 또한, 안드로이드 앱을 빌드하는 공식 도구로도 사용되고 있습니다.
의존성 관리:
Maven은 중앙 리포지토리를 통한 트랜시티브 의존성 관리를 지원합니다. 그러나 의존성 관리에 더 세밀한 제어가 필요한 경우에는 제한적일 수 있습니다.
Gradle은 Maven과 유사한 트랜시티브 의존성 관리를 제공하지만, 더욱 강력하고 유연한 의존성 관리 기능을 제공합니다.
Maven과 Gradle 사이의 차이점은 단순히 프로젝트 설정 파일(pom.xml vs. build.gradle or build.gradle.kts)에만 국한되지 않습니다. 이들 사이의 주요 차이점은 설계 철학, 빌드 스크립트 작성 방식, 성능, 의존성 관리 기능 등 여러 면에서 나타납니다.
하지만 그 중 pom.xml과 build.gradle 파일의 차이는 중요한 점입니다.
- Maven의 pom.xml: 이 파일은 XML 기반으로 Maven 프로젝트의 설정을 정의합니다. XML은 사람이 읽기에는 조금 더 어렵고 복잡하며, 길게 작성될 수 있습니다. 또한 pom.xml 파일은 Maven의 라이프사이클과 프로젝트의 구조를 엄격하게 따르게 합니다. 이로 인해 빌드 과정이 명확해지지만, 복잡한 요구 사항에 대응하기 어려울 수 있습니다.
- Gradle의 build.gradle 또는 build.gradle.kts: 이 파일은 각각 Groovy 혹은 Kotlin DSL(Domain-Specific Language)을 사용하여 프로젝트를 설정합니다. 이들 언어는 프로그래밍 언어이므로 더욱 풍부한 표현력과 유연성을 제공하며, 조건문이나 루프 등 복잡한 빌드 로직을 표현하는데 더 적합합니다. 또한, Gradle은 Maven에 비해 더 유연한 프로젝트 구조와 빌드 라이프사이클을 제공합니다.
즉, pom.xml과 build.gradle 사이의 차이는 두 빌드 도구의 핵심적인 차이점 중 하나이지만, 그 자체로만 두 도구 사이의 전체 차이를 설명하는 것은 아닙니다.
Maven과 Gradle의 설계 철학은 두 빌드 도구가 접근하는 방식에서 큰 차이를 보입니다.
- Maven: "convention over configuration"의 원칙을 따릅니다. 이 원칙은 많은 것이 미리 정의되어 있으며 사용자는 기본 설정에서 벗어나는 부분만 설정하면 된다는 것을 의미합니다. 이로 인해 Maven은 표준적인 프로젝트에서 쉽게 사용할 수 있지만, 복잡하거나 맞춤형 빌드 요구 사항에는 유연성이 떨어질 수 있습니다. Maven은 또한 XML 기반의 pom.xml을 사용하여 프로젝트 구조를 선언적으로 정의하고, 이는 빌드 과정을 이해하는 데 도움이 될 수 있지만, 복잡한 로직을 표현하기 어려울 수 있습니다.
- Gradle: 유연성과 성능에 중점을 두고 설계되었습니다. Gradle은 Groovy 또는 Kotlin DSL을 사용하여 빌드 스크립트를 작성하므로, 사용자는 프로그래밍 언어의 모든 기능을 활용하여 복잡한 빌드 로직을 표현할 수 있습니다. 이로 인해 Gradle은 맞춤형 빌드 요구 사항을 처리하는 데 더 용이합니다. 또한, Gradle은 증분 빌드와 빌드 캐시와 같은 기능을 통해 빌드 성능을 크게 향상시킵니다.
따라서 Maven과 Gradle의 설계 철학의 차이는 주로 유연성과 성능, 그리고 "관례 대 설정"의 접근 방식에 있습니다.
'Daily' 카테고리의 다른 글
[자바의 입출력스트림] InputStream, OutputStream, Reader, Writer, (0) | 2023.07.26 |
---|---|
컴파일(Compilation)과 링크(Linking), ClassPath(환경변수) (0) | 2023.07.09 |
[Daily 07] Web server와 Was, Stack과 Queue, Array와 Linked List 자료구조 (0) | 2023.06.08 |
[Daily06] Transaction, TCP와 UDP (1) | 2023.06.07 |
[Daily05] RestTemplate와 WebClient, @SpringBootTest와@WebMvcTest (0) | 2023.06.05 |