본문 바로가기
Framework/Spring

Maven의 설정파일 Pom.xml을 알아보자

by I move forward every day. 2022. 5. 15.

빌드 툴에 대해 공부하다 보면 Maven에 대해 알게 된다.  Maven에 대해서 알게 됐다면 Maven의 설정 파일인 pom.xml에 대한 내용이 빠질 수 없으니 공부하며 정리하고 넘어가자. 빌드 툴이 뭔지는 이전 글에서 알아보았으니 빌드 툴인 Maven이 사용하는 설정 파일 pom.xml에 대해서 알아보자. 혹시 Maven, Gradle이 무엇인지 빌드 툴에 대한 기본적인 개념이 아직 잡혀있지 않다면 아래의 링크로 이동해 무엇인지 알아보자!

자바의 빌드 툴에 대해 알아보자

 

JAVA의 빌드툴에 대해 알아보자

토이 프로젝트 진행과 TDD에 대해 공부하기 위해 초기 프로젝트 세팅을 해야 했고, 그 과정 가운데 JAVA빌드 툴에 대해 알아야겠다는 생각이 들어 공부를 시작하게 되었다. 기존 알고 있던 빌드 툴

doosicee.tistory.com

 

 

POM.XML 이란 무엇인가?


빌드 툴을 Maven으로 사용한다면 프로젝트 생성 시 pom.xml 파일이 생겨있을 것이다. POM은 "Project Object Model"의 약자로, 프로젝트의 다양한 정보를 처리하기 위한 객체 모델이다. pom.xml 파일에는 프로젝트 관리 및 빌드에 필요한 환경 설정, 의존성 관리 등의 정보들을 기술한다.

Maven 빌드 툴을 기반으로한 프로젝트에 pom.xml
Maven프로젝트에 생성된 pom.xml 파일

 

 

 

POM.XML의 최소한의 구성


<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>maven-pom-project</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

project, modelVersion, groupId, artifactId, version 이 5가지는 메이븐이 허용한 최소값 이라고 한다. 각 요소별로 의미하는것은 아래로 내려가 POM.XML의 기본 속성에서 알아보도록 하자.

 

 

 

POM.XML의 기본 속성 태그


<project></project>

<project> 프로젝트의 정보를 기술한다.

<modelVersion>4.0.0</modelVersion>

<modelVersion> 4.0.0이라고 적혀있는 이것은 maven의 pom.xml의 모델 버전이다. Maven 1.x 버전들은 3.0.0 모델을 사용하였지만, Maven 2.x , Maven 3.x 는 4.0.0버전을 사용합니다.

<groupId>org.example</groupId>

<groupId>  프로젝트를 생성한 그룹명으로 제작자와 회사, 단체 등을 식별하기 위한 것이다.

<artifactId>maven-pom-project</artifactId>

<artifactId>  버전정보를 생략한 jar 파일의 이름이다. 이름 작성시 몇가지 규칙이 있는데 소문자로만 작성, 특수문자는 사용하기, third party jar파일이라면 할당된 이름 사용을 해야한다.

third party란?
프로그래밍에서의 서드파티란 프로그래밍을 도와주는 plug_in이나 library 등을 만드는 회사를 말한다. 개인 개발자나 프로젝트 팀, 혹은 업체등에서 개발하는 라이브러리 즉, 제 3자가 만든 해당 툴 지원 라이브러리이다. 예를들어 프로그래밍 개발과 개발자 사이에 플러그인, 라이브러리, 프레임워크를 서드파티로 볼 수 있다.

그렇다면 third party jar란?
제 3자(MongoDB)가 만든 mongo-java-driver-3.12.11.jar를 받아 사용하는것이다.위에서 말했듯이 버전 정보를 생략한 jar파일의 이름이 들어가기에 <artifactId>mongo-java-driver</artifactId> 라는 형식이 되는것이다.
<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.12.11</version>
</dependency>
<version>4.0.0</version>

<version>  명시된 그룹의 artifact버전을 표기한다. 숫자와 점으로 이루어진(4.0.0) 일반적인 버전 형태를 사용한다. 만약 third party Artifact 조금 이상하게 보일수 있어도 그들이 넘겨준 버전 넘버를 받아 사용하도록 한다.

<packaging>jar</packaging>

<packaging> 프로젝트를 어떤 형태로 패키징할지 지정한다.(jar, war, zip 등...)

<properties>
	<spring.maven.artifact.version>4.3.16.RELEASE</spring.maven.artifact.version>
</properties>

