Spring Boot Maven Plugin

MIIINยท2021๋…„ 9์›” 20์ผ
1
post-thumbnail

๐Ÿ”จ Apache Maven

Apache Maven์€ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋ฐ ์ดํ•ด ๋„๊ตฌ์ด๋‹ค. project obejct model (POM) ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ Maven์€ ํ”„๋กœ์ ํŠธ์˜ build, reporting, documentation ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ Eclipse๋‚˜ intelliJ์—๋Š” Maven์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋‚˜, ๋”ฐ๋กœ Maven์„ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.
https://maven.apache.org/download.cgi

๋˜ํ•œ, Spring Initializr์„ ์ด์šฉํ•˜์—ฌ Spring Boot Project๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ mvnw์™€ mvnw.cmd ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์žˆ๋‹ค.
https://start.spring.io/

Maven Wrapper(mvnw)์€ Maven์„ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ Maven Build๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. Apache Maven์„ ํ”„๋กœ์ ํŠธ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋ฒ„์ „์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์œ ์šฉํ•œ ๋„๊ตฌ์ด๋ฉฐ Gradle Wrapper์™€ ๊ฐ™์€ ๊ฐœ๋…์˜ ๋„๊ตฌ์ด๋‹ค.

// ์ผ๋ฐ˜์ ์ธ Maven ๋ช…๋ น์–ด
mvn clean package

// mvnw์„ ์ด์šฉํ•œ ๋ช…๋ น์–ด
./mvnw clean package		// linux
mvnw.cmd clean install		// windows

๐Ÿ”– Spring Boot Maven Plugin

Spring Boot Maven Plugin์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ Spring Boot ์ง€์›์„ ์ œ๊ณตํ•œ๋‹ค.
1. ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰๊ฐ€๋Šฅํ•œ jar ํŒŒ์ผ์ด๋‚˜ war ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง€(package)
2. Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
3. Build ์ •๋ณด ์ƒ์„ฑ
4. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์ „์— Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘

Spring Boot Maven Plugin์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pom.xml ์•ˆ์— plugins ์ƒ‰์…˜์— ์ ์ ˆํžˆ ์ถ”๊ฐ€ํ•œ๋‹ค.

<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>getting-started</artifactId>
    <!-- ... -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Milestone(M) ๋˜๋Š” SNAPSHOT release๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ ์ ˆํ•œ pluginRepository ์†์„ฑ๋“ค์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

  • Milestone(M) : ํ…Œ์ŠคํŠธ ๋ฒ„์ „
  • SNAPSHOT : ๊ฐœ๋ฐœ๋‹จ๊ณ„, ์ผ์ข…์˜ ๋ฐฑ์—…์‹œ์ 
<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <url>https://repo.spring.io/snapshot</url>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <url>https://repo.spring.io/milestone</url>
    </pluginRepository>
</pluginRepositories>

๐Ÿ”– Spring Boot Maven Plugin ์„ค์ •

spring-boot-starter-parent ์Šคํƒ€ํ„ฐ๋ฅผ parent๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  Spring Boot ๋ฒ„์ „๋งŒ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค๋ฅธ ์Šคํƒ€ํ„ฐ๋“ค์„ ์ถ”๊ฐ€ํ• ๋•Œ์—๋Š” ๋ฒ„์ „์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.4</version>
</parent>

spring-boot-starter-parent-{version}.pom์„ ํ™•์ธํ•ด๋ณด๋ฉด parent๋กœ spring-boot-dependencies๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.5.4</version>
</parent>

maven pom ์ƒ์† ๊ตฌ์กฐ๊ฐ€ [ํ˜„์žฌ spring boot project] -> [spring-boot-starter-parent] -> [spring-boot-dependencies] ์ˆœ์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

spring-boot-dependencies-{version}.pom์—๋Š” Spring Boot์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์— ๋Œ€ํ•œ ๋ฒ„์ „์ด ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.

spring-boot-dependencies์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฒ„์ „์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด properties ์†์„ฑ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

<properties>
    <activemq.version>5.16.2</activemq.version>
    <spring.version>5.0.6.RELEASE</spring.version>
</properties>

๐Ÿ”– Goals

Spring Boot Plugin์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ goal๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

Goal์„ค๋ช…
spring-boot:build-imageOCI image๋กœ ํŒจํ‚ค์ง€
spring-boot:build-infobuild-info.properties ํŒŒ์ผ ์ƒ์„ฑ
spring-boot:repackageRepackage, Jar๋‚˜ War ํŒŒ์ผ๋กœ ์žฌํŒจํ‚ค์ง€
spring-boot:runํ˜„์žฌ ์œ„์น˜์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰
spring-boot:startSpring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘, "run" goal๊ณผ ๋‹ฌ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘๋™์„ blockํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ goal๋“ค์„ ํ—ˆ์šฉ
spring-boot:stop"start" goal๋กœ ์‹œ์ž‘๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒ

