Maven Deep Dive

Maven 핵심 개념 정리

pom.xml 구조 심층 분석

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>...</parent> <!-- 상속/공통 설정 재사용 -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>jar|war|pom|ear ...</packaging>

  <properties>
    <java.version>21</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>${spring.boot.version}</version>
      <scope>compile|test|provided|runtime|import</scope>
      <exclusions>...</exclusions>
    </dependency>
  </dependencies>

  <dependencyManagement>...</dependencyManagement>
  <build>
    <plugins>...</plugins>
    <pluginManagement>...</pluginManagement>
  </build>

  <profiles>...</profiles>
  <modules>...</modules> <!-- 멀티 모듈 구성 -->
</project>

parent vs dependencyManagement

Lifecycle Deep Dive

Lifecycle 주요 Phase 설명
clean pre-clean → clean → post-clean 이전 빌드 산출물 제거
default validate → compile → test → package → verify → install → deploy 컴파일·테스트·배포 중심 기본 흐름
site pre-site → site → post-site → site-deploy 프로젝트 문서 생성·배포

Plugin & Goal 전략

Profiles로 환경 분리

<profiles>
  <profile>
    <id>prod</id>
    <activation>
      <property>
        <name>env</name>
        <value>prod</value>
      </property>
    </activation>
    <properties>
      <db.url>jdbc:postgresql://prod-host/db</db.url>
    </properties>
  </profile>
</profiles>

의존성 관리 고급 기법

  1. BOM(Bill of Materials)
    • scope import + type pom 조합으로 플랫폼 버전 캡 고정
    • 예) spring-boot-dependencies, quarkus-bom
  2. Optional Dependency
    • <optional>true</optional>로 전이 의존성 확산 제한
  3. Exclusion
    • 충돌 버전 제거 시 dependency/exclusions 활용
  4. Dependency Convergence
    • mvn -Dverbose dependency:tree로 충돌 탐지 후 관리

Tomcat Embed 버전 지정

<properties>
  <tomcat.embed.version>10.1.25</tomcat.embed.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>${tomcat.embed.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <version>${tomcat.embed.version}</version>
  </dependency>
</dependencies>

Offline 빌드

Jetty Embed 대안

<properties>
  <jetty.version>11.0.22</jetty.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>${jetty.version}</version>
  </dependency>
  <dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlet</artifactId>
    <version>${jetty.version}</version>
  </dependency>
</dependencies>

Repository & Distribution 전략

settings.xml 체크포인트

빌드 성능 & 디버깅 팁

표준 디렉터리 구조

maven-project/
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   ├── resources
│   │   └── webapp
│   └── test
│       ├── java
│       └── resources
├── target
├── .mvn/
│   ├── wrapper/
│   └── jvm.config
└── README.md

참고 명령어

더 읽을거리

What Else?
inflearn react api server buy me a coffee