목차

개요

메이븐은 프로젝트 객체 모델(Project Object Model)이라는 개념을 바탕으로 프로젝트 의존성 관리, 라이브러리 관리, 프로젝트 생명 주기 관리 기능 등을 제공하는 프로젝트 관리 도구이다. 또한 플러그인을 기반으로 소스 코드로부터 배포 가능한 산출물을 만들어 내는 빌드 기능 뿐만 아니라 레포팅 및 documentation 작성 기능 등을 제공한다.

설명

Maven 특징

Maven 장점 Maven 단점
• 뛰어난 의존성 관리
- 의존성 자동 업데이트
-저장소를 통한 라이브리 일괄 관리

• 모든 프로젝트에 걸쳐 쉽게 적용 가능한 일관적인 사용법

• 라이브러리 및 메타 데이터 저장을 위한 지속적으로 확장 되고 있는 저장소

• 쉽게 작성 가능한 플러그 인을 통한 확장성

• 동시에 다수의 프로젝트 핸들링 할 수 있는 쉬운 설정 기반의 메커니즘

• 간단한 설정을 통한 배포 관리

• Java, C++ 등 다수의 프로그래밍 언어 지원
• Repository 관리의 불편함
- Maven 프로젝트의 급속한 발전으로 central repository가 제공하는 라이브러리들이
빠르게 증가하고 있으나 아직 3rd 파티 라이브러 등 미제공 라이브러리들이 있음

• pom.xml 파일 관리
- 메이븐 프로젝트 관리에 대한 모든 내용이
pom.xml 파일에 담기게 되믄로 길고 장황하게 될 수 있음

• 프로젝트에 특화된 복잡한 빌드 기능 제약
- 메이븐 프로젝트 특성상 소프트웨어 빌드에 통용되는
라이프 사이클을 제공하고 있어 세부 항목 또는 특화된 빌드 환경에 대한 지원이 미약함

Maven 아키텍처

Maven은 프로젝트 전체 내용에 대한 기술 및 설정을 담당하는 POM과 라이브러리(Maven에서는 artifact라 호칭함)관리에 대한
dependency/repository 관리 모델 그리고 컴파일, 테스트, 패키징 등의 빌드 생명 주기를 다루는 lifecycle 및 
관련된 plugin들과의 연동을 다루는 부분으로 구성된다.   
프로젝트 객체 모델: 메이븐 엔진 내장 + POM.XML 파일에서 선언적으로 제공
종속성 관리 모델: 로컬 및 리모트 저장소를 이용
프로젝트 생명 주기 모듈: 메이븐 엔진은 플러그인을 통해 파일을 다루는 거의 모든 작업을 수행

프로젝트 객체 모델 (POM)

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

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 를 선택한다.


2. 웹 프로젝트 생성 화면에서 Project name 입력 필드에 groupId 및 artifactId를 설정한다.


4. 생성한 메이븐 웹 프로젝트의 디렉터리 구조를 확인한다.

M2Eclipse 메이븐 명령

생성한 메이븐 프로젝트에서 오른쪽 마우스 클릭 후 maven 메뉴를 선택하면 m2eclipse에서 제공하는 기본적인 메이븐 명령어들을 수행할 수 있습니다.

예)'Update Dependencies' 명령을 선택하면 pom.xml에서 선언한 의존성 관련 설정들을 update합니다.
* SCM에서 메이븐 프로젝트를 check out 받은 후 Maven → Update Project Configuration 명령을 통해 check out 받은
메이븐 프로젝트의 환경 및 dependencies를 로컬 환경에 맞게 업데이트 시켜줍니다
.

메이븐 기본 lifecycle 명령 실행

메이븐의 기본 빌드 생명 주기 명령어를 Run As 메뉴에서 실행할 수 있으며 'Maven build…' 명령어 선택을 통해 직접 빌드 Goal을 정의할 수 있다.

메이븐 프로젝트 실행

Run AS → clean install 명령으로 메이븐 웹 프로젝트를 패키징한 후 Run On Server 명령으로 웹 프로젝트를 실행한다.

샘플

개발 환경에서는 가이드 프로그램으로 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 기동

참고자료

아파치 메이븐 프로젝트