dev_dbdb1114

빌드와 빌드도구 ( Maven과 Gradle ) 본문

프로그래밍/SPRING

빌드와 빌드도구 ( Maven과 Gradle )

dbdb1114 2023. 9. 3. 22:03

개요

Spring이나 SpringBoot를 사용하다보면 Maven과 Gradle을 사용하여 프로젝트를 관리하고 빌드한다. 프로젝트의 종속성 관리, 빌드 프로세스 자동화, 배포, 테스트 실행 등 다양한 작업을 하는 데 도움을 준다. 보통 Spring이나 SpringBoot의 버전, MyBatis, Lombock, Test 등의 의존성을 주입하는데 사용한다. 이런 빌드 도구인 Maven과 Gradle의 차이점에 대해 알아보려 한다.

 

빌드와 빌드도구

빌드

java기반 웹 프로젝트를 실행할 수 있는 독립적인 형태가 되려면 독립적인 형태(.war,.jar)로 만들어야 한다. 이 형태를 만드는 것을 빌드라고 하며, 이 빌드한 파일을 특정 Server에 전송하여 실행시키면 배포가 되는 것이다. 배포 후에는 해당 server의 주소에 우리가 설정한 포트번호를 이용하여 접속할 수 있는 상태가된다. ssh 방식으로 서버에 접속하여 .java [빌드 파일] 이런 명령어를 실행하여 배포 했다. 이렇게 실행해서 배포할 수 있는 단계의 하나의 파일로 만드는 것을 ‘빌드' 라고 한다.

빌드도구

이런 빌드를 도와주는 Tool이다. 난 가끔 프로그래밍 세계에서 쓰는 단어들이 현실에서 쓰이는 단어들과 약간 겹쳐져 헷갈릴 때가 있는데 간단하게 말하면 Spring에서 Maven, Gradle 같은 것을 빌드도구라고 보면 된다. 그럼 빌드 도구에서 어떤 것들을 해주는지 살펴봐야하는데 아래와 같다.

  1. 우리가 등록한 의존성을 알아서 다운로드 해준다.
  2. 테스트를 실행할 수 있게 해준다.
  3. 정형화된 작업의 틀을 제공하기 때문에 실수를 줄일 수 있다.
  4. 조건 분기를 이용하여 환경에 따라 처리를 할 수 있다.
  5. 위의 빌드에 필요한 것들을 알아서 해주는 빌드 자동화 기능을 제공한다.

빌드 도구가 왜 필요한데?

빌드도구가 없으면 위 기능들을 우리가 직접 해야된다. 의존성을 매번 직접 다운로드 해서 연결해야하고, 컴파일도 해야하고, 매번 우리가 처음에 생각했던 방향에서 틀어지진 않았는지 확인해야하며, 빌드 자체를 직접 해야한다. 사실 우리가 당연시 여기고 사용했던 빌드 도구의 역할을 꽤 크다.

Maven vs Gradle ( + Ant )

해당 도구들의 출현 순서를 보면 Ant - Maven - Gradle 순이다. Ant를 쓰다가 조금 더 업그레이드 된 Maven이 나왔고, Ant와 Mave의 단점을 보완한 것이 Gradle이다. 요즘의 추세는 Gradle을 쓰는 경우가 더 많지만 아직 전체 비율을 놓고 보면 Maven을 사용하는 서비스가 더 많다고 한다. 나는 두 가지 모두 써봤는데 개인적으로 Gradle이 더 좋았다. 좀더 프로그래밍화 되어있는 느낌이다. 아무래도 Groovy라는 언어 기반으로 작성되기 때문인 것 같다.

Maven

  1. Apache에서 Ant의 대안으로 개발하였다.
  2. 정해진 라이프사이클에 의하여 작업 수행하며, 전반적인 프로젝트 관리 기능까지 포함한다.
  3. 의존성을 설정하여 라이브러리를 자동으로 관리할 수 있다. ( pom.xml에 라이브러리를 정의해놓으면 된다. )아래와 같이 의존성을 등록하는데, 이 외에도 다양한 태그들이 있다.
