검수요청.png검수요청.png

메이븐

해시넷
이동: 둘러보기, 검색
메이븐(Maven)
메이븐(Maven)

메이븐(Maven)은 자바용 프로젝트 관리 도구이다. 아파치 앤트(Apache Ant)의 대안으로 만들어졌다.

개요[편집]

메이븐은 자바 기반 프로젝트의 컴파일과 빌드를 동시에 수행, 테스트를 병행하거나 서버 측 디플로이(Deploy) 자원을 관리할 수 있는 환경을 제공한다. 프로젝트 객체 모델, 표준들, 프로젝트 생명주기, 의존성 관리 시스템, 생명주기에 정의된 단계에서 플러그인 goal을 실행하는 로직을 포함하는 프로젝트 관리 도구이며, 앤트와 마찬가지로 프로젝트의 전체적인 라이프사이클을 관리하는 도구로, 많은 편리함과 이점이 있어 널리 사용되고 있다.[1]

특징[편집]

메이븐은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 자신이 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는 데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다. 또, 중앙 저장소를 통한 자동 의존성 관리를 중앙 저장소가 라이브러리를 공유하는 파일 서버라고 볼 수 있고, 메이븐은 자기 회사만의 중앙 저장소를 구축할 수도 있다. 그리고 간단한 설정을 통한 배포 관리가 가능하다.[2]

장단점[편집]

  • 장점 : 컴파일과 빌드를 동시에 수행할 수 있고, 서버의 디플로이 자원을 관리할 수 있는 환경을 제공한다. pom.xml 파일을 통해 관리하므로 개발, 유지보수 측면에서 오픈소스 라이브러리, 프로젝트 등 관리가 용이하다. 그리고 IDE에 종속된 부분들을 제거할 수 있고, Maven Profile 기능을 통해 배포 설정 파일을 관리하고 배포 파일을 생성할 수 있다.[3]
  • 단점 : 메이븐에서 기본적으로 지원하지 않는 빌드 과정을 추가해야 하는 경우 상당히 복잡해진다. 그리고 특정 플러그인 설정이 조금만 달라지면, 해당 설정을 분리해서 중복 기술할 때가 발생하고, 불필요하게 설정이 길어지고 중복, 가독성 저하가 발생하여 재사용성 및 확장성을 떨어뜨려 유지보수가 어려워진다. 이와 같은 단점을 해결하기 위해, 그레이들(Gradle)이라는 새로운 빌드 툴이 등장했으며, 이는 안드로이드 애플리케이션의 기본 빌드 툴로 채택되었다.[3]

라이프사이클[편집]

메이븐에서는 미리 정의하고 있는 빌드 순서가 있으며, 이 순서를 라이프사이클이라고 한다. 라이프사이클의 각 빌드 단계를 phase라고 하며, 각 phase들은 의존 관계를 가진다.[2]

  • Clean : 이전 빌드에서 생성된 파일들을 삭제하는 단계
  • Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
  • Compile : 프로젝트의 소스코드를 컴파일하는 단계
  • Test : 유닛(단위) 테스트를 수행하는 단계(테스트 실패 시 빌드 실패로 처리, 스킵 가능)
  • Package : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 배포를 위한 패키지로 만드는 단계
  • Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
  • Install : 패키지를 로컬 저장소에 설치하는 단계
  • Site : 프로젝트 문서를 생성하는 단계
  • Deploy : 만들어진 패키지를 원격 저장소에 릴리즈하는 단계[2]

최종적인 빌드 순서는 Compile -> Test -> Package이다.

  1. Compile : src/main/java 디렉토리 아래의 모든 소스 코드가 컴파일된다.
  2. Test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스 코드가 컴파일된다. JUnit으로 테스트 단계를 거치기 위해 의존 설정을 해 준다.
  3. Packaging : 컴파일과 테스트가 완료된 후, jar, war 같은 형태로 압축하는 작업[2]

플러그인[편집]

메이븐은 플러그인을 구동해 주는 프레임워크이다. 모든 작업은 플러그인에서 수행하고, 플러그인은 다른 산출물과 같이 저장소에서 관리된다. 메이븐은 여러 플러그인으로 구성되어 있으며, 각각의 플러그인은 하나 이상의 goal(명령, 작업)을 포함하고 있다. Goal은 메이븐의 실행단위이다.[4]

구 분 플러그인명 설 명
core plugins clean, compiler, deploy, failsafe, install, resources, site, surefire, verifier 기본 단계에 해당하는 핵심 플러그인
packaging types/tools ear, ejb, jar, rar, war, app-client, shade 압축 도구
reporting plugins changelog, changes, checkstyle, javadoc, pmd, surefire-report 리포팅 도구
tools ant, antrun, archetype, assembly, dependency, pdf, plugin, repository 기타 다양한 도구

POM.xml[편집]

pom.xml은 메이븐을 이용하는 프로젝트의 root에 존재하는 xml 파일이다. pom은 프로젝트 객체 모델을 뜻한다. 프로젝트 당 1개가 있는데, 이것만 보면 프로젝트의 모든 설정, 의존성 등을 알 수 있다.[4]

  • 메이븐 자바 프로젝트 설정 예시(POM.xml)
<?xml version="1.0" encoding="UTF-8"?>
 <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/maven-v4_0_0.xsd">
