Build tool Maven

이동엽·2023년 8월 2일
1

java

목록 보기
17/19

Maven이란?

Maven은 Java 프로젝트의 빌드를 자동화 해주는 빌드 툴로, Apache Ant의 대안으로 출시되었다.



Maven의 특징

  • 프로젝트의 전체적인 라이프 사이클을 관리하며, pom.xml 에 정의해 놓으면 라이브러리를 다운받을 수 있다.
  • 중앙 저장소를 통한 자동 의존성 관리를 한다.


간단하게 살펴보는 pom.xml 구조

우선 예시로 살펴 볼 전체 구조는 아래와 같다. (출처 : Maven guide)

<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> <http://maven.apache.org/xsd/maven-4.0.0.xsd>">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>


  1. 프로젝트 정보 (필수) :
    Maven의 XML 네임스페이스를 지정하고, Maven model version을 명시한다.
    추가로 그룹 id, 아티팩트 id, 버전명 등을 명시할 수도 있다.
<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> <http://maven.apache.org/xsd/maven-> 4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>songareeit</name>

  ...

</project>


  1. Properties (선택) : 주로 반복적으로 사용될 상수 값을 정의할 때 사용한다.

    <properties>
      <maven.compiler.source>1.7</maven.compiler.source>
      <maven.compiler.target>1.7</maven.compiler.target>
      <environment>dev<environment>
    </properties>
    


  1. Profiles (선택) : 각각 다른 설정 파일과 개발 환경을 구축할 때 사용한다.
    프로필을 어떻게 사용할 지는 아래 Goal 파트에서 함께 설명하겠다.

    <profiles>
      <profile>
        <id>local</id>
        <properties>
          <environment>local</environment>
        </properties>
      </profile>
      <profile>
        <id>dev</id>
        <properties>
          <environment>dev</environment>
        </properties>
      </profile>
    <profiles>
    


  1. Dependencies (필수) : 의존성 라이브러리 정보를 포함하여, 라이브러리를 불러오는 부분이다.

    아래에서 scope 는 라이브러리가 프로젝트 내에서 사용될 범위를 명시한다.

    • 종류는 6가지로 다음과 같다.
    • compile(기본 값), provided, runtime, test, system, import
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>x.y.z</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
</dependencies>


  1. Build (필수) : 디렉터리 구조로 project 태그 하위에 구성된다.

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>x.y.z</version>
                ...
            </plugin>
        </plugins>
    </build>
    


Goal

Maven이 행할 수 있는 여러가지 동작을 수행하는 명령을 말하며, 체인 형태로 실행 가능하다.

mvn [goal 명령어1] [goal 명령어2] [goal 명령어3]
mvn clean package
mvc clean package -P local


Goal 종류

  • clean : 컴파일 결과물인 target 디렉토리를 삭제한다.
  • compile : 모든 소스코드 컴파일, 리소스파일을 target/classes 디렉토리에 복사
  • package : compile 수행 후, 테스트 수행, <packaging> 정보에 따라 패키징 수행
  • install : package 수행 후, local repo에 install 수행
  • deploy : install 수행 후, 배포 수행, 여기서 배포는 웹서버에 배포가 아니다. 회사 repo에 배포다.
    • 아래와 같이 distributionManagement 항목이 기술되어야 한다.
    ...
    <distributionManagement>
      <repository>
        <id>releases-repo</id>
        <name>Releases Repository</name>
        <url>회사repository주소(넥서스)</url>
      </repository>
    </distributionManagement>
    ...

    


Maven vs Gradle 비교

Gradle은 Maven에 대해 논할 때 항상 비교가 되는 대상이다.



Gradle이란?

  • Ant와 Maven의 장점을 모아 2012년에 출시된 빌드 도구로, Java C/C++ Python 등을 지원한다.
  • Groovy 스크립트 언어로 구성되어 빌드 스크립트를 이용할 수 있으며, 로직을 구현하여 간결하게 작성할 수 있다.


Gradle이 Maven보다 좋은 점

  • Build라는 동적인 요소를 XML로 정의하기에는 어려운 부분이 많다.
    • 내용이 많아질 수록 가독성이 떨어지며, 의존 관계가 복잡한 프로젝트를 설정하기에는 부적절하다.
  • 빌드 타임 속도가 Maven보다 10 ~ 100배 빠르다.


Google Trend로 비교하기 (전세계 , 대한민국)

아래는 구글 트렌드에서 2023년 8월 1일 기준으로 지난 1년간 구글에서 나타내는 트렌드 비교이다.

좌측) 전 세계 기준, 우측) 대한민국 기준

위에서 Gradle이 좋은 점은 분명히 있다. (실제로 Gradle 공식 홈페이지를 가면 Maven과의 비교도 볼 수 있다.)

대한민국에서는 Gradle과 Maven의 비율이 비슷한데, 전 세계를 기준으로 보면 Maven이 압도적이다.



왜 여전히 Maven을 많이들 사용할까?

  1. 많은 개발자들이 Maven과 XML에 익숙한 상황에서 Gradle과 Groovy 문법은 적지않은 학습 비용이 든다.


결론

각자 프로젝트 환경에 적합한 빌드 방식을 택하자!

추가로 알아두면 좋을 내용

  • Maven 라이프사이클
profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

2개의 댓글

comment-user-thumbnail
2023년 8월 2일

유익한 글이었습니다.

답글 달기
comment-user-thumbnail
2023년 8월 4일

꺄악 징그러워

답글 달기