메이븐은 프로젝트 객체 모델(Project Object Model)이라는 개념을 바탕으로 프로젝트 의존성 관리, 라이브러리 관리, 프로젝트 생명 주기 관리 기능 등을 제공하는 프로젝트 관리 도구이다. 또한 플러그인을 기반으로 소스 코드로부터 배포 가능한 산출물을 만들어 내는 빌드 기능 뿐만 아니라 레포팅 및 documentation 작성 기능 등을 제공한다.
Maven 장점 | Maven 단점 |
---|---|
• 뛰어난 의존성 관리 - 의존성 자동 업데이트 -저장소를 통한 라이브리 일괄 관리 • 모든 프로젝트에 걸쳐 쉽게 적용 가능한 일관적인 사용법 • 라이브러리 및 메타 데이터 저장을 위한 지속적으로 확장 되고 있는 저장소 • 쉽게 작성 가능한 플러그 인을 통한 확장성 • 동시에 다수의 프로젝트 핸들링 할 수 있는 쉬운 설정 기반의 메커니즘 • 간단한 설정을 통한 배포 관리 • Java, C++ 등 다수의 프로그래밍 언어 지원 | • Repository 관리의 불편함 - Maven 프로젝트의 급속한 발전으로 central repository가 제공하는 라이브러리들이 빠르게 증가하고 있으나 아직 3rd 파티 라이브러 등 미제공 라이브러리들이 있음 • pom.xml 파일 관리 - 메이븐 프로젝트 관리에 대한 모든 내용이 pom.xml 파일에 담기게 되믄로 길고 장황하게 될 수 있음 • 프로젝트에 특화된 복잡한 빌드 기능 제약 - 메이븐 프로젝트 특성상 소프트웨어 빌드에 통용되는 라이프 사이클을 제공하고 있어 세부 항목 또는 특화된 빌드 환경에 대한 지원이 미약함 |
Maven은 프로젝트 전체 내용에 대한 기술 및 설정을 담당하는 POM과 라이브러리(Maven에서는 artifact라 호칭함)관리에 대한 dependency/repository 관리 모델 그리고 컴파일, 테스트, 패키징 등의 빌드 생명 주기를 다루는 lifecycle 및 관련된 plugin들과의 연동을 다루는 부분으로 구성된다.
프로젝트 객체 모델: | 메이븐 엔진 내장 + POM.XML 파일에서 선언적으로 제공 |
종속성 관리 모델: | 로컬 및 리모트 저장소를 이용 |
프로젝트 생명 주기 모듈: | 메이븐 엔진은 플러그인을 통해 파일을 다루는 거의 모든 작업을 수행 |
POM은 프로젝트의 구조와 내용을 설명하고 있으며 pom.xml 파일에 프로젝트 관리 및 빌드에 필요한 환경 설정, 의존성 관리 등의 정보들을 기술한다.
프로젝트의 세부 메타 데이터 정보를 포함한다. - 버전 및 설정 관리, 빌드 환경, 라이브러리 저장소 및 의존성 등
pom.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.0http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>egovframework.dev.com</groupId> <artifactId>egovframework-dev-com</artifactId> <version>1.0</version> <packaging>war</packaging> <name>egovframework-dev-com Maven Webapp</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.4</version> <scope>test</scope> </dependency> </dependencies> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </project>
Repository는 artifact들의 저장소로 로컬 및 리모트 repository로 구성되며 프로젝트는 pom.xml에서 선언한 dependency들을 저장소로부터 불러와서 사용한다.
1. Maven 설치 시 로컬에 Maven artifact들을 저장하고 관리하는 repository가 자동으로 구성된다. - 기본 설정은 C:\Documents and Settings\Administrator\.m2\repository 디렉토리에 구성된다. 2. Maven 리모트 repository - Maven에서 제공하는 central respositoty와 각 기업 또는 organization에서 제공하고 있는 리모트 repository들이 있으며 개발자는 환경 설정을 통해 하나 이상의 외부 repository에서 필요로 하는 artifact들을 다운로드 받아 사용할 수 있다. 3. repository 호출 프로세스 - 일반적인 개발 시에 주로 사용되는 라이브러리 관리 메커니즘은 필요로 하는 라이브러리를 프로젝트 내부 디렉터리에 담고 path 설정을 통해 사용하고 있으나 Maven에서는 의존성 설정 메커니즘(라이브러리를 설정 파일에 선언하여 사용함) 통해 사용하고 관리한다. 3.1 프로젝트의 pom.xml에서 라이브러리 선언 3.2 개발자 로컬 리포지토리에서 선언한 라이브러리 검색 - 존재 시 프로젝트에 라이브러리 cache - 존재하지 않을 경우 리모트 리포지토리에 요청 3.3 리모트 리포지토리에서 선언한 라이브러리 검색 - 로컬 리포지토리는 리모트 리포지토리에서 검색된 artifact를 내려 받아 저장한다.
메이븐은 Best practices을 기반으로 정규화된 디렉터리 구조를 제공하고 있으며 모든 소스 파일들은 /src 디렉터리 밑에 빌드 된 output은 /target 디렉터리 밑에 위치한다.
Maven 프로젝트는 개발자에 의한 특정한 source/resource path 설정 없이 정규화된 디렉토리 구조를 기반으로 한 프로젝트 자원에 대한 접근 메커니즘을 제공한다. Maven은 소스 또는 리소스에 대한 path 설정이 필요하지 않다.
메이븐 빌드는 소프트웨어 프로젝트의 핵심적인 빌드 라이프 사이클 개념을 따르고 있으며 빌드 초기화 단계부터
artifact의 배포까지의 생명 주기를 정의하고 있다.
Maven 생명 주기 단계는 각각의 플러그인과 바인딩 되어 실제로 바인딩 된 플러그인이 명령을 실행 하며 단계 순서에 따라 순차적으로 빌드가 실행되어 개발자가 실행한 명령을 수행한다. 예) mvn install 명령을 실행하면 generate-sources 단계부터 compile, test 명령 등을 거쳐 install 명령을 실행한다.
예) 자바 컴파일: $mvn complile 명령을 실행한다.
메이븐2 기본 생명주기 단계
생명주기 단계 | 설명 |
---|---|
validate | 현재 설정과 POM의 내용이 유효한지 확인한다. 이 과정은 POM.XML 파일 트리 구조를 검증한다. |
initialize | 빌드 사이클에서 수행할 주요 작업 이전에 초기화를 할 수 있는 순간 |
generate-sources | 코드 생성기가 이 다음의 단계들에서 컴파일 되고 처리할 소스 코드를 생성하기 시작하는 순간 |
process-sources | 소스의 파싱, 수정, 변경을 제공한다. 일반 코드 또는 생성된 코드 모두 여기서 처리한다. |
generate-resources | 소스 코드가 아닌 리소스를 생성하는 단계. 보통 메타데이터 파일과 설정 파일을 포함한다. |
process-resources | 이전 과정의 소스 코드가 아닌 리소스 파일들을 다룬다. 이 단계에서 리소스 파일들이 수정, 변경 재배치 된다. |
compile | 소스 코드를 컴파일한다. 컴파일된 클래스들은 카깃 디렉터리 트리 구조에에 저장된다. |
process-classes | 클래스 파일 변환과 개선 단계를 다룬다. 바이트 코드 위버(weaver)와 instrument 도구가 동작하는 단계다. |
generate-test-sources | 단위 테스트 코드를 생성하는 모조가 동작하는 순간 |
process-test-sources | 컴파일하기 전에 테스트 소스 코드에 필요한 작업을 수행한다. 이 단계에서 소스 코드는 수정, 변환 또는 복사될 수 있다. |
generate-test-resources | 테스트 관련 리소스 생성을 허용한다. |
process-test-resources | 테스트 관련 리소소의 처리, 변환, 재배치가 가능하다. |
test-compile | 단위 테스트 소스 코드를 컴파일한다. |
test | 컴파일된 단위 테스트를 싱행하고 그 결과를 표시한다. |
package | 실행 가능한 바이너리 파일들을 JAR나 WAR 같은 배포용 압축 파일로 묶는다. |
pre-integration-test | 통합 테스트를 준비한다. 이 경우 통합 테스트는 실제 배치 환경의 코드를 테스트 하는 것을 말한다. 이 단계에서 위에서 묶은 압축 파일을 서버에 배치할 수 있다. |
integration-test | 실제 통합 테스트를 수행한다. |
post-integration-test | 통합 테스트 준비 상태를 해제한다. 이것은 테스트 환경의 리셋 또는 재초기화 과정을 포함할 수 있다. |
verify | 배치 가능한 압축 파일의 무결성과 유효성을 검증한다. 이 과정 이후에 압축 파일들이 설치 된다. |
install | 압축 파일을 로컬 메이븐 디렉터리에 추가한다. 이로 인해 이것에 의존하는 다른 모듈들을 사용할 수 있게 된다. |
deploy | 압축 파일을 원격 메이븐 디렉터리에 추가한다. 더 많은 사용자들이 이 artifact를 사용할 수 있게 된다. |
메이븐은 대부분의 빌드 작업 시에 플러그인을 활용하며 메이븐 엔진이 생명주기 단계들과 플러그인을 바인딩 시켜 빌드 작업을 컨트롤 한다.
Maven 플러그인 메트릭스에서 활용 가능한 플러그인들을 확인 할 수 있다.
메이븐은 POM에서 선언적인 dependency 설정으로 빌드 및 배포 시에 필요한 라이브러리들을 관리하고
로컬 및 원격 저장소에서 선언된 라이브러리들을 다운로드 받아 사용한다.
메이븐의 가장 큰 장점 중의 하나로 라이브러리 의존성 관리를 들 수 있다. 일반적인 프로젝트 수행 시 개발자들은 라이브러리 설정을 위해 프로젝트 내부 디렉터리에 직접 라이브러리를 받아와 위치 시키고 path 설정을 통해 이를 이용한다. 이럴 경우 개발자들이 직접 라이브러리를 찾고 설정하는 번거로움과 프로젝트 내부에서 사용하는 라이브러리 종류와 버전을 컨트롤 하는데 문제가 발생할 수 있다. 특히 통합 빌드 과정에서 라이브러리 관련 문제들이 빈번히 발생할 수 있다. 메이븐은 이를 효과적으로 처리하기 위해 의존성 관리 메커니즘을 제공하고 있으며 메이븐 개발자들은 프로젝트의 pom.xml에 dependency 선언만으로 필요한 라이브러리들을 받아와 편하게 사용할 수 있다. 프로젝트 관리자의 경우 사용되고 있는 라이브러리와 버전을 효과적으로 컨트롤할 수 있으며 개발자들에게 검증되고 통일된 버전의 라이브러리를 제공할 수 있다.
예) 아래와 같이 선언하여 junit 테스트를 위한 라이브러리를 사용할 수 있다.
<project> ...... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.4</version> <scope>test</scope> </dependency> </dependencies> </project
전자정부 개발 프레임워크의 개발환경 IDE에 메이븐 통합 플러그인인 m2eclipse가 설치되어 있다.
구현 도구의 IDE 참조: IDE
1. Maven 설정 파일 세팅
전자정부 표준 프레임워크 개발 환경에서 제공하는 Maven 설정 파일인 **settings.xml** 파일을 지정된 위치에 옮겨 놓는다. - 디렉터리 위치: C:\Documents and Settings\Administrator\.m2
2. 이클립스 Preferences의 Maven 항목에서 settings.xml 파일의 위치를 설정한다.
3. 전자정부 표준 프레임워크 Archetype 설정 파일 세팅
전자정부 표준 프레임워크 개발 환경에서 제공하는 Maven Archetype 설정 파일인 **archetype-catalog.xml** 파일을 지정된 위치에 옮겨 놓는다. - 디렉터리 위치: C:\Documents and Settings\Administrator\.m2
4. 이클립스 Preferences의 Maven 항목을 클릭 후 Archetype 메뉴에서 전자정부 표준프레임워크 Archetype을 추가한다.
전자정부 표준 프레임워크의 archetype-catalog.xml파일의 위치를 추가한다.
전자정부 표준 프레임워크 개발환경에서는 Maven 프로젝트를 생성하기 위한 2가지 방법을 제공하고 있으며 eGovFramework perspective에서 제공하는 프로젝트 생성 방법은 개발 환경 IDE 메뉴얼에서 확인할 수 있다. 여기서는 Maven Archetype을 하용한 Maven 프로젝트 생성 방법을 가이드 한다.1. 웹 어플리케이션을 만들기 위해 메뉴에서 New → Maven Project 를 선택한다.
생성한 메이븐 프로젝트에서 오른쪽 마우스 클릭 후 maven 메뉴를 선택하면 m2eclipse에서 제공하는 기본적인 메이븐 명령어들을 수행할 수 있습니다.
예)'Update Dependencies' 명령을 선택하면 pom.xml에서 선언한 의존성 관련 설정들을 update합니다.
* SCM에서 메이븐 프로젝트를 check out 받은 후 Maven → Update Project Configuration 명령을 통해 check out 받은
메이븐 프로젝트의 환경 및 dependencies를 로컬 환경에 맞게 업데이트 시켜줍니다.
개발 환경에서는 가이드 프로그램으로 egovframework.guideprogram.basicsmaple 프로젝트를 제공하고 있다.
1. 샘플 DB 기동
임베디드 DB인 HSQL DB를 제공하고 있으며 runHsqlDB.bat 파일을 실행
DB 기동
2. 가이드 프로그램 basic sample
2.1 basic sample 기본 디렉터리 구조 이클립스에서 import project로 basic sample 프로젝트를 가져온 후 m2 maven -> update project configuration 실행한다. Run As -> clean / Run As -> install 명령을 실행시켜 basic sample 프로젝트 빌드 작업 및 패키징 작업을 수행한다.
2.2 basic smaple 기동