BackEnd/Spring

[Spring] Maven, build-tool에 대한 정리

guineaa 2025. 3. 13. 20:27

spring initializer에서 처음 스프링 프로젝트 환경 설정을 할때

이런 화면에서 Project 빌드 툴을 설정할 수 있다.

이 빌드 툴들이 정확히 어떤 역할을 하는지에 대해 Maven을 위주로 정리해 보았다.

✅ 빌드 도구

Spring initializr에서 프로젝트를 생성할 때 Gradle-Groovy, Gradle-Kotlin, Maven 중 하나를 선택할 수 있다.

이들은 빌드 도구 (build tool)으로 프로젝트의 의존성 관리와 빌드 과정을 자동화 하는 역할을 하는데,

어떤 것을 선택하느냐에 따라서 빌드 방식과 설정 파일의 문법이 달라진다.

 

개발자가 작성한 소스 코드를 실행할 수 있는 독립적인 형태 (.war, .jar)로 변환하는 과정 및 결과를 빌드라고 말한다.

변환하는 과정에는 컴파일 과정도 포함되어있다.

 

예를 들어, 개발자가 이클립스나 인텔리제이와 같은 IDE로 java 코드를 작성하면 개발자는 '실행' 버튼을 눌러서 코드의 결과물을 볼 수 있다.

그런데 개발자가 아닌 사용자가 코드의 결과물을 보려면? 

사용자가 JAVA를 설치하고 IDE를 설치하고 해당 코드를 가져와 실행을 누를일은 없다.

 

사용자는 어떠한 형태로든 빌드 된 결과물 (.war, .jar 등)을 실행만 하면 된다.

그리고 이런 빌드 결과물을 실제 서버에 업로드하는것이 배포이다.

 

만약 java 프로젝트가 하나 있다고 하면, 해당 프로젝트에는 개발자가 작성한 ~~.java 파일들이 있을 것이고,

여러가지 정적 파일들을 관리하는 resource 파일들이 있을 것이다.

 

이 프로젝트를 빌드한다면, .java 파일을 .class 파일로 컴파일하고, resource 파일들을 .class를 참조할 수 있는 위치를 옮기는 등, 여러 데이터들을 압축하는 과정을 거쳐 하나의 결과물로 나올 것이다.

 

빌드(Build): 프로젝트의 소스코드 개발에서 최종 사용자에게 전달되기 까지의 모든 과정 (프로젝트 생명주기)를 아우르는 행위

 

이런 빌드를 자동화해서 도와주는 도구가 빌드 툴 이다.

 

그렇다면 왜 빌드 툴을 사용할까?

아니 만약 개발자가 빌드 툴을 사용하지 않고 개발자가 직접 프로젝트를 빌드 해야 한다면???

개발자는 프로젝트에 필요한 수많은 라이브러리들을 다운받고, 라이브러리에 대한 의존성도 수동으로 잡아주고, 컴파일하고, 테스트하고, 실행파일로 만들고....... 프로젝트 환경을 설정하는데 한 세월을 쏟을 것이다.

 

그런데! 빌드 툴은 이러한 과정들을 자동화 시켜준다.

빌드 툴: 빌드 자동화를 도와주는 프로그램

✅ 1. Maven vs Gradle

🔷 Maven (pom.xml)

- xml 기반의 빌드 도구

- 정형화된 구조(마크업 언어)로 가독성이 좋지만, 설정이 길어질 수 있음

- pom.xml 파일에서 의존성 (dependencies)를 설정

 

- 라이브러리를 자동으로 추가, 관리 및 라이브러리 버전을 자동 동기화

- 프로젝트의 정보 전달 및 라이프 사이클 관리

 

* XML (eXtensible Markup Language): 마크업 언어로 표현 된 데이터 전달 언어

 

🔹Maven 설정 예제 (pom.xml)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.5.2</version>
    </dependency>
</dependencies>

 

🔷 Gradle (build.gradle)

- 가장 최근에 나온 Maven과 같이 빌드 자동화를 도와주는 빌드 도구

- 프로젝트 설정을 위해 groovy 언어를 사용한다. 스크립트 언어를 사용하기 때문에 유연하게 빌드 스크립트를 작성할 수 있다.

- Maven의 pom.xml 파일과 같은 build.gradle 파일에 groovy언어로 의존성과 플러그인 설정과 같은 빌드에 필요한 설정을 작성할 수 있다.

- Maven보다 최대 100배 빠르고 Wrapper를 통해 Gradle이 설치되지 않은 환경에서도 빌드 가능하다.

 

* Gradle.Wrapper: 환경에 상관없이 Gradle 빌드를 수행할 수 있도록 하는 내장 task. Java나 Gradle이 설치되어 있지 않아도 빌드 가능.

 

🔹Gradle (Groovy) 설정 예제 build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.5.2'
}

 

