Web/Spring & Spring Boot

🍃 Maven & Gradle이란?

개발자 오리 2025. 4. 21. 22:31

📢 들어가면서

 

start.spring.io를 사용해서 한번이라도 Project Setting을 해봤다면 Project 부분의 Gradle과 Maven이라는 것을 본 적 있을 것이다. 그때 당시에는 아무것도 모르고 강의에서 알려주는 대로 설정을 했지만 이번엔 무엇을 뜻하는 건지 자세히 알아보려한다!

 

 

✏️ 빌드 관리 도구란?

📌 빌드란?

빌드 관리 도구를 알기 위해선 빌드라는 것이 무엇인지 먼저 알 필요가 있다. 빌드란 소스코드 파일을 컴파일에서 실행할 수 있게 변환하는 과정 또는 결과물을 뜻한다.

조금 더 쉽게 얘기를 해보자면 내가 작성한 코드를 실제 기기에서 실행될 수 있는 소프트웨어로 변환하기 위한 과정을 말하는 것이다. 보통 컴파일을 포함한 배포하기 직전까지의 모든 과정을 “빌드한다”라고 표현한다. 이는 보통의 과정이며 각 회사나 팀마다 조금씩 다르게 사용할 수 있으니 참고만..

 

📌 정의는?

자 그렇다면 이 빌드 관리 도구란 무엇일까? 위에서 설명한 빌드를 관리할 수 있도록 하는 도구라고 생각하면 된다.

즉, 소프트웨어 개발에 있어서 소스 코드를 실행 가능한 애플리케이션으로 만들어주는 도구이며 이 빌드 과정을 자동화하여 관리하기 때문에 빌드 관리 도구 또는 빌드 자동화 도구라고 불린다.

 

📌 사용하는 이유는?

이 빌드 관리 도구를 우리가 사용하는 이유는 무엇일까?

실제 대규모 프로젝트에선 빌드 프로세스를 수동으로 호출하는 것이 실용적이지 않다. 무엇을 어떤 순서로 빌드할지, 어떤 의존성을 가지고 있는지 모두 추적하는 것은 불가능에 가깝기 때문이다. 하지만 빌드 도구를 사용하게 된다면 이를 일관되게 할 수 있다.

또한 개발자가 스크립트를 작성하여 다양한 작업을 수행할 수 있게 한다. 예를 들어 소스 코드를 컴파일하거나 패키징할 수 있으며, 테스트를 자동으로 수행하거나 의존성 주입 및 배포 작업을 할 수 있다.

 

📌 종류는?

종류보다는 역사의 느낌으로 생각해주면 좋을 것 같다. 제일 먼저 나온 빌드 도구들부터 순서대로 알아보자.

  1. make
    소프트 웨어 개발을 위해 유닉스 계열 운영 체제에서 주로 사용되는 프로그램 빌드 도구이다.
    여러 파일들끼리 의존성과 각 파일에 필요한 명령을 정의하여 프로그램을 컴파일하며 이렇게 최종 프로그램을 만들 수 있는 과정을 서술한 파일(Makefile이라는 파일명을 주로 사용한다)을 make가 해석하여 프로그램 빌드를 수행한다.

  2. Ant
    Another Neat Tool의 약자로 자바 프로그래밍 언어에서 사용하는 자동화된 소프트웨어 빌드 도구이다.
    Java에 make를 도입하려고 하니 문제가 생겼고 이를 해결하기 위해서 Ant가 등장했다.}
    XML 기반 스크립트를 사용하였으며 규칙과 표준이 없어 높은 자유도를 지닌다. 하지만 그만큼 직접 정의해야할 것이 많아져 오히려 사용이 어렵다는 단점이 있다.

  3. Maven
    Java 전용 프로젝트 LifeCycle 관리 목적 빌드 도구이다.
    Ant의 불편함을 해결하기 위해서 만들어졌으며 스프링에서 사용이 된다.
    이 부분에 대해서는 아래에서 조금 더 자세히 다루겠다.

  4. Gradle
    가장 최근에 나온 Java 빌드 도구로 Groovy(그루비) 문법을 사용한다.
    대규모 프로젝트에서 복잡해지는 경향이 있는 XML 기반 스크립트에 비해 관리가 편하다는 장점이 있다.
    이 부분에 대해서도 아래에서 조금 더 자세히 살펴보도록 하자.

 

 

🖋️ Maven이란?

이제 블로그의 주제인 Maven과 Gradle 중 Maven에 대해서 다뤄보도록 하겠다.

 

