POM & SUPER POM

이전 글에서는 Maven 기본 디렉토리 구조에 대해서 알아봤다.


이번 글에서는 Maven에서 가장 중요한 POM에 대해서 알아보자.

가장 중요한 것이지 어려운 것은 아니다.


POM이 가장 중요한 이유는 POM에 프로젝트에 대한 모든 정보가 들어있기 때문이다.

프로젝트의 이름, 버전, 빌드 프로세스, 참조 라이브러리 등등 매우 많은 정보가 포함되어 있다.

Maven 프로젝트를 개발하게 되었다면, pom.xml 파일을 잘 확인하라. 대부분의 정보가 있을 것이다.


POM

  • POM : Project Object Model
  • Maven 프로젝트의 전부이다.
  • Maven 프로젝트 구성 정보를 xml 형식으로 나타낸다.
  • 빌드 프로세스 중에 사용되는 플러그인 정보가 있다.
  • 의존성 항목들이 있다.


pom.xml


Intellij 에서 Maven 프로젝트를 생성하면 기본 디렉토리 구조와 함께 다음과 같은 pom.xml 파일이 생성된다.

그리고 pom.xml 파일에는 위 이미지와 같은 정보들이 들어 있다.


pom.xml 설명

  • modelVersion : 필수값이라고 생각 하면 된다. Maven2, Maven3 모두에서 지원되는 POM 버전
  • groupId : 이 프로젝트가 어디에 속한 프로젝트인지를 알 수 있는 정보이며 일반적으로 도메인 같은 특정한 식별 정보를 사용한다. Spring Boot 의 groupId가 'org.springframework.boot' 라는 것을 보면 어느정도 느낌이 올 것이다.
  • artifactId : 현재 프로젝트의 Artifact 이름이다. 프로젝트 이름과는 다르다. 현재 프로젝트가 빌드 될 때 artifactId 가 빌드가 완료된 파일의 이름으로 사용된다.(build 파일 이름을 변경 하는것도 가능하다.)
  • version : 프로젝트의 현재 버전 정보다. 일반적으로 버전 뒤에 SNAPSHOT 또는 RELEASE를 붙여서 사용한다.
    • SNAPSHOT : 현재 개발중인 버전이다. 아직 검증된 버전은 아니므로 문제가 발생할 가능성이 있다. 또한 SNAPSHOT 버전을 dependency로 추가 하기 위해서는 해당 버전이 존재하는 Repository를 반드시 추가해야 한다. 이유는 아직 검증이 완료된 버전이 아니기 때문에 Maven Central Repository 에는 아직 업로드 되지 않았기 때문이다.
    • RELEASE : 테스트를 포함한 검증이 완료된 버전으로 Maven Central Repository에 업로드 되어 있다. 안전한 버전으로 되도록이면 RELEASE 버전을 사용하는 것이 안전하다.
  • packaging : 패키징 타입 정보이다. 미입력 시 jar로 packaging 되며, jar, war, pom 등이 존재한다.
  • 프로젝트를 빌드하면 파일 이름은 Test03-1.0-SNAPSHOT.jar  가 되는데 위에서 설명한 artifactId,version,packaging 를 모두 더한 값이다. (파일명을 수정할 수 있다.)
  • name : 프로젝트 이름이다. 큰 의미는 없다. artifactId 와는 관련이 없다.
  • url : 사이트 URL 이다. (보통 프로젝트의 대한 정보가 있는 사이트)
  • dependencies: 현재 프로젝트에서 참조하고 있는 의존성(라이브러리) 목록
  • dependency : 의존(라이브러리) 프로젝트 POM 정보
    • groupId : 의존 프로젝트의 groupID
    • artifactId : 의존 프로젝트의 artifactId
    • version : 의존 프로젝트의 사용할 Version
    • scope : 의존 프로젝트의 적용 범위
  • 형광색 박스로 되어 있는 부분을 보면 groupId, artifactId, version이 같다는 것을 알 수 있다. 눈치 챘겠지만 dependency로 추가한 라이브러리 역시 maven 프로젝트 이기 때문에 같은 형식으로 되어 있는 것이다.
  • 추가 정보

