Maven Deep Dive
- 2004๋
Maven 2 ๋ฑ์ฅ์ผ๋ก ๋ผ์ดํ์ฌ์ดํด/ํ๋ฌ๊ทธ์ธ ๋ชจ๋ธ ์ ์ฐฉ
- ๋๊ท๋ชจ ์๋ฐ ํ๋ก์ ํธ์์ ์ผ๊ด๋ ๋น๋ยท์์กด์ฑ ๊ด๋ฆฌ ํ์ค ์ ๊ณต
- ์ ์ธ์ ๊ตฌ์ฑ(POM)๊ณผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฌ๊ทธ์ธ ์กฐํฉ์ด ํต์ฌ
Maven ํต์ฌ ๊ฐ๋
์ ๋ฆฌ
- Model:
pom.xml์ด Project Object Model์ ์ ์, ํ๋ก์ ํธ ๋ฉํ๋ฐ์ดํฐยท์์กด์ฑยท๋น๋ ์ค์ ๊ด๋ฆฌ
- Lifecycle: clean / default / site ์ธ ๊ฐ์ง ๋ผ์ดํ์ฌ์ดํด๊ณผ ๊ฐ ๋จ๊ณ(phase)์ goal ์ฐ๊ฒฐ
- Plugin: ์ค์ ์์
์ ์คํํ๋ ๋จ์, goal์ phase์ ๋งคํํ์ฌ ์คํ ํ๋ฆ ๊ตฌ์ฑ
- Repository: Local(
~/.m2/repository) โ Remote(Maven Central, ์ฌ๋ด Nexus ๋ฑ) ์บ์/๋ฐฐํฌ ๊ตฌ์กฐ
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
- parent: ๊ณตํต ์์ฑ/ํ๋ฌ๊ทธ์ธ/์์กด์ฑ ๋ฒ์ ์์,
relativePath๋ก ๋ถ๋ชจ ์์น ์ง์ ๊ฐ๋ฅ
- 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 |
ํ๋ก์ ํธ ๋ฌธ์ ์์ฑยท๋ฐฐํฌ |
mvn <phase> ์คํ ์ ํด๋น phase ์ด์ ๋จ๊ณ๊น์ง ์์ฐจ ์ํ
mvn clean package์ฒ๋ผ ๋ค๋ฅธ ๋ผ์ดํ์ฌ์ดํด ์กฐํฉ ๊ฐ๋ฅ
Plugin & Goal ์ ๋ต
maven-compiler-plugin: compile, testCompile goal๋ก ์๋ฐ ์์ค ์ปดํ์ผ
maven-surefire-plugin: ๋จ์ ํ
์คํธ ์คํ, JUnit5 ์ฌ์ฉ ์ provider ์ค์ ์ฃผ์
maven-failsafe-plugin: ํตํฉ ํ
์คํธ(integration-test, verify)์ goal ๋งคํ
spring-boot-maven-plugin: repackage, spring-boot:run ์ง์
- Goal ์ง์ ์คํ:
mvn dependency:tree, mvn help:effective-pom
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>
mvn package -Pprod ํน์ -Denv=prod๋ก ํ์ฑํ
- ํ๊ฒฝ๋ณ ๋ฆฌ์์ค ํํฐ๋ง(
resources/filtering), ํ๋ฌ๊ทธ์ธ ์ค์ ๋ถ๊ธฐ, ๋ค์ค ๋ชจ๋ ์ ํ์ ๋น๋ ๊ฐ๋ฅ
์์กด์ฑ ๊ด๋ฆฌ ๊ณ ๊ธ ๊ธฐ๋ฒ
- BOM(Bill of Materials)
scope import + type pom ์กฐํฉ์ผ๋ก ํ๋ซํผ ๋ฒ์ ์บก ๊ณ ์
- ์)
spring-boot-dependencies, quarkus-bom
- Optional Dependency
<optional>true</optional>๋ก ์ ์ด ์์กด์ฑ ํ์ฐ ์ ํ
- Exclusion
- ์ถฉ๋ ๋ฒ์ ์ ๊ฑฐ ์
dependency/exclusions ํ์ฉ
- Dependency Convergence
mvn -Dverbose dependency:tree๋ก ์ถฉ๋ ํ์ง ํ ๊ด๋ฆฌ
Tomcat Embed ๋ฒ์ ์ง์
- Spring Boot ๋ฏธ์ฌ์ฉ ์ ๋ช
์์ ์ผ๋ก Tomcat Embed ๋ฒ์ ๊ณ ์ ํ์
- ๊ณตํต ์์ฑ ํน์ BOM์ ํตํด ์์กด์ฑ ๋ฒ์ ์ผ๊ด์ฑ ์ ์ง
<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>
- ์ฌ๋ฌ ๋ชจ๋์์ ๊ณต์ ํ๋ค๋ฉด parent POM์
<dependencyManagement>์ ๋์ผ ๋ฒ์ ์ ์ธ ํ ํ์ ๋ชจ๋์์ ๋ฒ์ ์๋ต
- Spring Boot๋ฅผ ์ฌ์ฉํ๋ค๋ฉด
spring-boot-starter-web์ด ๊ด๋ฆฌํ๋ Tomcat ๋ฒ์ ์ ์ฐ์ ๋ฐ๋ฅด๊ณ , ์ปค์คํฐ๋ง์ด์ง์ spring-boot-dependencies BOM์ overrideํ์ง ์๋ ์ ์์ <properties> ์กฐ์
Offline ๋น๋
- ํ์๋ง ๋ฑ์์ ๋ก์ปฌ์ ์ ์ฅ์์์ ์์กด์ฑ๋ง์ผ๋ก ๋น๋
mvn clean install -o
- ๋๋,
~/.m2/settings.xml์ <offline>true</offline> ์ค์
Jetty Embed ๋์
- Non-Blocking I/O ๋ฐ ๊ฒฝ๋ ์๋ฒ๊ฐ ํ์ํ๋ค๋ฉด Jetty Embed ์ ํ
- Tomcat๊ณผ ๋์ผํ๊ฒ ๋ฒ์ ์ถฉ๋์ ํผํ๋ ค๋ฉด ์์ฑ/๊ด๋ฆฌ ์น์
์ผ๋ก ๋ฒ์ ๊ณ ์
<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>
- JSP๊ฐ ํ์ํ๋ค๋ฉด
apache-jsp, taglibs-standard-impl ๋ฑ ์ถ๊ฐ ๊ณ ๋ ค
- Jetty BOM(
org.eclipse.jetty:jetty-bom)์ <dependencyManagement>์ ์ถ๊ฐํ๋ฉด ํ์ ๋ชจ๋์์ ๋ฒ์ ์๋ต ๊ฐ๋ฅ
- Spring Boot์์ Jetty๋ก ๊ต์ฒด ์
spring-boot-starter-web ๋์ spring-boot-starter-jetty ์ฌ์ฉ
Repository & Distribution ์ ๋ต
- Local: ์ต์ด ๋ค์ด๋ก๋ ํ ์บ์,
~/.m2/settings.xml๋ก ๊ฒฝ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
- Remote: Maven Central โ ์ฌ๋ด Nexus/Artifactory ํ๋ก์ ๊ตฌ์ฑํด ์๋ยท๋ณด์ ํ๋ณด
- Distribution Management: ์ค๋
์ท(
snapshotRepository) vs ๋ฆด๋ฆฌ์ค(repository) ๊ฒฝ๋ก ๋ถ๋ฆฌ
- ์ฌ๋ด ์ํฐํฉํธ ์
๋ก๋:
mvn deploy -DskipTests
settings.xml ์ฒดํฌํฌ์ธํธ
- ์์น:
${maven.home}/conf/settings.xml ๋๋ ~/.m2/settings.xml
- ์๋ฒ ์ธ์ฆ์ ๋ณด:
<servers><server><id>corp-nexus</id><username>...</username></server></servers>
- ๋ฏธ๋ฌ:
<mirrors>๋ก ์ค์ ์ ์ฅ์ ๋์ ์ฌ๋ด ์ ์ฅ์ ์ฐ์ ์ฌ์ฉ
- ํ๋กํ์ผ ๊ธ๋ก๋ฒ ์ ์ฉ:
<profiles> + <activeProfiles> ์กฐํฉ
๋น๋ ์ฑ๋ฅ & ๋๋ฒ๊น
ํ
- ๋ณ๋ ฌ ๋น๋:
mvn -T 1C clean package (์ฝ์ด ์ ๊ธฐ์ค)
- ์์กด์ฑ ํด์ ํ์ธ:
mvn -U๋ก ์๊ฒฉ ์ค๋
์ท ๊ฐ์ ์
๋ฐ์ดํธ
- ๋๋ฒ๊น
:
mvn -X (debug ๋ก๊ทธ), mvn -e (stacktrace)
- CI ์ต์ ํ:
mvn --batch-mode -Dmaven.test.skip=true (ํ์ ์ ํ
์คํธ ์๋ต)
- ๋ค์ค JVM ํ๊ฒฝ:
toolchains.xml ํ์ฉํด JDK ๋ฒ์ ๊ณ ์
ํ์ค ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ
maven-project/
โโโ pom.xml
โโโ src
โ โโโ main
โ โ โโโ java
โ โ โโโ resources
โ โ โโโ webapp
โ โโโ test
โ โโโ java
โ โโโ resources
โโโ target
โโโ .mvn/
โ โโโ wrapper/
โ โโโ jvm.config
โโโ README.md
src/main/resources: ํ๋กํผํฐยทํ
ํ๋ฆฟ ๋ฑ ๋น๋ ์ ํด๋์คํจ์ค ํฌํจ ๋ฆฌ์์ค
src/main/webapp: WAR ํจํค์ง ์ ์ ์ ํ์ผยทWEB-INF ๊ตฌ์ฑ
.mvn/wrapper: Maven Wrapper(mvnw, mvnw.cmd) ์ค์
์ฐธ๊ณ ๋ช
๋ น์ด
mvn help:effective-pom: ์์/ํ๋กํ ๋ฐ์๋ ์ต์ข
POM ํ์ธ
mvn dependency:analyze: ์ฌ์ฉ๋์ง ์๋ ์์กด์ฑ/๋ฏธ์ ์ธ ์์กด์ฑ ์ ๊ฒ
mvn versions:display-dependency-updates: ๋ฒ์ ์
๊ทธ๋ ์ด๋ ํ๋ณด ํ์ธ
๋ ์ฝ์๊ฑฐ๋ฆฌ