/** 의존성 추가 아래와 같이 라이브러리를 등록해두면 알아서 다운받아주며 연동하여 개발할 수 있다. */
<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
</dependencies>
  1. 객체모델(POM)을 도입했다. ( 이는 Ant에서 업그레이드 되면서 설명할 수 있는 개념인 것 같다. )

Gradle - feat.Groovy -

  1. JVM 기반의 빌드도구
  2. Ant와 Maven의 단점을 보완
  3. 오픈소스 기반
  4. Groovy 기반 ( Groovy는 객체 지향 언어로서 컴파일을 하지 않는 스크립팅 언어이다. ) Groovy를 이용한 의존성 등록은 아래와 같이 할 수 있다.
dependencies {
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
}

Maven VS Gradle

위에서 이야기한 것 말고도 여러가지 더 깊은 이야기들이 있지만, 작성자의 한계와 읽는 사람을 생각해서 이 두가지 빌드툴을 간단하게 정리해보았다. 일단 종합적으로 이야기 해보자면 Maven은 xml기반의 설정 파일이고, Gradle은 프로그래밍 언어로 표현한다. 이 특성에서 조금 더 연장해서 이야기 해보자면 xml이라는 것 자체는 JAVA나 JS 같은 프로그래밍 언어가 아니라 HTML을 개선하여 만든 언어이다. 반면 Gradle은 Groovy라는 비교적 최신의 언어를 사용하기 때문에 사용자 정의 면에서 Gradle이 조금더 확장성이 크고 비교적 유연성이 강하다고 볼 수 있다.

더하여 Maven은 대부분 자바 프로젝트에서 사용되고 있다. 애초에 개발한 곳이 Apache에서 개발했으니 Java에 대한 의존성이 Gradle에 비해 높다고 볼 수 있다. 반대로 Gradle은 자바 이외의 더 많은 프로젝트에서 사용되고 있으며, 다양한 언어와 플랫폼을 지원하는 확장성이 뛰어나다. Gradle을 배워두면 다른 언어에서도 Gradle을 사용할 수 있다는 것이다.

성능적인 측면에서 본다면 (이 글에서 따로 언급하진 않았지만) Maven은 중앙 레퍼지토리에서 종속성을 다운로드할 때 메모리 사용량이 높을 수 있고, 빌드 시간이 느릴 때가 있는 반면에 Gradle은 조금 더 효율적인 종속성 관리와 병렬 빌드를 지원하기 때문에 성능적인 면에서 Gradle이 조금 더 좋다.

 

이 외의 여러 비교사항을 아래와 같이 정리할 수 있다.

  1. Gradle이 가독성 측면에서 더 좋다.
  2. Gradle은 초기 프로젝트 설정할 때 또한 비교적 간단한 구문들을 이용하여 개발할 수 있다.
  3. Gradle이 확장성 면에서 더 좋다.
  4. Maven → Gradle 마이그레이션 보다 Gradle → Maven 마이그레이션이 더 간편하고 지원되는 내용이 많다.
  5. 성능적인 측면에서도 Gradle이 조금 더 뛰어나다.
  6. 정형화된 측면은 Maven이 더 강하다고 볼 수 있다. ( 초보 개발자에게는 오히려 확장성이 확보되지 않는 쪽이 공부하기에 더 적합할 수 있다고 생각한다. )
  7. Maven은 오랜 기간에 걸쳐 사용되었기 때문에 많은 개발자와 기업에서 지원하고 있으며, 관련 문서 및 플러그인 등 리소스가 풍부하다.
  8. 표준화된 라이프 사이클이 제공되는 것도 Maven만의 장점이라고 할 수 있다.

마무리

여러가지 면들을 비교했을 때 애초에 Gradle은 Maven과 이전의 빌드툴인 Ant의 단점들을 보완하면서 출시 되었기 때문에 다양한 측면에서 Gradle이 더 좋다. 하지만 잊지 말아야할 점은 아직 Maven을 기반으로 하는 서비스 회사들이 많다는 것이다. Gradle이 더 좋긴 하지만 Maven을 몰라도 되는 것은 아니다.

'프로그래밍 > SPRING' 카테고리의 다른 글

Spring 버전별 특징  (0) 2023.09.05
SpringWebFlux  (0) 2023.09.01
Comments