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 파일을 원격 저장소로 업로드
✅ 참고블로그
[Spring] 빌드 도구 부터 알고보자
빌드가 뭐죠?
velog.io
'BackEnd > Spring' 카테고리의 다른 글
[Spring] DI (Dependency Injection) with XML Configuration (0) | 2025.03.14 |
---|