코드 한 줄의 기록

Java Maven 기본 완벽 가이드 - POM, 라이프사이클, 좌표 개념 정리 본문

JAVA

Java Maven 기본 완벽 가이드 - POM, 라이프사이클, 좌표 개념 정리

CodeByJin 2025. 12. 31. 08:03
반응형

자바 개발을 하다 보면 Maven을 꼭 마주하게 됩니다. 특히 회사에서 여러 프로젝트를 관리하거나 복잡한 의존성을 다룰 때 Maven의 필요성을 절실하게 느끼게 되죠. 저도 처음에 Maven을 접했을 때는 pom.xml이라는 파일에 XML이 잔뜩 들어있는 게 정말 복잡해 보였습니다. 하지만 몇 달간 사용해보니 Maven의 핵심 개념 세 가지만 제대로 이해하면 얼마나 강력한 도구인지 깨닫게 되었습니다. 오늘은 제가 배우면서 정리한 Maven의 기본 개념들을 여러분과 함께 정리해보려고 합니다.

Maven이란 무엇인가?

Maven은 자바 프로젝트의 빌드, 컴파일, 패키징, 배포를 자동화하는 빌드 관리 도구입니다. 저는 Maven을 처음 접했을 때 단순히 의존성(라이브러리)을 다운받아주는 도구 정도로만 생각했는데, 실제로는 훨씬 더 많은 일을 합니다.
Gradle 같은 도구들도 있지만, Maven은 여전히 많은 대규모 프로젝트에서 사용되고 있습니다. 특히 기존의 레거시 시스템에서는 Maven을 강력하게 사용하고 있죠. 그래서 Maven을 이해하는 것은 자바 개발자로서 정말 중요한 스킬입니다.

POM 파일의 구조 - 프로젝트의 설정서

POM은 Project Object Model의 약자입니다. 이 파일이 프로젝트의 모든 설정을 담는 역할을 합니다. 처음 POM을 봤을 때는 정말 복잡해 보였지만, 구조를 이해하고 나니 매우 논리적이었습니다.
 

기본 POM 구조

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>My Application</name>
    <description>This is my first Maven app</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

 
주요 요소들

modelVersion: 항상 4.0.0입니다. 이것은 Maven 3 이상에서 필수입니다.
 
groupId, artifactId, version: 이것들은 Maven 좌표라고 부르는데, 뒤에서 자세히 설명하겠습니다.
 
properties: 프로젝트 전체에서 재사용할 수 있는 변수를 정의합니다. 저는 보통 자바 버전, 인코딩, 자주 사용되는 라이브러리 버전 등을 여기에 정의합니다.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <spring-boot.version>2.7.5</spring-boot.version>
</properties>

 

이렇게 정의한 후에는 ${spring-boot.version}처럼 참조할 수 있습니다.

 
dependencies: 프로젝트가 필요로 하는 모든 외부 라이브러리들을 선언합니다. 여기에 선언된 라이브러리들은 Maven이 자동으로 다운로드하고 프로젝트 경로에 추가합니다.

Maven 좌표 - 라이브러리의 주소

Maven 좌표는 정말 중요한 개념입니다. 이것을 이해하지 못하면 의존성 충돌 같은 문제를 해결하기 어렵습니다.
 

좌표의 구조

Maven 좌표는 다음과 같이 구성됩니다.

groupId:artifactId:version

 
예를 들어, Spring Framework의 경우

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.13</version>
</dependency>

 
groupId: 조직의 고유한 식별자입니다.
artifactId: 프로젝트의 이름입니다.
version: 버전 번호입니다.
 

SNAPSHOT과 Release의 차이

<!-- Release 버전 -->
<version>1.0.0</version>

<!-- Snapshot 버전 -->
<version>1.0.0-SNAPSHOT</version>

 
SNAPSHOT 버전은 개발 중인 버전을 의미하며, 매번 최신 상태로 다시 다운로드합니다. 반면 Release 버전은 한 번 다운로드되면 캐시됩니다.
 

의존성 범위 (Scope)

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

 
- compile: 기본값입니다. 모든 단계에서 사용.
- test: 테스트 코드에만 사용.
- runtime: 실행 시 필요.
- provided: 컴파일 시 필요하지만, 실행 시 외부 환경에서 제공.

Maven 라이프사이클 - 프로젝트 실행의 흐름

Maven은 프로젝트를 빌드할 때 정해진 순서의 단계를 따릅니다. 이것을 라이프사이클(Lifecycle)이라고 합니다.
 

기본 라이프사이클

  1. validate
  2. compile
  3. test
  4. package
  5. integration-test
  6. verify
  7. install
  8. deploy

명령어 예시

mvn compile
mvn test
mvn package
mvn install
mvn deploy

 
다른 라이프사이클들

mvn clean
mvn site
mvn clean package -DskipTests
mvn test -Dtest=UserRepositoryTest

Maven의 강력한 기능들

의존성 관리

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.13</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

 
프로필(Profile)

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <environment>development</environment>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <environment>production</environment>
        </properties>
    </profile>
</profiles>
mvn clean package -Pdev
mvn clean package -Pprod

 
플러그인(Plugin)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
    </plugins>
</build>

실무에서 자주 하는 실수들

버전 관리 불일치, 부모 POM 미사용, scope 설정 오류 등은 실무에서 Maven 사용 시 흔히 겪는 문제입니다.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.13</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Maven을 제대로 사용하기 위한 팁

mvn dependency:tree

 

이 명령을 사용하면 프로젝트의 의존성 구조를 한눈에 볼 수 있습니다. 또한 .m2/repository 폴더가 로컬 저장소라는 점을 이해하면 문제를 해결하기 쉬워집니다.

 
POM 파일, Maven 좌표, 그리고 라이프사이클. 이 세 가지 개념만 정확히 이해한다면 Maven의 대부분 기능을 훨씬 쉽게 활용할 수 있습니다. 직접 프로젝트를 만들어보고, 빌드 과정을 실행해보면 Maven의 가치가 확실히 보일 거예요.
 
이 글이 Maven을 배우는 분들에게 도움이 되길 바랍니다.

Java 유닛 테스트 완벽 정리: JUnit 5와 단언(Assertions) 개념부터 실전까지

안녕하세요. 오늘은 JUnit 5와 단언(Assertions)에 대해 깊이 있게 정리해보겠습니다. 처음에는 단순히 테스트를 작성하는 것이 목표였지만, 프로젝트가 진행되면서 더 나은 테스트 코드를 어떻게 작

byteandbit.tistory.com

반응형