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 ์ง์์ ์ ๊ณตํ๋ค.
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 ์์ฑ๋ค์ ์ถ๊ฐํด์ผํ๋ค.
<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-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>
Spring Boot Plugin์ ๋ค์๊ณผ ๊ฐ์ goal๋ค์ ๊ฐ์ง๊ณ ์๋ค.
Goal | ์ค๋ช |
---|---|
spring-boot:build-image | OCI image๋ก ํจํค์ง |
spring-boot:build-info | build-info.properties ํ์ผ ์์ฑ |
spring-boot:repackage | Repackage, Jar๋ War ํ์ผ๋ก ์ฌํจํค์ง |
spring-boot:run | ํ์ฌ ์์น์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ |
spring-boot:start | Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ์์, "run" goal๊ณผ ๋ฌ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์๋์ blockํ์ง ์๊ณ ๋ค๋ฅธ goal๋ค์ ํ์ฉ |
spring-boot:stop | "start" goal๋ก ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃ |
"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 | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
outputDirectory | File | ${project.build.directory} | ์์ฑ๋ ํ์ผ์ด ์ ์ฅ๋ ํด๋ |
attach | Boolean | true | true : repackage jar/war ๋ฐฐํฌ, false : repackage jar/war ๋ฐฐํฌ ์ํจ |
classifier | String | repackage jar/war ํ์ผ์ ์ถ๊ฐํ ๋ถ๋ฅ์, ์ค์ ํ์ง ์์ผ๋ฉด ์ผ๋ฐ jar/war๋ฅผ ๋์ฒด | |
excludeDevtools | Boolean | true | Repackaing์, Spring Boot devtools ๋ฐฐ์ ์ฌ๋ถ |
excludeGroupIds | String | Repackaing์, ๋ฐฐ์ ํ groupId ๋ฆฌ์คํธ | |
excludes | List | Repackaging์, ๋ฐฐ์ ํ dependency | |
includeSystemScope | Boolean | false | system ์ค์ฝํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํฌํจ ์ฌ๋ถ |
includes | List | Repackaing์, ํฌํจํ dependency | |
skip | Boolean | false | ์คํ ๊ฑด๋๋ฐ๊ธฐ |
war๋ก ํจํค์งํ์ฌ ์ธ๋ถ Tomcat์ผ๋ก ๋ฐฐํฌํ ๊ฒฝ์ฐ์๋ ์ถ๊ฐ์ ์ธ ์ค์ ์ด ํ์ํ๋ค.
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
"provided" ์ค์ฝํ๋ runtime ์์ ์ JDK๋ ์ปจํ ์ด๋์ ์ํด ์ ๊ณต๋๋ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ํ๋ค.
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>
์ด์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ /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);
}
}