Maven이 뭘까? 지금부터 알아보자
📌 서론
이전 회사에서 작업을 할 때 SpringFramework3.x.x 버전을 사용하고 Maven을 사용했던 기억이 있다. 이때 첫 프로젝트를 하면서 요즘에는 다 Gradle을 사용하는 추세로 넘어온 것 같은데 Maven을 사용해서 신기했었던 경험이 있다.(신입이었어서 그랬던 것도 있지만 프로젝트 자체가 10년이 넘었다.) 이렇게 퇴사를 하고 잊고 있다가 갑자기 요즘 Gradle을 사용해서 프로젝트의 빌드를 수행하다가 Build.gradle 파일 안에서 의존성을 추가할 MavenBom이라는 코드가 보여서 갑자기 든 생각이 Maven은 왜 만들어졌을까?라는 의문에 정리를 시작했다.
1. Maven 소개
Maven이란 무엇인가?
- Maven은 Apache Software Foundation에서 개발한 자바 프로젝트 관리 자동화 툴이다. 주로 소프트웨어 빌드와 의존성 관리를 위해 사용된다. Maven은 프로젝트의 라이프사이클 전체를 간편하게 관리할 수 있는 표준화된 방법을 제공한다.
Maven의 탄생 배경
- 초기의 자바 개발 환경에서는 각 프로젝트마다 빌드 스크립트를 직접 작성해야 했고, 이는 시간이 많이 걸리고 오류가 잦은 과정이었다. 또한, 프로젝트마다 다른 라이브러리를 사용하면서 버전 충돌 같은 문제가 자주 발생했다.
- Maven은 이러한 문제들을 해결하기 위해 개발되었다. Maven은 중앙 집중식의 저장소를 통해서 의존성 관리를 표준화하고, 빌드 프로세스를 자동화하여 개발자들이 보다 효율적으로 작업할 수 있게 해 준다.
Maven의 범용성
- Maven은 Spring 프로젝트에 국한되지 않고 모든 종류의 자바 프로젝트에 사용될 수 있는 범용적인 도구로 설계되었다. 이는 자바를 사용하는 모든 프로젝트에서의 빌드, 의존성 관리, 문서화를 간소화하고 표준화하는 데 초점을 맞추고 있다. 따라서 Maven은 다양한 자바 프로젝트에서 유연하게 적용되며, 복잡한 프로젝트 구조와 다양한 라이브러리 요구사항을 효과적으로 관리하는 데 도움을 준다.
2. Maven의 주요 기능
프로젝트 빌드 및 테스트
소스 코드 컴파일
- Maven은 자바 소스 파일(.java)을 클래스 파일(.class)로 컴파일하는 작업을 자동으로 수행한다.
- 예시: pom.xml에 maven-compiler-plugin을 설정해 컴파일러 버전을 지정할 수 있다.
- 사용한 코드
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>1.0</version>
<name>My Project</name>
<properties>
<!-- 기타 프로젝트 속성 -->
</properties>
<dependencies>
<!-- 필요한 의존성 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source> <!-- 사용할 자바 버전 -->
<target>17</target> <!-- 타겟 자바 버전 -->
</configuration>
</plugin>
<!-- 기타 필요한 플러그인 -->
</plugins>
</build>
</project>
테스트 실행
- Maven은 테스트 코드를 자동으로 실행해 주는데, 이는 주로 maven-surefire-plugin을 통해 이루어진다.
- 예시: pom.xml에서 이 플러그인을 설정해 테스트를 관리할 수 있다.
- 사용한 코드
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>
maven-surefire-plugin의 기능설명
자동 테스트 실행
- Maven 빌드 프로세스의 일부로 단위 테스트를 자동으로 실행한다. 이는 코드 변경이 있을 때마다 테스트가 실행되어 코드의 품질을 유지하는 데 도움을 준다.
프레임워크 호환성
- JUnit, TestNG와 같은 인기 있는 자바 테스팅 프레임워크와 호환되어 널리 사용된다.
결과 보고
- 테스트 실행 후 결과를 요약하여 보고해 주어, 개발자가 테스트 성공, 실패에 대한 피드백을 쉽게 받을 수 있다.
구성 옵션
- 테스트 실행 방식, 테스트 대상 클래스 및 메서드를 선택하는 등 다양한 구성 옵션이 있어, 프로젝트의 요구사항에 맞게 테스트를 세부 조정할 수 있다.
패키징
- Maven은 컴파일된 코드와 리소스 파일을 JAR나 WAR 파일로 패키징 해준다.
- 예시: pom.xml에서 패키징 타입을 설정할 수 있다.
- 사용한 코드
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>1.0</version>
<name>My Project</name>
<packaging>jar</packaging> <!-- 여기에 패키징 타입을 추가 -->
<properties>
<!-- 기타 프로젝트 속성 -->
</properties>
<dependencies>
<!-- 필요한 의존성 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source> <!-- 사용할 자바 버전 -->
<target>17</target> <!-- 타겟 자바 버전 -->
</configuration>
</plugin>
<!-- 기타 필요한 플러그인 -->
</plugins>
</build>
</project>
<packaging>jar</packaging>
- 이건 Maven 프로젝트의 pom.xml 파일에서 프로젝트의 패키징 타입을 지정하는 부분이다. 여기서 jar는 Java ARchive(자바 아카이브)의 약자로, 여러 개의 Java 클래스 파일과 관련 메타데이터 및 리소스를 하나의 파일로 묶는 포맷을 말한다.
패키징 타입 설정 방법
- 기본적으로 Maven 프로젝트는 jar 파일 형태로 패키징 되지만, 이를 변경하려면 pom.xml 파일 내에서 <packaging> 태그의 값을 수정하면 된다. 예를 들어, 웹 애플리케이션을 만들 경우 war (Web application ARchive)로 설정할 수 있다.
의존성 관리
Maven은 pom.xml에 명시된 의존성들을 자동으로 관리해 준다.
예시: Spring Framework 의존성 추가
- pom.xml 파일에 필요한 라이브러리를 명시하면, Maven이 자동으로 필요한 라이브러리들을 다운로드하고, 프로젝트와 연동시킨다. 이 과정에서 Maven은 중앙 리포지토리에서 필요한 라이브러리를 찾아서 프로젝트의 로컬 리포지토리에 저장한다. 이렇게 하면, 다른 프로젝트에서 같은 라이브러리를 사용할 때 다시 다운로드할 필요가 없어져 효율적이다.
- 기존의 pom.xml에 아래의 코드가 추가되었다.
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.13</version>
</dependency>
프로젝트 정보 관리
Maven은 프로젝트의 구성, 개발자 정보, 라이선스 등을 pom.xml을 통해 관리한다.
- 프로젝트의 빌드 프로세스, 사용되는 플러그인, 의존성 정보 등도 관리되어 프로젝트의 전체적인 구조와 설정을 한눈에 파악할 수 있다.
- 예시: 프로젝트 정보를 pom.xml에 명시하는 방법
- 이러한 정보는 pom.xml 파일의 최상단 부분, 보통 <properties>, <dependencies>, <build> 등의 태그 전에 위치시킨다.
- 사용한 코드
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>testProject</artifactId>
<version>1.0-SNAPSHOT</version>
<name>My Project</name>
<description>프로젝트 설명</description>
<developers>
<developer>
<name>최진안</name>
<email>jinan@test.com</email>
</developer>
</developers>
<!-- 이하 properties, dependencies, build 설정 -->
</project>
3. Maven의 핵심 요소
POM (Project Object Model)
- POM은 Maven 프로젝트를 정의하는 핵심 파일로, pom.xml 형태로 존재한다. 이 파일은 프로젝트의 구조, 설정, 의존성 관리를 정의하고, Maven 빌드의 기본 단위 역할을 한다.
- pom.xml 파일은 프로젝트의 기본 정보(아티팩트 ID, 그룹 ID, 버전 등), 프로젝트의 의존성, 사용되는 플러그인, 빌드 설정(라이프사이클, 테스트 설정 등)과 같은 중요한 정보들을 포함하고 있다.
- 사용한 코드
<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>myproject</artifactId> <!-- 아티팩트 ID -->
<version>1.0</version> <!-- 버전 -->
<!-- 의존성과 플러그인 설정은 여기에 추가 -->
</project>
플러그인
Maven 플러그인은 Maven의 기능을 확장하고, 빌드 과정을 커스터마이즈 하는 데 사용된다. 예를 들어, 컴파일, 테스트, 패키징 등의 작업을 수행하는 데 필요한 플러그인들이 있다.
maven-compiler-plugin 사용 방법
- 목적: Java 소스 코드를 컴파일한다.
- 기본 설정: <maven-compiler-plugin>은 소스 코드의 Java 버전을 지정한다. 이 설정을 사용하여 프로젝트의 Java 소스 코드를 컴파일할 때 사용할 Java 버전을 정의할 수 있다.
- 사용한 코드
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 플러그인 버전 -->
<configuration>
<source>17</source> <!-- 사용할 자바 소스 버전 -->
<target>17</target> <!-- 타겟 자바 버전 -->
</configuration>
</plugin>
maven-surefire-plugin 사용 방법
- 목적: 프로젝트의 테스트 케이스를 실행한다.
- 기본 설정: <maven-surefire-plugin>은 Maven 빌드 프로세스 중에 단위 테스트를 자동으로 실행한다. JUnit 또는 TestNG와 같은 테스트 프레임워크와 호환된다.
- 사용한 코드
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version> <!-- 플러그인 버전 -->
<!-- 추가적인 테스트 설정 -->
</plugin>
두 개의 플러그인 같이 적용하기
- 이 설정을 통해 Maven은 빌드 프로세스 중에 Java 소스 코드를 컴파일하고, 단위 테스트를 실행한다. 이는 프로젝트의 품질을 유지하고, 버전 호환성을 보장하는 데 중요한 역할을 한다.
- 사용한 코드
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source> <!-- 사용할 자바 버전 -->
<target>17</target> <!-- 타겟 자바 버전 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<!-- 추가적인 테스트 설정은 여기에 -->
</plugin>
</plugins>
</build>
이러한 설정을 pom.xml 파일에 포함시킴으로써, Maven은 프로젝트의 빌드 시 자동으로 이러한 플러그인들을 사용하여 소스 코드 컴파일과 테스트 실행을 수행한다. 여기서 중요한 것은 사용하는 Java 버전과 Maven 플러그인의 버전이 프로젝트의 요구 사항과 일치해야 한다는 점이다.
리포지토리
Maven 리포지토리는 필요한 라이브러리와 플러그인을 저장하는 곳이다. 그 종류는 다음과 같다.
- 로컬 리포지토리 (Local Repository): 개발자의 컴퓨터에 있는 저장소.
- 중앙 리포지토리 (Central Repository): 모든 사용자가 접근할 수 있는 공용 저장소.
- 원격 리포지토리 (Remote Repository): 특정 조직이나 커뮤니티에서 관리하는 저장소.
4. Maven 사용 예제
기본 Java 프로젝트 설정
- 명령어: mvn archetype:generate 명령어를 사용하여 Maven 기본 구조를 가진 Java 프로젝트를 생성할 수 있다. 이 명령어는 Maven의 표준 템플릿을 기반으로 프로젝트의 기본 구조를 만들어 준다.
mvn archetype:generate
Maven 프로젝트 생성하기
- mvn archetype:generate 명령어는 지정된 groupId, artifactId, 그리고 archetype을 사용하여 새로운 프로젝트 구조를 생성한다. 이 명령어를 실행하는 현재 폴더에 myproject라는 이름의 새 폴더가 생성되며, 이 폴더 안에는 Maven 프로젝트의 표준 디렉토리 구조와 기본 pom.xml 파일이 포함된다.
Maven 설치(MacOS 기준이라 brew를 사용한다. brew도 없으면 설치하고 오자)
brew install maven
Maven 설치 확인
- Maven이 제대로 설치되었는지 확인하기 위해 터미널에서 mvn -v 명령어를 실행한다. 정상적으로 설치되었다면, 아래와 같이 Maven의 버전 정보가 표시될 것이다.
mvn -v
프로젝트 생성 (명령어 입력)
- 터미널에 아래의 명령어를 입력하자 (프로젝트 전용 폴더를 하나 생성하고 그 경로에 들어가서 명령어를 입력하자)
- 나는 study라는 내 공부폴더 하위에 maven이라는 폴더를 만들고 그 안에 들어가서 명령어를 입력했다.
mvn archetype:generate -DgroupId=com.example -DartifactId=myproject -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- 위의 명령어를 실행하면 아래와 같은 화면이 나올 것이다. 맨 하단에 BUILD SUCCESS가 나온다면 성공이다.
- myproject라는 디렉토리가 생성되고, 그 안에는 Maven 프로젝트의 기본 구조가 포함되어 있을 것이다.
생성된 프로젝트 내부의 pom.xml 설정하기
- 설명: 생성된 프로젝트에는 pom.xml 파일이 포함되어 있다. 이 파일에 프로젝트의 기본 정보, 의존성, 빌드 설정 등을 정의해야 한다.
- 기본 구성: 다음은 기본 pom.xml 파일의 예시다.
- 최초 구성 pom.xml 코드의 일부
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>myproject</name>
<url>http://maven.apache.org</url>
</project>
의존성 관리하기: Spring Framework 의존성 추가
- Spring 프로젝트를 위해서는 pom.xml에 Spring Framework의 의존성을 추가해야 한다.
- 의존성 추가: pom.xml에 Spring Context 모듈을 포함하는 예시
- 사용한 코드
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<!-- 기타 필요한 의존성 추가 -->
</dependencies>
- 위의 의존성을 pom.xml에 추가한 후, Maven 프로젝트를 빌드하면 Maven은 자동으로 필요한 라이브러리를 다운로드하고 프로젝트에 통합한다.
📌 생각정리
이번 포스트에서는 Maven에 대해서 알아봤다. 4번 목차에 적은 메이븐 프로젝트를 명령어를 사용하여 생성하는 방식은 나도 처음 해봤다. 왜냐하면 요즘은 start.spring.io 같은 좋은 프로젝트 세팅 tool이 존재해서 그냥 클릭만으로 다 해결했기 때문이다.
기존에 Maven을 사용할 때 pom.xml을 대충 눈으로 보면 어떤 설정들인지 알긴 했지만 확실하게는 몰라서 궁금증이 있었는데 이번기회에 이런 기본적인 부분들을 잘 알게 되었다. 비록 이제는 Gradle의 시대가 왔지만 혹시 모르지 않을까? 언제든 maven을 사용하게 될 수도 있으니 잘 숙지해 두면 언젠가는 도움이 될 것이다.
maven 이랑 gradle은 뭐가 다를까?👇🏻👇🏻
'Spring 기초 > Spring 설정' 카테고리의 다른 글
[Spring] Gradle 이해하기 (0) | 2023.11.08 |
---|---|
[Spring] yml vs properties 설정파일 비교 (1) | 2023.11.08 |
Spring Boot: Gradle 버전 확인하기 (0) | 2023.10.26 |
Spring 환경설정: Xml과 @Configuration의 차이점 (0) | 2023.08.09 |
Spring Boot: Tomcat 환경변수 설정 (0) | 2023.08.08 |