📌 정의는?

위에서도 간단하게 설명을 했지만 Maven은 Java 전용 프로젝트 LifeCycle 관리 목적 빌드 도구이다. 이 Maven은 Apache Ant의 스크립트 작성이 많고, 라이브러리 의존 관리가 어렵다는 문제점을 해결하기 위한 대안으로 제작이 되었다.

 

💡 LifeCycle이란?
단어의 뜻 그대로 해석하자면 생명 주기라고 할 수 있다. 그 중 소프트웨어 생명 주기는 초기 개발 단계부터 마지막 출시까지 모두를 아우르는 것을 뜻한다. Maven에서는 미리 정해진 빌드 순서를 뜻한다.

 

📌 특징은?

Maven의 대표적인 특징으로는 총 3가지가 있다.

  1. LifeCycle
  2. Maven은 정해진 LifeCycle에 의하여 작업을 수행하고 전반적인 프로젝트 관리 기능을 포함한다.
  3. 프로젝트 모델링
  4. Maven은 필요한 라이브러리를 pom.xml에 정의한다.
  5. 플러그인을 통한 전역적인 재사용
  6. Maven은 빌드에 대한 대부분의 책임을 각 플러그인에 위임하며 플러그인들은 Maven 저장소에 저장이 된다.

 

📌 LifeCycle은?

위에서도 잠깐 얘기를 했지만 Maven에는 동작 방식이 정해져있고 미리 정의하고 있는 빌드 순서가 있으며 이를 LifeCycle이라고 한다.

  • Default(Build) LifeCycle : 일반적인 빌드 프로세스를 위한 모델
    • Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
    • Compile : 프로젝트의 소스코드를 컴파일하는 단계
    • Test : 단위(유닛) 테스트를 수행하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)
    • Package : 실제 컴파일된 소스코드와 리소스들을 jar, war 등의 팡일로 배포를 위한 패키지로 만드는 단계
    • Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
    • Install : 패키지를 로컬 저장소에 설치하는 단계
    • Deploy : 만들어진 package를 원격 저장소에 release 하는 단계
  • Clean LifeCycle
    • Clean : 빌드 시 생성되었던 파일들을 삭제하는 단계
  • Site LifeCycle
    • Site : 프로젝트 문서와 사이트 작성, 생성하는 단계

 

최종 빌드 순서는 [Compile] → [Test] → [Package] 이다.

Compile : src/main/java 디렉토리 아래의 모든 소스코드가 컴파일됨

Test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스코드 컴파일됨

이때 단위 테스트 프레임워크 JUnit을 사용하여 테스트 단계를 거치기 위해 의존 설정을 해줌

Package : 컴파일과 테스트가 완료된 후 jar, war 과 같은 형태로 압축

 

💡 Phase란?
다른 블로그를 살펴보면 Phase 라는 단어를 사용하는데, Phase는 LifeCycle의 각 단계를 Phase라고 하며, 이 Phase는 의존관계를 가지고 있어 해당 Phase가 수행되기 위해선 이전 Phase들이 모두 수행이 되어야 한다. 즉, 모든 빌드 단계는 이전 단계가 성공적으로 실행되었을 때 실행이 된다 ⇒ 이를 의존(Dependency)라고 한다.

 

 

📌 POM이란?

Maven의 다른 특징 중 하나인 설정을 pom.xml에 저장한다고 하는데, 이 pom이 무엇일까?

POM은 Project Object Model의 약자로 말 그대로 Project Object Model의 정보를 담고 있는 것이다. 즉 모든 설정을 저장하는 pom.xml 파일을 POM이라고 한다. pom.xml의 파일명을 보면 알 수 있듯이 XML의 형태로 저장이 된다.

XML이 무엇인지 궁금하다면 여기로

 

Maven의 기능을 이용하기 위해서 POM이 사용이 되는데 이 POM은 프로젝트마다 1개만 존재하며 pom.xml 만을 사용해서 프로젝트의 설정과 의존성을 알 수 있다. 때문에 이 pom.xml 파일이 있어야 빌드가 가능하다.

이 POM에 들어갈 정보들은 매우 많다. 프로젝트마다 1개만 존재하는 파일이며 모든 정보가 들어가있기 때문이다. 그래도 대표적으로 예시를 들어보자면

  • 기본 정보 : 프로젝트 정의, 연관 정보
  • 프로젝트 정보 : 프로젝트 이름, 개발자 목록, 라이센스 등
  • 빌드 설정 : 소스, 리소스, LifeCycle별 실행 가능한 플러그인 등 빌드와 관련된 설정
  • 빌드 환경 : 사용자의 환경 별로 달라질 수 있는 프로파일 정보
  • POM 연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