🔹Gradle (Kotlin) 설정 예제 build.gradle.kts

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web:2.5.2")
}

✅ 2. Gradle-Groovy vs Gradle-Kotlin

- Gradle를 사용할 때 설정 파일을 Groovy 문법으로 작성할 수도 있고 Kotlin 문법으로 작성할 수도 있다.

둘다 기능은 동일하지만 문법 스타일이 다르다.

 

🔹Gradle-Groovy

- 기본적으로 Groovy DSL 사용

- 기존 Gradle 프로젝트와 호환성 높음

- 문법이 유연하지만 타입 안정성이 부족

plugins {
    id 'org.springframework.boot' version '2.5.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

🔹Gradle-Kotlin

- Kotlin DSL를 사용

- 정적 타입 지원으로 IDE 자동 완성 기능이 강력함

- 코틀린 기반 프로젝트에서는 Gradle-Kotlin이 더 적합함

plugins {
    kotlin("jvm") version "1.6.21"
    kotlin("plugin.spring") version "1.6.21"
}
dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
}

 

비교 항목 Maven Gradle-Groovy Gradle-Kotlin
설정 파일 XML (pom.xml) Groovy (build.gradle) Kotlin (build.gradle.kts)
빌드 속도 느림 빠름 빠름
가독성 길고 정형화 짧고 유연 짧고 정적 타입 지원
확장성 적당한 편 높음 높음
자동완성 지원 부족함 중간 강력함

Gradle-Kotlin은 정적 타입 언어, 런타임에 타입을 결정하는 동적타입과 달리 컴파일 시 타입을 체크하는 정적 타입 지원이기 때문에 더 안정적이고, IDE 자동완성이 더 잘 동작한다.


✅ Maven이란?

Maven은 자바 프로젝트 빌드 및 의존성 관리 도구이다.

- 프로젝트를 자동으로 빌드하고 

- 필요한 라이브러리를 관리하며

- JAR, WAR 같은 산출물을 배포하는 역할을 한다.

Maven을 사용하면 pom.xml에 라이브러리 목록을 적어두는 것만으로 자동으로 필요한 라이브러리를 다운로드하고 설정까지해준다.

1. Maven의 핵심 개념

🔷 POM (Project Object Model)

- pom.xml은 Maven의 가장 중요한 설정 파일이며, 프로젝트에 필요한 빌드 정보를 여기에 적는다.

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>  <!-- 프로젝트 그룹 ID -->
    <artifactId>spring-demo</artifactId>  <!-- 프로젝트 이름 -->
    <version>1.0.0</version>  <!-- 프로젝트 버전 -->
    <packaging>jar</packaging>  <!-- 생성될 파일 유형 (jar, war 등) -->

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

태그 설명
<groupId> 프로젝트의 그룹명 (일반적으로 도메인 기반)
<artifactId> 프로젝트이름
<version> 프로젝트 버전
<packaging> 산출물 종류 (jar, war, ear)
<dependencies> 프로젝트에서 사용할 라이브러리 ㅁ고록
<build> 빌드 관련 설정

2. Maven의 기본 라이프 사이클

Maven은 프로젝트를 관리하는 일련의 단계 즉, 라이프사이클이 존재한다.

compile -> test -> package -> install -> deploy

📌 Maven 실행 방법 

명령어 입력 출력
mvn compile src/main/java의 모든 Java 파일을 컴파일 target/classes/에 .class 파일 생성
mvn test src/test/java의 단위 테스트 실행 테스트 결과 출력 (Surefire report)
mvn package .jar, .war 같은 배포 파일 생성 target/ 폴더에 산출물 생성
mvn install 로컬 저장소(~/.m2/repository)에 배포 다른 프로젝트에서 해당 패키지 사용 가능
mvn deploy 원격 저장소(예: Nexus, Artifactory)에 배포 팀원들과 공유 가능

 

3. Maven 실행 방법

🔷 직접 실행

1. 프로젝트 생성 후 빌드

mvn clean compile package

-> 기존 빌드 결과를 삭제(clean)하고 컴파일(compile) jar 파일(package)생성

 

2. 로컬 저장소에 배포

mvn install

-> target/폴더에 생성된 .jar를 ~/.m2/repository/에 저장

 

3. 원격 저장소에 배포

mvn deploy

-> .jar 파일을 원격 저장소로 업로드

 

 

✅ 참고블로그

https://velog.io/@nopecho/Spring-%EB%B9%8C%EB%93%9C-%EB%8F%84%EA%B5%AC-%EB%B6%80%ED%84%B0-%EC%95%8C%EA%B3%A0%EB%B3%B4%EC%9E%90

 

[Spring] 빌드 도구 부터 알고보자

빌드가 뭐죠?

velog.io

 

'BackEnd > Spring' 카테고리의 다른 글

[Spring] DI (Dependency Injection) with XML Configuration  (0) 2025.03.14