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

Maven 프로젝트 기본 구조


이제 프로젝트의 기본구조에 대해 알아보자.


Maven을 이야기 할 때 나오는 글이 있다.

"Convention Over Configuration" 이다.

관습이 설정보다 우선한다. 라는 말이다.

개발자가 모든 것을 설정하는 것보다 기본적으로 정해진 규칙에 따라서 그냥 사용하자. 

라는 말 같다.

필요하면 그때 설정을 통해 변경 하되 그게 아니라면 굳이 신경쓰지 말고 사용하면 된다 라는 것이다.


앞으로 설명하게 될 디렉토리 기본구조, 기본 네이밍 컨벤션, 빌드, 의존성 관리 등을 알아보면 이 말이 무슨 말인지 알 수 있게 될 것이다.


기본 디렉토리 구조


Maven의 기본 디렉토리 구조이다.

아마도 많이 익숙한 구조일 것이다.


프로젝트 하위에 pom.xml 파일과 src 디렉토리가 존재하고, 그 아래로 main과 test라는 똑같은 하위 디렉토리 구조를 갖는 디렉토리가 존재한다.


Maven 프로젝트로 스프링을 개발하는 사람들 중에는 이 구조를 "스프링 개발자들이 사용하는 일반적인 방식" 이라고 생각할 수도 있다. 

하지만 이 구조는 Maven에서 정의한 구조이다.


실제 프로젝트와 비교


실제 프로젝트랑 비교해보면, 기본 구조와 일치하는 것을 알 수 있다.

연두색 박스는 web 프로젝트일 경우에 webapp 폴더 역시 기본 디렉토리 구조에 포함 된다.



기본 구조 설명


각각의 디렉토리는 위 이미지와 같은 역할을 한다.


정리

지금까지 Maven의 기본 디렉토리 구조에 대해 알아보았다.

이걸 알았으니 이제 어떤 Maven 프로젝트를 개발하게 되더라도 구조가 한번에 보일 것이다.


기본 구조를 변경하지 않은 프로젝트라면 항상 지금 구조와 같다고 생각하면 된다.

그리고 당신이 Maven 기본 디렉토리 구조로 작업을 했다면 다른 사람들도 역시 쉽게 파악이 될 것이다.

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

[MAVEN] POM & SUPER POM  (0) 2019.01.25
[MAVEN] Maven 설치  (0) 2019.01.25
MAVEN 시작  (0) 2019.01.25

Maven 설치


잠깐만요!!

Intellij 를 사용하고 있는 사람이라면 Intellij 가 Bundle로 가지고 있기 때문에 설치를 하지 않아도 Maven 프로젝트를 시작할 수 있다.

Intellij Settings 에서 Maven을 검색하면 확인 가능하다.




실제 jar파일 위치




하지만 그래도 설치를 하자. 



설치 요약

  1. http://maven.apache.org/download.cgi 파일 다운로드
  2. 압축 해제 후, 해당 경로 시스템 환경 변수 추가 “MAVEN_HOME”
  3. 시스템 환경 변수 “PATH”에 “MAVEN_HOME/bin” 추가
  4. 설치 확인

설치 순서 및 확인


마지막 이미지는 Maven 명령어를 이용한 버전 확인으로 설치가 잘 되었는지 확인하는 것이다.

Maven은 Java 위한 프로젝트이기 때문에 반드시 Java가 설치되어 있어야 한다.


설정 파일 및 라이브러리 위치


  • Maven 전역 설정 파일과 Maven 사용자 설정 파일은 필수는 아니다.

    • 사내 Repository를 사용 할 때 필요하다.

  • USER_HOME/.m2/repository에는 의존성 항목들이 존재한다.
    • Dependency 내용에서 자세하게 다룬다.
  • POM.xml 파일은 maven의 핵심 파일이다.




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

[MAVEN] POM & SUPER POM  (0) 2019.01.25
[MAVEN] 프로젝트 기본 구조  (0) 2019.01.25
MAVEN 시작  (0) 2019.01.25

계기 

Maven 에 대해서 자세히 알아보게 된 계기는 신입사원 교육에서 Maven을 담당하게 되었기 때문이다.

Maven 에 대한 사용법은 뭐 워낙 쉽다보니 누구나 잘 사용하겠지만

"필요한 라이브러리를 추가하면 됩니다." 라고 말하면 교육이 너무 빨리 끝나서 교육실에 왔다 돌아가는 시간보다 짧을 것 같았다.

그래서 기본적인 내용들에 대해서 자세히 설명해 주기 위해서 정리를 하게 되었다.

Gradle 역시 많이 사용하지만 현직장에서는 Maven을 사용하기 때문에 Maven을 교육하게 되었다.


목표

  • Maven 문서를 읽는데 필요한 기초 지식을 쌓는다.
  • Maven을 사용하여 프로젝트를 시작할 수 있다.
  • Maven 관련 문제 해결에 도움이 되도록 한다.
  • 후배 또는 선배 개발자들에게 Maven에 대해 설명할 수 있도록 한다.
  • maven에 대한 품격 있는 질문을 할 수 있도록 한다.
이정도 목표를 가지고 시작한다.

내용

  • Maven 기본 구조
  • dependency
  • Nexus
  • Build
에 대한 사용법과 기본적인 메커니즘에 대해 정리하고자 한다.

이를 위해서 Maven 공식 사이트를 가장 많이 참고 했으며, 다른 분들이 작성하신 블로그도 참고를 했다.

Maven이란

Maven이란...한마디로 말하면 그냥 개편하다.
처음부터 Maven을 사용했다면 너무나도 당연한 기능이겠지만 의존성 관리부터 빌드를 정말 쉽고 빠르게 해준다.
도대체 뭐가 빠르고 편한지는 내용에 조금 들어있다.

공식문서에 있는 소개 내용의 마지막을 보면 
자바 개발자의 일상적인 작업을 보다 쉽게 해주고 자바 기반 프로젝트의 대한 이해를 돕기 위해 만들었다고 한다.

Maven의 목표

  • Making the build process easy
  • Providing a uniform build system
  • Providing quality project information
  • Providing guidelines for best practices development
  • Allowing transparent migration to new features

자세한 내용은 아래 주소로 가면 된다.

https://maven.apache.org/what-is-maven.html


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

[MAVEN] POM & SUPER POM  (0) 2019.01.25
[MAVEN] 프로젝트 기본 구조  (0) 2019.01.25
[MAVEN] Maven 설치  (0) 2019.01.25

+ Recent posts