pom.xml 공식 문서


pom.xml에 존재하지 않는 정보


지금까지 pom.xml에 대해서 알아 봤다.
pom.xml 에 대한 내용은 많은 사람들이 알고 있기도 하다.
그런데 pom.xml 에는 나오지 않는 내용들이 있다.
  • 기본 디렉토리 구조에 대한 설정 정보
  • 빌드를 위한 buildPath 정보
  • 빌드 결과 디렉토리(target)에 대한 정보
  • dependency를 추가 했을 때 라이브러리를 다운 받는 곳의 정보(Remote Repository)
Repository에 대해서는 지금 무슨 말인지 모르더라도 괜찮다. 나중에 설명이 나온다.
간단하게 설명하면, 
Remote Repository : 라이브러리 들이 업로드 되어 있는 원격 저장소 (기본 : Central Repository)
Local Repository : 라이브러리 들이 다운로드 되어 있는 로컬 저장소 (기본 : USER_HOME/.m2/ )

이 정보들은 다음에 나오는 Super POM 에 존재한다.

SUPER POM

SUPER POM

  • Maven의 기본 POM
  • 모든 POM은 Super POM을 상속한다.
  • Super POM에 설정된 내용을 기반으로 동작한다.
  • MAVEN_HOME/lib/maven-model-builder-{version}.jar 에 존재한다.
    • Intellij Bundle을 사용할 경우 : Intellij 설치 위치/lib/maven-model.builder-{version}.jar
  • 의존성 추가 시 다운로드 받을 repository의 정보

SUPER POM 내용

  • build.directory : 빌드가 될 곳의 디렉토리 정보

  • build.outputDirectory : 컴파일 된 클래스 파일의 위치 (기본적으로 classpath로 사용 됨)

  • build.fileName : 빌드(패키징) 파일의 이름

  • build.testOutputDirectory : 컴파일 된 Test 클래스 파일의 위치

  • build.sourceDirector : 컴파일 대상 디렉토리

  • build.testSourceDirectory : Test 컴파일 대상 디렉토리

  • build.resources.resource.directory : 리소스 파일 위치 (기본적으로 classpath로 사용 됨)

  • build.testResources.testResource.directory : Test 리소스 파일 위치 (기본적으로 classpath로 사용 됨)

Pom.xml 에는 없던 디렉토리 구조와 빌드 디렉토리 구조의 정보를 확인할 수 있다.


pom.xml 에 dependency를 추가 하면, 해당 라이브러리가 다운로드 된다.

하지만 pom.xml 에는 어디에서 다운로드 할 것이라는 정보가 존재하지 않는다.

Super POM에서 Repository 정보를 이미 가지고 있기 때문이다.

따라서 pom.xml에 Repository 정보를 추가하지 않아도 Maven Central Repository에서 다운로드가 가능했던 것이다.



실제 프로젝트와 비교


Super POM에 있는 내용과 일치하는 것을 확인할 수 있다.


물론 상속 구조이기 때문에 pom.xml에서 Super POM에 있는 기본 내용을 재정의 할 수 있다.


지금까지 POM과 SUPER POM에 대해서 알아보았다.

그렇다. 

대부분의 프로젝트에 대한 정보는 POM 그리고 SUPER에서 정의하고 있고

우리는 그냥 그대로 사용하면 된다.








'개발 > [MAVEN] MAVEN 이해하기 - 기초' 카테고리의 다른 글

[MAVEN] 프로젝트 기본 구조  (0) 2019.01.25
[MAVEN] Maven 설치  (0) 2019.01.25
MAVEN 시작  (0) 2019.01.25

+ Recent posts