<properties> pom.xml에서 사용하는 속성 값 들을 정의하고 pom내 어디서든 사용할 수 있다. 아래의 코드는 properties에 정의한 속성 값을 사용하는 방법이다.

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.maven.artifact.version}</version>
</dependency>

${spring.maven.artifact.version} 다음과 같이 사용하면 된다.

<url>http://www.egovframe.go.kr</url>

<url> 프로젝트와 관련된 Web사이트의 주소이다.

 

 

 

<dependencies>와 <dependency>


<dependencies> 태그

<dependencies>
	<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.maven.artifact.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.maven.artifact.version}</version>
	</dependency>
</dependencies>

<dependencies> pom.xml 태그중 최상위 속성을 가진 태그중 하나이며, 프로젝트와 의존관계에 있는 라이브러리들을 모아 관리하는 곳이다 . 각각의 의존 라이브러리들의 정보는 <dependency> 태그를 사용하여 작성한다.  참고로 <dependencies> 태그는 라이브러리들 을 모아서 관리하는곳이기에 <dependency> 태그를 사용하여 필요한 라이브러리들을 전부 기술하면된다.

 

<dependency> 태그 와 <scope> 태그

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

<dependency> 태그는 라이브러리의 정보를 기술한다. groupId, artifactId, version은 위에 pom.xml의 기본태그 에서 설명한 바와 같다. 그러나 <scope> 태그는 처음볼것이다. <scope> 태그는 이 라이브러리가 이용되는 범위를 지정하는 것이다. JUnit 라이브러리는 테스트를 위한 기능을 제공하는 Java라이브러리인데 위의 코드를 보면 <scope>를 test로 지정해둔것을 볼 수 있다. 쉽게 생각하면 어떤 때 사용하는지를 기술하는 것이다. 나는 JUnit 라이브러리를 test할때에만 사용하겠다 라고.

 

 

 

<profiles> 와 <profile> 태그


<profiles>

<profiles> 태그는 <profile>태그들을 정의하는 공간이다. <profile>태그들을 모두 <profiles>태그 안에 기술하면 된다.

 

<profile>

<profile> 태그는 특정 Build 환경에 맞춰 리소스의 재배치 및 환경에 대한 옵션들을 설정하여 실행할 수 있게 하는 태그이다. 예를들어 빌드환경을 3단계로 나누어 개발 / 테스트/ 운영 시스템 단위로 구분한다고 했을 때, 각 단계마다 필요로 하는 설정 정보나 리소스 파일들을 배치시켜주는 역할을 한다.

 

<profile>태그 안에서 사용하는 속성들을 알아보자

<profiles>
	<profile>
      	<id>local</id>
      	<activation>
        	<activeByDefault>true</activeByDefault>
      	</activation>
      	<properties>
           <environment>local</environment>
      	</properties>
	</profile>
    <profile>
      	<id>test</id>
      	<properties>
        	<environment>test</environment>
      	</properties>
      	<build>
        	<plugins>
           	 	<plugin>
               	 <groupId>com.github.eirslett</groupId>
                 <artifactId>frontend-maven-plugin</artifactId>
                 <version>1.6</version>
            	</plugin>
        	</plugins>
    	</build>
	</profile>
</profiles>

위의 코드는 간단하게 local 환경과 test환경으로 구분해둔 코드이다.

<id>local</id>

<id> 태그는 profile의 id를 정의할 수 있다. 개발(local), 테스트(test), 운영(real)

<activation>
	<activeByDefault>true</activeByDefault>
</activation>

<activation> 태그는 Build시 활성화 정보 여부를 기술한다. 간단히 말해 아무것도 명시하지않고 Build하였을 때에 어떤 profile이 활성화 될지 기술하는 곳이다. <activation>태그안에 <activeByDefault>태그를 사용하여 빌드시 profile을 명시하지 않았을때에 기본적으로 활성화 될 profile을 기술하여 주면 된다.

 

 

 

Build수행을 위한 pom.xml 태그와 설정


빌드구성은 pom.xml파일에서 <plugin>설정에 의해서 실행되며 <build>, <plugins>와 <plugin>에 대해서 살펴보자. Maven에서 기본 plugin들의 goal 바인딩을 통해 여러 phase가 수행할 행동을 정의하고, 이 phase의 순서로 작업이 진행된다. 따라서 빌드/배포를 위한 Maven pom.xml파일을 구성 한다는 말은 작업을 위해 여러 plugin의 goal을 원하는 phase에 바인딩 하는 일이라고 말 할수있다고 한다.

잠깐! 여기서 알고가야 할 개념이 있다.
Maven은 플러그인을 구동해주는 프레임워크(plugin execution framework)이다. 모든 작업은 플러그인에서 수행한다고 한다.