등이 있다.

 

 

🖌️ Gradle이란?

이번엔 블로그의 주제 중 나머지 하나인 Gradle에 대해서 알아보자.

 

📌 정의는?

Groovy 기반의 오픈소스 빌드 자동화 툴이며 안드로이드 앱을 만들 때 필요한 빌드 시스템이기도 하다. Java와 C/C++, Python 등도 역시 지원한다.

이 Gradle은 Maven을 대체할 수 있는 범용 툴이며 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용할 수 있으며 Spring Boot와 안드로이드에서 사용이 된다.

 

💡 Groovy란?
Java에 Python이나 ruby의 특징을 더한 동적 객체 프로그래밍 언어 JVM(자바 가상 머신)에서 동작하지만 소스코드를 컴파일 할 필요가 없으며 Java와 문법도 가깝고 호환도 잘되는 간편하게 사용하는 Java라고 생각할 수 있다.

 

 

📌 특징은?

Gradle에는 특징이자 장점으로 불리는 3가지가 있다.

  1. 간결한 스크립트
    Ant와 Maven은 XML 문법으로 스크립트를 작성하였다. 여기에서도 작성을 했지만 XML은 태그 문법이 있어서 스크립트가 복잡해질수록 장황해지고 가속성이 떨어진다는 단점이 있다. 그러나 Gradle은 Groovy 문법을 사용하여 간결한 스크립트를 작성할 수 있다.

  2. 빌드 속도
    프로젝트의 규모가 커질수록 빠른 빌드 속도가 개발의 생산성에 큰 영향을 끼치게 된다. Gradle은 캐싱(caching)을 하기 때문에 Ant나 Maven보다 빌드 속도가 빠르다는 장점이 있다.

  3. 멀티 프로젝트 빌드
    대규모의 자바 프로젝트는 대부분 하나의 프로젝트 안에서 여러 모듈이 동시에 개발이 되고, 각 모듈이 공통으로 사용하는 모듈도 만들어지게 된다. 이때 따로 빌드 작업을 하는 경우 번거로울 뿐만 아니라 실수가 발생할 수 있다. 이 멀티 프로젝트 빌드 기능을 통해 번거로움과 실수를 줄일 수 있다.

 

💡 캐싱(caching)이란?
파일의 복사본을 임시 저장 위치에 저장하여 보다 빠르게 액세스 할 수 있도록 하는 프로세스

 

📌 프로젝트 구조는?

.
├─ .gradle
│      └─ ..
├─ build.gradle
├─ gradle
│      ├─ gradle-wrapper.jar
│      └─ gradle-wrapper.properties
├─ gradlew
├─ gradlew.bat
├─ settings.gradle
└─ src
├─ main
│     └─ java
│           └─ App.java
└─ test
       └─ java
             └─ AppTest.java

 

위의 구조는 Gradle 프로젝트의 기본 구조이다.

하나하나 살펴보면

.gradle 디렉토리는 Gradle이 사용하는 폴더로 작업(Task) 파일이 저장이 된다. 이때 Task란 Gradle의 실행 작업 단위이다. 우리가 해당 내용을 편집하는 일은 거의 없다.

 

gradle 디렉토리는 Gradle이 필요한 경우 gradle-wrapper 관련 디렉토리이다. gradlew, gradlew.bat 을 이용하여 빌드할 경우 gradle-wrapper 파일을 이용한다. 이때 gradlew과 gradlew.bat은 gradle-wrapper 실행 명령어이며, 각각 Mac과 Window에서 사용된다.

 

settings.gradle은 이름에서도 알 수 있듯이 프로젝트에 대한 설정 정보를 작성하는 파일이다.

 

build.gradleGradle 기본 빌드 설정 파일이며 우리가 프로젝트를 사용할 때 이곳에 의존성이나 여러 빌드 처리 내용을 작업하게 된다. 만일 이곳에 의존성이 없다면 프로젝트에서 빌드가 되지 않기 때문에 오류가 발생할 수 있다. 따라서 개발을 하다보면 자주 들어가게 될 파일이라고 생각하면 된다.

 

src은 프로젝트에서 만든 프로그램 관련 디렉토리로 프로젝트에서 사용하는 소스 코드나 리소스가 여기에 해당한다. 우리는 프로젝트를 만들어서 src 디렉토리에서 비즈니스 로직을 짜게 되는 것이다.

 

