Spring 프로젝트를 생성하는데
빌드 도구를 Maven으로 할지, Gradle로 할 지 선택을 해야되는데
이 두개의 차이가 뭔지 궁금해서 찾아보고 정리하기로 했다
1. 빌드(Build)란?
소스코드 및 프로젝트에 쓰인 각각의 파일 및 자원 등을
JVM이나 WAS가 인식할 수 있는 구조로 패키징하는 과정 및 결과물을 말한다.
2. 빌드 관리 도구(Build Tool) 란?
프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램
소스코드를 실행 가능한 어플리케이션으로 만들어주는 도구이다
계속해서 늘어나는 라이브러리, 프로젝트 진행 중 라이브러리 버전 동기화의 어려움을 해소해준다.
즉 빌드 과정을 자동화하여 관리해주는 역할을 한다!
특징
빌드 도구의 특징은 개발자가 스크립트를 작성하여 다양한 작업을 수행할 수 있게 한다
소스코드를 컴파일 하거나 패키징 할 수 있으며, 테스트를 자동으로 수행하거나 의존성 주입 및 배포 작업을 할 수 있다
종류에 따라 스크립트 작성 시 사용하는 문법이 다른데 일반적으로 XML이나 특정 도메인 언어를 사용한다.
빌드 도구의 종류에는 앤트(Ant), 메이븐(Maven), 그래들(Gradle) 등이 있다.
기본적으로 빌드 자동화는 다음과 같은 정형화된 다양한 작업을 스크립팅 하거나 자동화 하는 행위이다
1. 종속성 다운로드
2. 소스코드를 바이너리코드로 컴파일
3. 바이너리 코드를 패키징
4. 테스트 실행
5. 프로덕션 시스템에 배포
빌드 관리 도구를 사용하는 이유는?
대규모 프로젝트에서 빌드 프로세스를 수동으로 호출하는 것은 실용적이지 못하다
무엇을 빌드할지, 어떤 순서로 할지, 어떤 의존성이 있는지 모두 추적하기 쉽지 않기 때문이다
빌드 도구를 사용하면 이를 일관되게 할 수 있다.
3. Maven 이란?
아파치 라이센스로 배포되는 오픈소스 소프트웨어
Java 전용 프로젝트 관리 도구로, 라이프사이클(LifeCycle) 관리 목적 빌드 도구이다
Apache의 Ant 대안으로 만들어졌다
특징
필요한 라이브러리를 pom.xml에 정의해 놓으면, 해당 라이브러리는 물론 라이브러리가 작동하는데 필요한 다른 라이브러리까지 관리한다.
간단한 설정을 통해 배포 관리가 가능하다.
Lifecycle 관리 도구로, 정해진 라이프사이클에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있으며
다음과 같은 Lifecycle을 가진다
Maven은 필요한 라이브러리를 pom.xml에 정의하며, 이를 프로젝트 모델링이라 한다.
프로젝트 기본 정보
<modelVersion>4.0.0</modelVersion>
pom.xml 파일 양식의 버전 정보이며, 5.0.0은 아직 나오지 않았다.
<groupId>com.회사이름</groupId>
다른 프로젝트들과 구별되는 유니크한 패키지 이름
관례적으로 범위가 큰 것부터 작은 것 순으로 기술한다
ex) com.naver
<artifactId>모듈이름</artifactId>
프로젝트에서 생성되는 jar, war 파일 등의 이름을 의미
<version>artifact의 버전</version>
프로젝트에서 생성되는 artifact의 버전을 의미
기본값으로 설정된 0.0.1-SNAPSHOT은 아직 개발 중이라는 뜻.
<packaging>artifact의 포맷</packaging>
프로젝트에서 생성되는 artifact의 파일 포맷을 의미. ex) jar, war
<properties>...</properties>
프로퍼티
property는 값을 가진 상수라고 생각하면 된다.
property에 명시된 값들은 pom.xml에서 ${propertyname}의 형태로 참조할 수 있다.
<repositories>...</repositories>
라이브러리를 받아올 저장소를 지정.
<dependencies>...</dependencies>
- 의존성은 POM에서 가장 중요한 요소이다. (일관성 있는 프로젝트 관리가 가능해지기 때문)
- Maven은 dependencies 요소에 명시된 의존성을 가져와주고(자동 다운로드), 해당 의존성이 의존하는 또다른 의존성(transitive dependencies)까지 가져와주기 때문이다.
- 외부 라이브러리 jar 파일을 일일이 다운 받아 관리하던 것에서 아주 개선된 방식.
<build>...</build>
프로젝트 빌드에 사용될 여러가지 플러그인 목록.
4. Gradle 이란
Maven을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴이며,
Ant Builder와 Groovy script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용가능하며
스프링부트와 안드로이드에서 사용된다.
빌드 속도가 Maven에 비해 10~100배 가량 빠르며, Java, C/C++, Python 등을 지원한다.
Gradle은 기존의 빌드 도구와는 다르게 XML 파일을 사용하지 않는다. JVM 위에서 동작하는 Groovy나 Kotlin을 통해 작성한다. 이로 인해 많은 차이점을 불러오게 됐다.
Maven의 pom.xml은 선언형으로 설정하는 정적인 문서이다. 반면에 Gradle의 build.gradle은 스크립트로 작성하는 동적인 소스 파일이다. 즉 Maven은 정적인 문서와 엄격한 규칙으로 인해 어떤 설정이 필요할 때 한계가 있지만 Gradle은 로직을 넣을 수 있으니 한계가 없다. 필요하다면 로직 안에 플러그인을 호출하거나 직접 코드를 짜면 된다.
Groovy
Groovy는 JVM에서 실행되는 스크립트 언어이다.
JVM에서 동작하지만 소스코드를 컴파일할 필요 없다.
Java와 호환되며, Java class file들을 Groovy class로 사용 가능하다.
Java 문법과 유사하여 빌드 처리를 관리할 수 있다.
특징
- 가독성이 좋다 : 코딩에 의한 간결한 정의가 가능하므로 가독성이 좋다.
- 재사용에 용이 : 설정 주입 방식(Configuration Injection)을 사용하므로 재사용에 용이하다.
- 구조적인 장점 : Build Script를 Groovy 기반의 DSL(Domail Specific Language)를 사용하여 코드로서 설정 정보를 구성하므로 구조적인 장점이 있다.
- 편리함 : Gradle 설치 없이 Gradle wrapper를 이용하여 빌드를 지원한다.
- 멀티 프로젝트 : Gradle은 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다.
- 지원: Maven을 완전 지원한다.
4. Maven과 Gradle의 차이
1. 스크립트 길이와 가독성 면에서는 Gradle이 우세하다
2. Build와 테스트 실행 결과 Gradle이 더 빠르다
- Gradle은 캐시를 사용하기 때문에 테스트 반복 시 실행 결과 시간의 차이가 더 커진다
3. 의존성이 늘어날 수 록 스크립트의 품질의 차이가 커진다
- Maven은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속 받아야하지만, Gradle은 설정 주입 방식을 사용하므로 멀티 프로젝트에 적합하다
'Framework(Library) > Spring(Springboot)' 카테고리의 다른 글
[스프링부트 입문] 시리즈 #02 정적페이지 만들고 화면 띄우기 (0) | 2023.08.31 |
---|---|
[스프링부트 입문] 시리즈 #01 프로젝트 생성하기 (0) | 2023.08.30 |
스프링 빈(Spring Bean)이란? (0) | 2023.08.04 |
[SpringBoot] 이클립스에서 Test Case 만들기 (0) | 2023.07.27 |
MVC패턴 (0) | 2022.01.13 |