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 -50% ํ• ์ธ์ฟ ํฐ: 20652-ab1f1cd4c373 buy me a coffee