📌 동작 원리는?

Gradle의 구조에 대해서 살펴봤으니 이번에는 동작 원리에 대해서 살펴보자!

build.gradle은 파일 자체가 Project Object이다. Project Object란 Project 단위에서 필요한 작업을 수행하기 위해 모든 Method(함수)와 properties(속성)을 모아놓은 객체라고 생각을 하면 된다.

 

이때 메소드 중에서 대표적인 것은 plugins, repositories, dependencies, application 등이 있다.

// 프로젝트에서 사용하는 Gradle 플러그인 설정
plugins {
    id 'java'
    ..
}

// 프로젝트 생성 시 GroupId, Application 버전, Java 버전
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

// 필요한 라이브러리를 다운로드할 저장소 설정
// 공개 저장소(jcenter)와 Apache Maven 중앙 저장소(mavenCentral) 이용
repositories {
    mavenCentral()
}

// 의존 라이브러리 설정
dependencies {
    // compile, api: 의존 라이브러리 수정시 본 모듈을 의존하는 모듈들도 모두 재빌드 (api로 사용을 권장)
    //               A(api) <- B <- C 로 의존하는 구조라면, A 수정 시 B,C 모두 빌드
    // implementation: 의존 라이브러리 수정시, 해당 모듈을 직접 의존하는 모듈만 빌드 (비교적 빠름)
    //               A(implementation) <- B <- C 로 의존하는 구조라면, A 수정 시 B 만 빌드
    // compileOnly: 컴파일시에만 의존하고, 빌드 결과물에는 포함하지 않음 (runtime시 필요없는 라이브러리)
    // runtimeOnly: runtime 시에만 필요한 라이브러리
    // testCompile: test에서만 적용되는 compile 속성
    // testImplementation: test에서만 적용되는 implementation 속성
    // testCompileOnly: test에서만 적용되는 compileOnly 속성
    // testRuntimeOnly: test에서만 적용되는 runtimeOnly 속성
    // annotationProcessor: 어노테이션 기반 라이브러리를 컴파일러가 인식하도록 함 (lombok, queryDSL 등)
    ..
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

 

🖍️ 차이점은?

이렇게 열심히 두가지에 대해서 알아봤으니 두가지를 한번에 살펴보면서 비교를 해보자!

 

Maven보다 Gradle이 속도가 빠르다!

 

Maven은 XML을 사용하고 Gradle은 Groovy를 사용한다!

XML은 가독성이 떨어지지만 Groovy는 가독성이 좋다!

 

Maven은 pom.xml 파일에 작성을 하고 Gradle은 build.gradle에 작성을 한다!

 

지금 보면 알겠지만 사실 Gradle에 대한 칭찬밖에 없다. 이유는 결국 Gradle은 간결하며 가독성이 좋고 성능이 좋기 때문이다.

그럼 개발자들은 Gradle을 많이 쓰는가? 놀랍게도 그렇지 않다..

 

그 이유는 Maven이 익숙하기 때문이다. Maven과 XML은 개발자들이 이전부터 사용을 해왔기에 매우 익숙하다. 그러나 Gradle과 Groovy는 아직 그렇게 익숙하진 않다. 따라서 익숙한 것을 버리고 새로운 것을 배우는 것이 효율적이지 않다는 생각에 아직은 Maven의 사용량이 높다.

 

그러나, 우리가 알아둬야할 것이 있다. Gradle은 Maven보다 성능이 뛰어나고 우리는 XML에 익숙하지 않다는 것이다. 따라서 이미 XML과 Maven이 익숙한 개발자들이 아니라면 Gradle에 대해서 차근차근 알아두는 것이 나중을 위해서 훨씬 좋을 것이라 생각이 든다..!

 

 

🪄 정리하자면

빌드 관리 도구는 빌드 과정을 자동화하여 관리하는 도구이다!

Maven은 XML 스크립트로 pom.xml 파일에 작성한다!

Gradle은 Groovy 스크립트로 build.gradle 파일에 작성한다!

Maven보다 Gradle이 성능이 더 좋다!

'Web > Spring & Spring Boot' 카테고리의 다른 글

🍃 WAR & JAR란?  (1) 2025.04.27
🍃 JSP란?  (1) 2025.04.23
🍃 Servlet이란?  (1) 2025.04.22
🍃 Spring & Spring Boot란?  (1) 2025.04.20