Maven 입문 | pom.xml 파일 기본 | Maven의 핵심 pom.xml
Maven은 커멘드를 사용하여 간단히 프로젝트를 만들거나 빌드가 가능하다. 예제로 만든 프로젝트는 단지 App.java라는 소스 코드 파일이 있는 만큼 간단한 것이었다.
Maven의 강점은 다양한 라이브러리와 프레임워크 등을 이용하는 경우도 그들을 모두 Maven이 관리해주는 점이다. 이러한 “프로젝트 관리"를 하기 위해서는, 단지 Maven 명령을 실행하는 것만으로는 끝나지 않는다. 프로젝트를 관리하고 있는 “빌드 파일"이라는 것에 대해 이해할 필요가 있다.
프로젝트 폴더를 열면, 거기에 “pom.xml"라는 파일이 포함되어 있는 것을 알 수 있다. POM은 “Project Object Model"의 약자로, 프로젝트의 다양한 정보를 처리하기 위한 객체 모델이다. pom.xml에는 프로젝트 설정을 XML 태그로 기술하고 있다.
그럼 기본적으로 어떤 소스 코드가 적혀 있는지 살펴 보자(아래 참조).
<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.devkuma</groupId>
<artifactId>SampleMavenApp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SampleMavenApp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
이것이 pom.xml의 기본 코드라고 해도 좋을 것이다. 좀 더 불필요한 것을 모두 제거하고 나면 기본 코드는 다음과 같다.
<project ... 중략 ...>
<modelVersion>4.0.0</modelVersion>
<groupId>그룹 ID</groupId>
<artifactId>아티팩트 ID</artifactId>
<version>버전</version>
<packaging>jar</packaging>
<name>이름</name>
<properties>
...... 속성 정보 ......
</properties>
<dependencies>
...... 의존 라이브러리 정보 ......
</dependencies>
</project>
pom.xml은 <project>
라는 루트 태그 내에 모든 정보를 기술한다. 이 <project>
는 xmlns / xmlns:xsi / sxi : schemaLocation 세세한 것들이 속성으로 여러 붙어 있는데, 이들은 모두 정해진 값이므로, 복사해서 쓰면 된다고 생각하면 된다. 필요에 따라 수정할 부분은 없다.
이 후에는 필요한 정보를 태그로 기술해 나갈뿐이다. 그럼 각각의 내용을 정리해 보겠다.
프로젝트 기본 속성
<project>
태그 다음에는 프로젝트에 대한 기본 속성을 설정하는 태그들이 있다. 이것들은 어떤 프로젝트도 대부분은 필요한 것이므로, 역할 정도는 정확히 기억해 두도록 한다.
<modelVersion>4.0.0</modelVersion>
POM 모델 버전이다. 이것은 “4.0.0"라고 설정한다. 당분간이 버전이 바뀔 것은 없다.
<groupId> 그룹 ID </groupId>
그룹 ID이다. 프로젝트를 만들 때 입력했다. 제작자와 회사, 단체 등을 식별하기 위한 것이다.
<artifactId>아티팩트 ID</artifactId>
아티팩트 ID는 프로젝트에 할당한 고유 ID 이다.
<version> 버전 </version>
프로그램 버전이다. 기본적으로 1.0-SNAPSHOT이 설정되어 있다.
<packaging>jar</packaging>
패키지 종류로 jar 또는 zip을 지정한다. Web 어플리케이션의 개발은 war를 지정할 수도 있다.
<name>이름</name>
프로그램 이름이다. 아티팩트 ID를 그대로 지정하는 것이 많을 것이다.
<url>주소</url>
프로젝트와 관련된 Web 사이트의 주소이다. 기본적으로 Apache Maven의 Web 사이트의 주소가 지정되어 있다.
<properties>
...... 속성 정보 ......
</properties>
이 pom.xml에서 사용하는 속성 값 등을 모아 둔다. 이것은 필요에 따라 기술한다. 기본적으로는 아래에 하나만 포함되어 있다.
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
이 project.build.sourceEncoding라는 속성은 소스 코드의 기본 인코딩을 나타낸다. 일반적으로 UTF-8이 설정되어 있다.
<dependencies>
...... 의존 라이브러리 정보 ......
</dependencies>
“의존 라이브러리"라고 하는 것은 이 프로그램이 참조하는 라이브러리이다. Java 기본 시스템 라이브러리는 제외한다.
최후에 <properties>
와 <dependencies>
를 제외하고, 프로젝트를 만들 때 입력한 것이 많다. 각각의 항목은 프로젝트를 만들 때 자동으로 기록되어 있기 때문에, 자신이 편집하는 일은 거의 없다. 역할 정도 알고 있으면 충분하다.
<dependencies>와 <dependency>
기본적으로 생성된 pom.xml의 기술에서 하나 뿐인 매우 태그가 복잡한 부분이 있었다. <dependencies>
라는 태그이다.
이것은 이미 언급한 바와 같이 의존 라이브러리 정보를 기술해 두기 위한 것이다. 하지만, 이 기술하는 태그가 많은 계층적으로 되어 있기 때문에, 상당히 이해하기 어려울지도 모른다. 이 태그는 기본적으로 다음과 같은 형태로 기술되어 있다.
<dependencies>
<dependency>... 생략 ...</dependency>
<dependency>... 생략 ...</dependency>
...... 중략 ......
</dependencies>
<dependencies>
은 의존 라이브러리를 한곳에 모아 기술하기 위한 것이다. 각각의 의존 라이브러리 정보는 <dependency>
태그를 사용하여 작성한다. 이 <dependency>
태그를 필요한만 큼 <dependencies>
태그 안에 기술한다.
<dependency>
태그
라이브러리 정보를 기술하는 <dependency>
태그는 태그 안에 몇 가지 정보를 기술하고 라이브러리 지정한다. 정리하면 다음과 같은 형태이다.
<dependency>
<groupId>그룹 ID</groupId>
<artifactId>아티팩트 ID</artifactId>
<version>버전</version>
<scope>범위</scope>
</dependency>
그룹 ID, 아티팩트 ID 및 버전은 앞전에 프로젝트와 동일하다. 라이브러리들도 모든 Maven 프로그램으로 만드는 이상, 그룹 ID 및 아티팩트 ID가 설정되어 있다. 이렇게 지정함으로써 어떤 라이브러리를 사용하는지를 알 수 있다.
단, <scope>
라는 것이 이해하기 어려울지도 모른다. 이것은 이 라이브러리가 이용되는 범위를 지정하는 것이다. 범위라고 하면 이해하기 어려울 수도 있지만, “어떤 때 사용하는지"를 나타내는 것이다. 이 응용 프로그램을 실행할 때 사용하는 경우는 특별히 지정하지 않아도 된다. 특별한 경우에만 준비하는 것이라고 생각해도 좋을 것이다.
<dependency>
태그의 <scope>
dependency 하위에 포함되는 항목으로, 해당 dependency가 포함되는 범위에 대한 타입이다. scope 종류는 아래와 같다.
- compile :
- 기본 scope이다. 입력하지 않아도 기본으로 적용된다.
- 모든 상황에서 포함된다.
- provided
- compile과 유사하게 모든 상황에서 수행된다
- 하지만, 다른 외부 컨테이너에서 기본 제공되는 API인경우 provided로 지정 시 마지막 패키징할 때 포함되지 않는다.
- 예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외된다.
- runtime
- 컴파일 시에는 불필요 실행시에 필요한 경우.
- 런타임 및 테스트 시 classpath에 추가 되지만, 컴파일시에는 추가 되지 않는다.
- test : 테스트시에만 사 사용한다.
- system
- provided와 유사하다
- system의 특정 path를 참조하도록 지정한다
- Maven의 central repository를 사용하지 않는다.
- import
- scope는 dependencyManagement 섹션에서 pom의 의존관계에 대해 사용한다.
JUnit 라이브러리
샘플로 만든 프로젝트에서는 “JUnit ‘라는 라이브러리 정보가 <dependencies>
에 기술되어 있다. 이것은 단위 테스트를 위한 기능을 제공하는 Java 라이브러리이다. Java에서 테스트라고 하면 대부분이 JUnit을 사용한다.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
이 라이브러리의 정보는 다음과 같이되어 있다.
그룹 ID : junit
아티팩트 ID : junit
버전 : 3.8.1 (경우에 따라 다르지도?)
범위 : test
그룹 ID와 아티팩트 ID는 고정으로 각각 “junit"로 지정되어 있다. 이것이 JUnit에 할당된 값이다. 버전은 프로젝트를 생성할 때 최소한의 버전이 설정되어 있을 것이다.
범위(scope)는 “test"로 되어 있다. 이것은 테스트 실행시에만 이용되는 것을 나타낸다. 실제로 프로그램을 실행할 때 사용할 수 없다. 따라서 프로그램을 빌드 패키징할 때도 이 JUnit이라는 라이브러리는 포함되지 않는다.
Maven는 프로그램 빌드 및 패키징 등의 처리할 때는, 반드시 단위 테스트도 동시에 실행된다. 이 때에 테스트 라이브러리가 포함되어 있지 않으면 빌드가 실패한다. 따라서 기본적으로 기술되는 JUnit 라이브러리의 <dependency>
태그는 “Maven 프로젝트에 필요한 라이브러리 설정"이라고 할 수 있다. 사용하지 않는다고 해서 삭제하지 않도록 한다.