Spring을 공부하던중 메이븐과 그래들에 대해 알게 되었고 이러한 개념들의 정리가 필요할거같아 정리해보려 합니다.

Maven이란?

maven.png

  • Maven은 Apache Ant의 대안으로 만들어진 자바용 프로젝트 관리 도구로써 프로젝트의 작성부터 컴파일등 프로젝트 라이프사이클에 포함되는 모든 테스트를 관리 및 지원하는 도구입니다.
  • Maven은 필요한 라이브러리를 문서(pom.xml)에 정의해 놓으면 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 라이브러리 모두 네트워크를 통해서 다운받아 관리합니다.

Maven이 참조하는 파일

settings.xml

  • settings.xml은 maven의 tool 자체의 설정을 담당하는 파일입니다.

pom.xml

  • 자바 프로젝트를 생성할때 빌드 툴로 Maven을 선택했다면 프로젝트 디렉토리에 pom.xml이 생성되었을것입니다.
  • pom.xml은 Project Object Model을 설정하는 부분으로 프로젝트 내의 빌드 옵션을 설정합니다.

아래는 Spring boot project을 생성했을때 생성되는 pom.xml입니다.

프로젝트를 생성할때 lombok등의 라이브러리를 추가하였기때문에 dependencies 태그 안 dependency태그에 라이브러리가 추가된걸 확인할수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <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>

</project>

메이븐의 빌드 생명주기(LifeCycle)

메이븐을 정확히 이해하기위해서는 plugin, phase, goal, Life Cycle을 이해해야합니다.

plugin

메이븐에서 제공하는 모든 기능은 플러그인을 기반으로 동작합니다.

메이븐은 자체는 기본적인 기능만 가지고 있고 대부분의 기능들은 플러그인을 통해 제공하도록 되어있기 떄문이다.

플러그인은 몇가지 goal을 가지고 있으며 goal은 플러그인에 포함되어있는 명령입니다.

goal

goal은 maven이 행할수 있는 여러가지 동작을 수행하는 명령이자 Maven의 실행 작업단위입니다.

ex) $ mvn [goal 명령어] [goal 명령어] [goal 맹령어]

  • 종류

  • clean : 컴파일 결과물인 target 디렉토리 삭제
  • complie : 모든 소스코드 컴파일, 리소스 파일을 target/classes 디렉토리에 복사
  • packaget : compile 수행후, 테스트 수행, 정보에 따라 패키징 수행
  • install : package 수행후, local repo에 install 수행
  • deploy : install 수행후, 배포 수행

phase

phase는 단계를 의미한다. 빌드 라이프사이클에서 빌드 단계와 각 단계의 순서만을 정의하고 있는 개념으로 빌드 과정에서 phase가 빌드 작업을 하지 않습니다.

실질적인 빌드 작업은 각 phase에 연결되어 있는 plugin 의 goal이 합니다.

  • Life Cycle

위에서 정리한 plugin, phase, goal을 정리하여 이야기하면

메이븐은 프로젝트 생성에 필요한 단계 (phase)들을 Build Life Cycle이라 정의하고 Build Life Cycle은 default, clean, site 세가지로 표준 정의합니다.

mavenlifecycle.png

예시로 위의 Default Life Cycle phase 순서도를 봤을때

Life Cycle 안에 세부적으로 단계(phase)로 나누어져 있으며 각 phase을 실행하면 해당 phase와 연결되는 Plugin의 goal이 실행된다고 말할수 있습니다.