그렇다면 플러그인이란 뭘까?
호스트 응용 프로그램과 서로 응답하는 컴퓨터 프로그램이며, 특정한 "주문식" 기능을 제공한다. 응용 프로그램이 플러그인을 제공하는 까닭은 많다. 이를테면, 서드파티 개발자들이 응용 프로그램을 확장하는 기능을 만들게 하거나, 뜻밖의 기능을 지원하거나 응용 프로그램의 크기를 줄이거나, 호환되지 않는 소프트웨어 라이선스 문제로 인해 소스 코드를 응용 프로그램에서 분리하는 것을 들 수 있다.

출처 : https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8

내가 플러그인을 이해한 바로는 라이브러리에 집합체 라는걸로 이해하였고, 라이브러리를 넣었다 뺏다하면서 필요한 기능들을 넣어 확장하고 필요없는 기능은 라이브러리를 빼서 응용프로그램의 크기를 줄인다는 것 으로 이해하였다.

<goal>
어떤 작업을 수행할 지 지정할 수 있다. 몇몇 goal들은 이미 내장되어 있어 Maven이 알아서 작업을 수행해준다.
Phase
라이프사이클의 단계를 의미한다. Phase가 실행되면 해당 Phase와 연결된 플러그인 goal이 실행된다.

 

<build>태그의 구성

  • build태그 안쪽으로 다수의 플러그인들을 설정할 수 있다.
  • pom.xml파일 내에서 여러 플러그인들의 실행에 관련된 설정들을 지정할 수 있다.
<build>
        <plugins>
          <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <version>1.6</version>

            <configuration>
              <workingDirectory>frontend</workingDirectory>
              <nodeVersion>v8.11.1</nodeVersion>
              <npmVersion>5.6.0</npmVersion>
            </configuration>

            <executions>
              <execution>
                <id>install-node-and-npm</id>
                <goals><goal>install-node-and-npm</goal></goals>
                <phase>generate-resources</phase>
              </execution>
              
          </plugin>
        </plugins>
      </build>

 

<plugins>태그의 구성

  • 플러그인의 설정을 하는 태그로 <groupId>, <artifactId>, <version>으로 구성된다.
  • <plugin>은 실행 시 옵션인 <configuration>과 언제 실행될지에 대한 설정인 <execution>으로 구분된다.
  • Maven에서 제공하는 기본 플러그인 메뉴얼 : https://maven.apache.org/plugins/#available-plugins

 

<configuration>

  • execution 설정이나 기본 바인딩등으로 플러그인의 goal이 실행될 때의 실행옵션을 정한다.
  • 플러그인 바로 밑에 구성된 <configuration>은 해당 플러그인내 여러 goal들의 수행시 기본 옵션이며,
  • 이와 반대로 <excution>하위에 있는 옵션은 해당 execution 내에서만 유효하며, default configuration을 오버라이딩 한다.
  • configuration에 들어가는 옵션들은 각각의 goal에서 사용하는 옵션인지 여부에 관계없이 설정 해 놓기만 하면, goal이 수행될 때, 자신의 옵션에 해당되는 값들을 알아서 찾아서 반영한다고 한다.

 

<execution>

  • execution은 해당 플러그인이 언제, 어떤 configuration으로 실행될지에 대해 기술하는 곳이다. execution은 플러그인 goal을 Maven의 phase에 바인딩하는 설정이라고 할 수 있다고 한다.
  • <goal> 플러그인의 어느 goal을 실행할 것인지 지정한다.(플러그인에는 여러개의 goal이 있을수 있다)
  • <phase> goal을 어느 Phse에 바인딩 할 지 지정한다.
  • <id> 해당 <execution>설정에 대한 식별자이다.

 

 

 

마무리


pom.xml에 대해 간단히 알아보았습니다. 이번 공부로 기억할 것은 pom.xml 파일에는 프로젝트 관리 및 빌드에 필요한 환경 설정, 의존성 관리 등의 정보들을 기술한다 라는것 입니다.  또한 잘못 이해하거나 설명한 개념이 있다면 언제든지 말씀 해주시면 참고해서 공부하겠습니다.

 

 

참고했던 블로그들

애플리케이션 빌드를 위한 pom.xml plugin설정

Maven, pom.xml이 뭐에요?

pom.xml 파일기본

'Framework > Spring' 카테고리의 다른 글

Spring framework MVC 패턴 알아보기  (0) 2022.05.22
Spring framework 는 무엇인가  (0) 2022.05.17