[Spring Boot] Maven과 Gradle의 차이

JuJaeng2·2023년 11월 11일

IntelliJ를 사용하여 웹 프로젝트를 생성하면 다음과 같은 화면을 볼수 있다.
그중 Build system을 보면 Maven과 Gradle이 있는데 이 둘은 뭘까..?

🛠️빌드관리 도구(Build Tool)

Maven 과 Gradle은 모두 빌드관리 도구이다.

빌드(Build)

빌드는 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 결과를 말한다. 즉 우리가 작성한 소스코드, 프로젝트에서 쓰인 각각의 파일 및 자원을 jvm이나 톰캣 같은 WAS가 인식할 수 있도록 패키징하는 과정 및 결과물을 말한다.

빌드 도구(Build Tool)

빌드 도구란, 소스코드에서 애플리케이션을 생성하면서 여러가지 외부 라이브러리를 사용하는데, 빌드 관리도구는 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동을 관리한다.

빌드 도구가 수행하는 작업

  • 종속성 다운로드 - 전처리(Processing)
  • 소스코드를 바이너리 코드로 컴파일(Compile)
  • 바이너리 코드를 패키징(Packaging)
  • 테스트 실행(Testing)
  • 프로덕션 시스템에 배포(Distribution)

이런 작업을 해주는 것들이 처음에 말한 MavenGradle인 것이다.

✅Maven

정의

Maven은 Java전용 프로젝트 관리 도구로, Lifecycle관리 목적 빌드 도구이며, Apache Ant의 대안으로 만들어졌다.

💡 Apache Ant
▶️ xml 기반의 스크립트를 사용, 유연하고 자유도가 높음 ⇒ 때론 관리에 어려움이 있다.
▶️ 규칙, 표준이 없어 무한한 커스텀 가능 ⇒ 난이도가 높음
스크립트 정형화 X ⇒ 유지보수 어려움
** 외부 라이브러리 관리 불가

특징

  • Lifecycle 관리 도구
    • 정해진 Lifecycle에 의하여 작업을 수행

    • 전반적인 프로젝트 관리 기능을 포함

      <라이프 사이클>

      clean → validate → compile → test → package → verify → install → site → deploy

    • clean : 빌드 시 생성되어있었던 파일들을 삭제

    • validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인

    • complie : 프로젝트 소스코드를 컴파일

    • test : 단위 테스트를 수행, 테스트 실패 시 빌드 실패로 처리하며 스킵 가능

    • package : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 파일의 배포를 위한 패키지로 만듦

    • verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인

    • site : 프로젝트 문서와 사이트 작성, 생성

    • deploy : 만들어진 package를 원격 저장소에 release( Apache Ant에서는 remote repository에release하는 것이 불가능했었다.)

  • Maven은 필요한 라이브러리를 pom.xml에 정의한다. (프로젝트 모델링)

    pom(Project Object Model)이 담고있는 것들

    • 프로젝트 정보 : 프로젝트 이름, 라이센스
    • 빌드 설정 : 소스, 리소스, 라이프 사이클 별 실행한 plugin 등 빌드관련 설정
    • 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로필 정보
    • pom연관 정보 : 의존 프로젝트, 모튤, 상위 프로젝트 등

✅Gradle

정의

Maven을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴
Ant Builder와 Grooby script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용가능하며 스프링부트와 안드로이드에서 사용

❇️ 빌드 속도가 Maven에 비해 10 ~ 100배 가량 빠르고, Java, C/C++, Python등을 지원한다.

💡 **Groovy** JVM에서 실행되는 스크립트 언어 JVM에서 동작하지만 소스코드를 컴파일 할 필요 없음 Java와 호환되며, Java class file들을 Groovy class로 사용 가능하다 Java 문법과 유사하여 빌드 처리를 관리할 수 있다.

특징

  • 가독성이 좋다 : 코딩에 의한 간결한 정의가 가능 ⇒ 가독성 좋음
  • 재사용에 용이 : 설정 주입 방식(Configuration Injection)을 사용하므로 재사용에 용이
  • 구조적인 장점 : Build Script를 Groovy기반의 DSL(Domain Specific Language)를 사용하여 코드로서 설정 정보를 구성하므로 구조적인 장점이 있다.
  • 편리함 : Gradle 설치 없이 Gradle wrapper를 이용하여 빌드를 지원

    💡 Gralde wrapper
    환경에 상관 없이 프로젝트에서 제공하는 환경으로 빌드할 수 있도록 해주는 Gradle 내장 task
    명시된 Gradle 버전을 호출하고 명시된 버전의 gradle이 없을 경우 자동으로 다운로드 및 설치하여 빌드를 해주는 스크립트
    즉, 수동 설치 프로세스를 수행할 필요가 없어진다 ⇒ 짱 편리해짐

  • 멀티 프로젝트 : Gradle은 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구
  • 지원 : Maven을 완전 지원

Maven VS Gradle

  • 스크립트 길이와 가독성 면에서 Gradle이 우세
  • 빌드와 테스트 실행 결과 Gradle이 더 빠름
    • Gradle은 캐시를 사용하므로 테스트 반복시 실행 겨로가 시간의 차이가 더 커진다.

  • 의존성이 늘어날 수록 스크립트 품질의 차이가 커진다. Maven은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속 받아야하지만, Gradle은 설정 주입(Configuration Injection) 방식을 사용하므로 멀티 프로젝트에 적합하다.

마무리🙂

Maven과 Gradle에 대한 전반적인 개념을 알아보았다.
사실 아직 나에게는 빌드가 빠르고 테스트 속도가 빠르다는 것 외에는 와닿는 점이 없다… ㅎㅎ
아직 규모있는 프로젝트를 진행해보지 않았고 이제 막 입문했기 때문에 체감하려면 시간이 좀 걸릴것으로 보인다. 하지만 지금 미리 큰틀만이라도 알고 있으면 실제로 차이를 실감할때 더 극대화되고 기억에 오래남을 것이라고 생각된다.
내용을 정리하면서 100프로 이해하지는 못했지만 이해 못한 부분은 다시 차근차근 공부해 나가보도록 하겠다.

추가 공부 필요한 부분

  • DSL
  • Groovy script
profile
다 잘하고 싶은 개발자

0개의 댓글