๐Ÿ”– Packaging

"repakcage" goal๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰๊ฐ€๋Šฅํ•œ jar/war ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง€ํ•œ๋‹ค.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

spring-boot-starter-parent ์Šคํƒ€ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, repackage execution์œผ๋กœ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ์— plugin ์ •์˜๋งŒ ์ถ”๊ฐ€๋˜๋ฉด ๋œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ๋Š” pom.xml์— ์ •์˜๋œ "provided" dependency๋“ค์„ ๋ชจ๋‘ ํฌํ•จํ•˜์—ฌ jar/war ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•ํ•œ๋‹ค. package ๋‹จ๊ณ„์—์„œ ์ œ์™ธํ•˜๊ธฐ ์›ํ•˜๋Š” dependency๋“ค์€ exclude ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…Type๊ธฐ๋ณธ๊ฐ’์„ค๋ช…
outputDirectoryFile${project.build.directory}์ƒ์„ฑ๋œ ํŒŒ์ผ์ด ์ €์žฅ๋  ํด๋”
attachBooleantruetrue : repackage jar/war ๋ฐฐํฌ, false : repackage jar/war ๋ฐฐํฌ ์•ˆํ•จ
classifierStringrepackage jar/war ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•  ๋ถ„๋ฅ˜์ž, ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ jar/war๋ฅผ ๋Œ€์ฒด
excludeDevtoolsBooleantrueRepackaing์‹œ, Spring Boot devtools ๋ฐฐ์ œ ์—ฌ๋ถ€
excludeGroupIdsStringRepackaing์‹œ, ๋ฐฐ์ œํ•  groupId ๋ฆฌ์ŠคํŠธ
excludesListRepackaging์‹œ, ๋ฐฐ์ œํ•  dependency
includeSystemScopeBooleanfalsesystem ์Šค์ฝ”ํ”„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํฌํ•จ ์—ฌ๋ถ€
includesListRepackaing์‹œ, ํฌํ•จํ•  dependency
skipBooleanfalse์‹คํ–‰ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ”– War Packaging

war๋กœ ํŒจํ‚ค์ง•ํ•˜์—ฌ ์™ธ๋ถ€ Tomcat์œผ๋กœ ๋ฐฐํฌํ•  ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€์ ์ธ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

1) packaging ์†์„ฑ์„ war๋กœ ์„ค์ •

<packaging>war</packaging>

2) spring-boot-starter-tomcat ์Šคํƒ€ํ„ฐ ์Šค์ฝ”ํ”„ ๋ณ€๊ฒฝ

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

"provided" ์Šค์ฝ”ํ”„๋Š” runtime ์‹œ์ ์— JDK๋‚˜ ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ‘œ์‹œํ•œ๋‹ค.

3) spring-boot-maven-plugin classifier ์„ค์ •

classifier์„ ์„ค์ •ํ•˜๋ฉด ์‹คํ–‰๊ฐ€๋Šฅํ•œ warํŒŒ์ผ๊ณผ original warํŒŒ์ผ์ด ๋ถ„๋ฆฌ๋˜์–ด ์ƒ์„ฑ๋œ๋‹ค. ์‹คํ–‰๊ฐ€๋Šฅํ•œ warํŒŒ์ผ์˜ ์ด๋ฆ„์ด ์„ค์ •๋œ classifier๊ฐ€ ๋’ค์— ๋ถ™์–ด์„œ ์ƒ์„ฑ๋œ๋‹ค.

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

4) Application.java์— SpringBootServletInitailizer ์ƒ์† ์ถ”๊ฐ€

์ด์ „์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ /WEB_INF ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ํ•˜๋‚˜์˜ web.xml์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. web.xml์€ Web Application Deployment Descriptor(DD)๋กœ์จ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™์‹œํ‚ฌ ๋•Œ ์˜ฌ๋ผ๊ฐ€์•ผํ•  ์„ค์ •๋“ค(DispatcherServlet, ContextLoaderListener, Filter)์„ ์ •์˜ํ•˜๋Š” ๊ณณ์ด๋‹ค.

Sevlet 3.0๋ถ€ํ„ฐ web.xml ํŒŒ์ผ ์—†์ด๋„ WebApplicationInitializer ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •๋“ค์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
SpringBootServeltInitalizer์€ WebApplicationInitializer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฉฐ, SpringApplication์„ ์ „ํ†ต์ ์ธ WAR ๋ฐฐํฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

@SpringBootApplication
public class NodeApplication extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication.run(NodeApplication.class, args);
	}

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		return builder.sources(NodeApplication.class);
	}

}

๐Ÿ‘ End..

profile
๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€