Java 프로젝트를 처음 접하면 pom.xml이라는 낯선 파일을 마주하게 됩니다. 이 파일의 정체가 바로 Maven의 설정 파일입니다. Python 개발자에게 requirements.txt가 있고,
Node.js 개발자에게 package.json이 있듯이,
Java 개발자에게는 Maven과 pom.xml이 있습니다.
이 글에서는 Maven이 무엇인지, 왜 사용하는지, 그리고 다른 언어의 패키지 매니저와 어떻게 다른지 살펴보겠습니다.
Maven이란?
Maven은 Apache 재단에서 만든 Java 프로젝트의 빌드 자동화 및 의존성 관리 도구입니다. 2004년에 처음 릴리즈되어 현재까지 Java 생태계의 표준 빌드 도구로 자리잡고 있습니다.
Maven이라는 이름은 이디시어로 "지식의 축적자"를 의미합니다. 프로젝트에 필요한 라이브러리와 빌드 방법에 대한 지식을 축적하고 관리한다는 의미를 담고 있습니다.
Maven을 왜 쓰는가?
1. 의존성 관리의 자동화
Maven이 없던 시절을 상상해봅시다.
Maven 없이 개발한다면:
- PostgreSQL 드라이버가 필요하면 직접 jar 파일을 다운로드
- Spring Framework를 쓰려면 관련 jar 파일 10개 이상을 직접 다운로드
- 라이브러리 간 버전 충돌이 발생하면 직접 해결
- 팀원에게 프로젝트를 공유할 때 jar 파일들도 함께 전달
Maven을 사용하면:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>
이 선언 하나면 Maven이 자동으로 해당 라이브러리를 다운로드합니다. 더 나아가 해당 라이브러리가 의존하는 다른 라이브러리들(transitive dependency)까지 자동으로 가져옵니다.
2. 빌드 프로세스의 표준화
Maven은 프로젝트 빌드를 위한 표준 생명주기(lifecycle)를 제공합니다.
mvn clean package
이 명령어 하나로 다음 작업이 순서대로 실행됩니다:
- clean - 이전 빌드 결과물 삭제
- compile - 소스코드 컴파일
- test - 단위 테스트 실행
- package - JAR 또는 WAR 파일로 패키징
누가 어떤 환경에서 빌드해도 동일한 결과가 나옵니다.
3. 프로젝트 구조의 통일
Maven을 사용하면 모든 프로젝트가 동일한 디렉토리 구조를 따릅니다.
my-project/
├── pom.xml # 프로젝트 설정 파일
├── src/
│ ├── main/
│ │ ├── java/ # 소스코드
│ │ └── resources/ # 설정 파일, 리소스
│ └── test/
│ ├── java/ # 테스트 코드
│ └── resources/ # 테스트용 리소스
└── target/ # 빌드 결과물 (자동 생성)
어떤 Maven 프로젝트를 열어도 구조가 동일하기 때문에, 새로운 프로젝트에 투입되어도 빠르게 적응할 수 있습니다.
4. 중앙 저장소를 통한 라이브러리 공유
Maven Central Repository에는 수십만 개의 오픈소스 라이브러리가 등록되어 있습니다. groupId, artifactId, version만 알면 전 세계 어디서든 동일한 라이브러리를 받아 사용할 수 있습니다.
pom.xml 구조 이해하기
pom.xml은 Project Object Model의 약자로, 프로젝트의 모든 정보를 담고 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<!-- 프로젝트 식별 정보 -->
<groupId>com.mycompany</groupId> <!-- 조직/회사 식별자 -->
<artifactId>my-project</artifactId> <!-- 프로젝트명 -->
<version>1.0.0</version> <!-- 버전 -->
<packaging>war</packaging> <!-- 패키징 타입 -->
<!-- 프로젝트 속성 -->
<properties>
<java.version>11</java.version>
<spring.version>5.3.30</spring.version>
</properties>
<!-- 의존성 목록 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<!-- 빌드 설정 -->
<build>
<plugins>
<!-- 빌드 플러그인 설정 -->
</plugins>
</build>
</project>
다른 언어의 패키지 매니저와 비교
기능 비교표
기능 Maven (Java) npm (Node.js) pip (Python)
| 설정 파일 | pom.xml | package.json | requirements.txt |
| 의존성 관리 | ✅ | ✅ | ✅ |
| 버전 명시 | ✅ | ✅ | ✅ |
| 빌드/패키징 | ✅ | 부분적 (scripts) | ❌ |
| 테스트 실행 | ✅ | 부분적 (scripts) | ❌ |
| 프로젝트 메타정보 | ✅ | ✅ | ❌ |
| lock 파일 | ❌ (별도 플러그인) | ✅ (package-lock.json) | ❌ (별도 도구) |
저장소 비교
Java Node.js Python
| Maven Central | npmjs.com | PyPI |
로컬 캐시 위치
Java Node.js Python
| ~/.m2/repository | ./node_modules | site-packages |
Maven은 프로젝트별이 아닌 시스템 전역으로 라이브러리를 캐시합니다. 동일한 라이브러리를 여러 프로젝트에서 사용해도 한 번만 다운로드됩니다. 반면 npm은 프로젝트마다 node_modules 폴더에 별도로 설치합니다.
역할 범위의 차이
requirements.txt (Python) 순수하게 "이 라이브러리를 설치해라"라는 의존성 목록만 담당합니다. 빌드, 테스트, 패키징은 setuptools, pytest 등 별도 도구를 사용합니다.
package.json (Node.js) 의존성 관리와 함께 scripts 섹션을 통해 빌드, 테스트 명령어를 정의할 수 있습니다. 하지만 실제 빌드 로직은 webpack, vite 같은 별도 도구에 의존합니다.
pom.xml (Maven) 의존성 관리, 빌드, 테스트, 패키징, 배포까지 모든 것을 하나의 도구로 처리합니다. Python으로 치면 requirements.txt + setuptools + pytest + Makefile을 합친 것과 같습니다.
Maven의 동작 원리
- 개발자가 pom.xml에 필요한 의존성을 선언
- mvn install 또는 IDE에서 Maven Update 실행
- Maven이 Central Repository에서 jar 파일 다운로드
- 로컬 저장소(~/.m2/repository)에 캐싱
- 프로젝트 빌드 시 자동으로 클래스패스에 포함
한 번 다운로드된 라이브러리는 로컬에 캐시되어, 다른 프로젝트에서 같은 라이브러리를 사용할 때 다시 다운로드하지 않습니다.
자주 사용하는 Maven 명령어
# 의존성 다운로드 및 프로젝트 빌드
mvn install
# 빌드 결과물 삭제
mvn clean
# 컴파일만 실행
mvn compile
# 테스트 실행
mvn test
# 패키징 (JAR/WAR 생성)
mvn package
# 빌드 결과물 삭제 후 패키징
mvn clean package
# 의존성 트리 확인
mvn dependency:tree
IDE에서의 Maven
Eclipse, IntelliJ 같은 IDE에서는 GUI로 Maven을 조작할 수 있습니다.
Eclipse 기준:
- pom.xml 수정 후 → 프로젝트 우클릭 → Maven → Update Project (Alt + F5)
- 이 동작이 mvn install과 유사한 역할을 합니다
Maven vs Gradle
최근에는 Gradle도 많이 사용됩니다. 간단히 비교하면:
항목 Maven Gradle
| 설정 파일 | pom.xml (XML) | build.gradle (Groovy/Kotlin) |
| 빌드 속도 | 상대적으로 느림 | 빠름 (증분 빌드, 캐시) |
| 유연성 | 제한적 | 높음 |
| 학습 곡선 | 낮음 | 상대적으로 높음 |
| 점유율 | 여전히 높음 | 증가 추세 |
신규 프로젝트는 Gradle을, 기존 프로젝트 유지보수는 Maven을 사용하는 경우가 많습니다.
마치며
Maven은 단순한 패키지 매니저가 아닌, Java 프로젝트의 전체 생명주기를 관리하는 도구입니다. 의존성 관리, 빌드 자동화, 프로젝트 구조 표준화를 통해 Java 개발의 복잡성을 크게 줄여줍니다.
다른 언어에서 Java로 넘어온 개발자라면, Maven을 "빌드 기능이 포함된 패키지 매니저"로 이해하면 빠르게 적응할 수 있습니다. requirements.txt나 package.json처럼 "필요한 라이브러리를 선언하면 알아서 가져온다"는 핵심 개념은 동일하니까요.
참고 자료
'Tech Notes' 카테고리의 다른 글
| [PROMPT] 시니어가 되기 위한 준비 (0) | 2026.01.20 |
|---|---|
| [PROMPT] 수정 사항이 생겼을 때 (0) | 2026.01.20 |
| 텔레그램 봇 Polling vs Webhook - 로컬 앱이라면 Polling! (0) | 2026.01.17 |
| [PROMPT] 프로젝트(AGENT) (0) | 2026.01.17 |
| 내 IP 주소 확인하기 (0) | 2026.01.17 |