<!-- 프로젝트 정보 설정 ->
<modelVersion>4.0.0</modelVersion> <groupId>maven-example</groupId> <artifactId>example</artifactId> <packaging>jar</packaging> <version>1.0.0</version> <name>example</name>
<!-- 프로젝트 속성 설정 ->
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <junit.version>4.12</junit.version> </properties>
<!-- 연관성과 의존성 설정 ->
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </project>
엘리먼트
  • <groupId><artifactId> : 메이븐 프로젝트의 프로젝트 그룹과 하위 그룹 이름에 대한 설정으로 필수 입력 정보이다. 아파치 그룹의 프로젝트와 구성을 본 적이 있다면 쉽게 이해할 수 있다. 대표적인 아파치 그룹의 프로젝트 중에 commons 프로젝트를 살펴 보면 해당 프로젝트는 I/O 유틸리티나 DBCP 등의 많은 하위 프로젝트로 구성된 것을 알 수 있다.
  • <version> : 현재 프로젝트의 버전으로 프로젝트 수행 그룹에서 사용하는 버전 관리 체계를 사용하면 된다.
  • <name> : 애플리케이션 명칭
  • <packaging> : 프로젝트 배포를 위한 패키지 방식을 선언하는 것으로 기본은 jar(Java Archive)로 되어 있다. 메이븐에서 지원하는 형식은 pom, jar, maven-plugin, ejb, war, ear, rar를 지원해 준다. 전자정부프레임워크(eGov)나 일반 업무용 프로젝트를 주로 수행하는 그룹이라면 jar와 war 두 개 중 하나를 선택하면 된다.
  • <distributionManagement> : artifact가 배포될 저장소 정보와 설정
  • <parent> : 프로젝트의 계층 정보
  • <dependencyManagement> : 의존성 처리에 대한 기본 설정 영역
  • <dependency> : 프로젝트 연관성과 의존성에 대한 설정으로 메이븐 저장소에 등록된 의존성 라이브러리들 중에 필요한 라이브러리 정보를 입력하면 된다.
  • <dependencies> : 의존성 정의 영역
  • <repositories> : 이것을 쓰지 않으면 공식 메이븐 저장소를 활용하지만, 사용하면 이곳의 저장소를 사용
  • <build> : 빌드에 사용할 플러그인 목록을 나열
  • <reporting> : 리포팅에 사용할 플러그인 목록을 나열
  • <properties> : 메이븐 설정(pom)에 사용되는 속성을 설정한다. properties에 설정된 요소들은 위의 예제에서 < junit.version >으로 설정된 속성 값은 ${junit.version}으로 junit 의존성 설정에 사용된 것을 확인할 수 있다. project.x로 설정된 내용은 메이븐 프로젝트에서 사용되는 속성값으로 위에 사용된 project.build.sourceEncoding이나 project.reporting,outputEncoding은 무자열 인코딩 방식에 대한 설정이며, 다국어 지원을 위한 UTF-8 사용이 가장 무난하다.[5]

비교[편집]

앤트

메이븐 이전에는 동일한 아파치 그룹에서 앤트(Ant) 범용 빌드 스크립트를 2000년에 출시하여 지금까지도 프로젝트 빌드 툴의 대표 자리를 차지하고 있으나, 사람이 사용하는 모든 도구들이 그러하듯 앤트 역시 몇 가지 불편함이 있는데 사용자가 직접 소스코드 위치와 빌드된 파일들의 위치, 작업의 순서를 설정해야 하고 의존성 관리도 직접 해야 하기 때문에 프로젝트의 단위가 커지면서 빌드와 테스트의 소요 시간이 길어지는 문제가 발생하고 앤트 설정과 유지를 위한 비용이 오히려 증가하면서 빌드 설정의 간속화와 의존성 관리 지원을 받을 수 있게 하도록 메이븐이란 프로젝트 빌드 툴이 2004년 아파치 그룹에 의해 발표되었다. 메이븐과 앤트의 가장 큰 차이점이라면 COC(Convention Over Configuration)의 개념을 도입해 설정보다는 관례를 따르기 때문에 소스와 산출물의 위치가 어느정도 정해져 있으며 가장 큰 이점으로 보는 것은 메이븐 레포지토리를 통해 라이브러리 의존성을 알아서 검증해 주고 설치를 해결해 주기 때문에 인터넷만 보장된다면 프로젝트 통합 빌드로부터 해방될 수 있다. 그렇다고 메이븐이 앤트보다 무조건 좋다고만 할 수 없는 것이 복잡한 아키텍처에서의 빌드를 위해서는 설정에 대한 자유도가 보장되는 것이 도움되기 때문에 상황에 따른 도구 선택이 현명하다. 메이븐 역시 성능이나 자유도 부족이란 단점을 내재하고 있어서 앤트와 메이븐의 장점만을 추린 Gradle이란 빌드 시스템이 2007년 발표되기도 하였다. 프로젝트 빌드 비용을 줄이기 위해 빌드 도구들이 개발되었지만, 지속적인 버전업과 새로운 도구들의 출현으로 프로젝트마다 빌드 도구들에 대한 학습 비용이 증가되는 모순된 상황이 발생하고 있기는 하지만 한 번 익숙해지게 되면 다른 도구로의 확장이 그리 어렵지만은 않을 것이다.[5]

각주[편집]

  1. SD아카데미, 〈자바(Java) 프로젝트 관리 도구, Maven(메이븐)과 Ant(앤트)〉, 《네이버 블로그》, 2018-08-06
  2. 2.0 2.1 2.2 2.3 갓대희, 〈(Maven) Maven 이란? (정의, 예제)〉, 《티스토리》
  3. 3.0 3.1 seek, 〈(Java) 빌드 도구 - 아파치 메이븐(Apache Maven) 개념〉, 《네이버 블로그》, 2020-10-31
  4. 4.0 4.1 빨간색소년, 〈maven (메이븐 구조, 차이점, 플러그인, 라이프사이클, 의존성, pom.xml)〉, 《티스토리》, 2018-01-08
  5. 5.0 5.1 green, 〈Maven〉, 《인코덤》, 2018-11-15

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 메이븐 문서는 소프트웨어에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.