메이븐 아키타입

  • 사용자가 생성한 별도의 아키타입을 이용하여 pom.xml 및 프로젝트 샘플을 제공할 수 있음
  • 아키타입 생성 절차
    1. 프로젝트 디렉토리 구조 및 pom.xml 파일 생성
    2. archetype 플러그인의 create-from-project 골 실행
    3. 메이븐 공통 저장소(Nexus)에 생성한 archetype 배포
    4. 추후 프로젝트 생성 시, 생성한 archetype 사용하여 프로젝트 생성


출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)

앤트런 플러그인 (maven-antrun-plugin)

  • 메이븐에서 앤트 명령어를 사용할 수 있게 해주는 플러그인


넥서스 - 메이븐 내부 저장소 (Nexus)

  • 내부 메이븐 저장소의 이점
    • 라이브러리 버전 충돌 최소화
    • 3자 라이브러리 사용 시 내부 저장소에 저장 가능
    • 의존 관계 라이브러리를 하나의 저장소로 관리 가능
    • 중앙저장소의 프록시 역할을 수행하므로, 초기 빌드 시간 단축
  • 넥서스 저장소 종류
    • 프록시 (proxy)
      • 메이븐 공개 저장소의 프록시 역할을 수행하는 저장소
    • 호스티드 (hosted)
      • 3자 라이브러리 관리 용도
    • 버추얼 (virtual)
      • 등록된 저장소에 대해 다른 URL로 접근 가능하게 하기 위한 가상의 저장소
    • 저장소 그룹 (group)
      • 설정한 저장소의 그룹
  • 넥서스 저장소 설정 방법
    • settings.xml의 <mirror> 엘리먼트에 nexus의 id, url 등 등록
    • <repository>, <pluginRepository> 엘리먼트를 설정
    • <activeProfile>엘리먼트에 nexus를 설정

FileSync 이클립스 플러그인
  • 로컬 개발 환경에서 웹 공통 자원 등을 관리하기 위해 사용하는 이클립스 플러그인


출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)



메이븐

저자
박재성 지음
출판사
한빛미디어 | 2011-03-21 출간
카테고리
컴퓨터/IT
책소개
실제 프로젝트로 학습하는 생생한 메이븐 활용 전략!『메이븐』은 ...
가격비교


정확히 4월 5일 구입해서 4월 7일 현재 70%가량 읽은 책... 

처음엔 단순히 현재 하고 있는 작업에 도움이 될까 싶어서 구입하긴 했는데 

읽으면서 "아... 아직까진 내가 전산에 열정이 있긴 하나보다..." 싶은 생각을 가지게 만든... 

솔직히 스스로도 책 읽는 속도에 대해 놀란 감이 있다... ㅋㅋ


메이븐과 관련된 내용을 프로젝트를 실제로 진행하는 과정을 예로 들며 쉽게 풀어놓았으며

메이븐에 대한 지식이 전무한 사람도 쉽게 볼 수 있도록 설명이 되어 있는 점이 마음에 든다. 


모든 컴퓨터 관련 서적이 그렇듯이

이 책만 가지고 모든 것이 해결되진 않겠지만... 


적어도 내가 현재 진행하고 있는 프로젝트의 배포가 그리 쉬운 편은 아니라고 생각하는데 

이 책에 설명된 내용만으로도 궁금했던 부분을 해결할 수 있었다. 


'리뷰 > Books' 카테고리의 다른 글

자바 세상의 빌드를 이끄는 메이븐  (0) 2013.04.07
블링크  (0) 2010.09.11
스위치  (0) 2010.09.04

상속 (inheritance)

  • 메이븐에서 모든 POM 파일은 최상위 POM을 상속받음
  • 메이븐 상속 기능을 사용하기 위해서는 부모 POM 파일의 <packaging> 엘리먼트의 값을 pom으로 설정

집합 (aggregation)
  • 일반적으로 프로젝트가 커지면 여러 개의 프로젝트로 분리하나, 각 프로젝트 사이의 공통 모듈이 존재하므로, 메이븐을 사용 시 이러한 방식보다는 프로젝트를 여러 개의 모듈로 분리하는 것이 좋음
  • 하나의 프로젝트에 있는 여러 개의 모듈을 빌드할 때, 같은 단위로 빌드할 수 있도록 지원하는 기능
  • <modules> 엘리먼트로 설정


의존 관계 (dependency)

  • 모듈 사이 의존관계가 발생시 설정
  • 라이브러리 등록과 동일한 방식으로 설정 (<dependencies>)

dependency 플러그인의 copy-dependencies 골
  • 특정 디렉토리에 배포된 파일을 복사할 수 있음
  • 일반 자바 프로그램을 jar 파일로 생성한 후, lib 디렉토리 등에 배포하는데 유용함

jar 배포시 진입 클래스 설정하는 법
  • <configuration> / <archeve> / <manifest> / <mainClass> 에 실행할 클래스 명 설정



출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)

언더커버 (undercover-maven-plugin)

  • 단위 테스트 테스트 소스 커버리지 리포트 툴

파인드 버그 (findbugs-maven-plugin)
  • 정적 소스 코드 분석 툴
  • 버그 발생 가능성이 있는 코드, 나쁜 개발 습관으로 작성한 코드, 성능에 영향을 미칠 것으로 생각하는 코드에 대한 정보를 제공

PMD 리포트 (maven-pmd-plugin)
  • 정적 소스 코드 분석 툴
  • 애플리케이션별로 제공하는 룰셋이 있어, 이를 설정할 수 있음

CPD 리포트 
  • 소스 내에 존재하는 중복 코드를 찾아주는 툴
  • PMD 툴에 포함되어 있음 (pmd:cpd 골을 실행)

제이디펜드 리포트 (jdepend-maven-plugin)
  • 소스코드의 복잡도를 분석하는 툴
  • 주요 용어
    • 클래스와 인터페이스 수
      • TC : 패키지가 포함하는 클래스/인터페이스 수
      • CC : 구현 클래스 수
      • AC : 인터페이스/추상 클래스 수
    • Afferent Couplings (Ca)
      • 다른 패키지에서 현재 패키지에 의존하고 있는 패키지 수
    • Efferent Couplings (Ce)
      • 현재 패키지에서 다른 패키지에 의존하고 있는 패키지 수
    • Abstractness (A)
      • 총 클래스수(TC) / 추상 클래스(AC)
    • Instability (I)
      • I = Ce / (Ce + Ca)
      • 외부 패키지와의 의존 비율. 즉 이 패키지가 외부 패키지의 변경에 대해 영향을 받을 가능성
    • Distance from the Main Sequence (D)
      • 추상화와 안정성에 대한 패키지의 균형을 위한 이상적인 값은 A+I = 100%로 정의
      • A+I가 100%에서 얼마나 떨어져 있는지 표시하는 수치로, 즉, D가 100%에 가까울 수록 좋지 않는 패키지 의존관계이므로 리팩토링해야 함을 의미
  • 순환 의존 관계
    • A 패키지와 B 패키지가 Ca와 Ce 의존관계일 경우 발생 (즉, A와 B가 상호 참조 관계일 때를 의미)
    • 모든 패키지는 한방향으로만 의존관계를 가지는 것이 좋음


출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)

빌드 이식성

  • 특별한 수정이나 변경없이 다양한 환경에 배포/운영이 가능함
  • 이식성을 확보해야 하는 예
    • 데이터베이스 설정
    • 로깅 설정
    • 프레임워크와 관련한 설정
    • 서버 설정
    • 컴파일러 설정

프로파일 
  • 서로 다른 환경에서의 설정을 관리할 수 있도록 메이븐에서 제공하는 기능
  • <profile> 엘리먼트 하위의 <id> 엘리먼트를 통해 프로파일 id를 정할 수 있으며, <properties> 엘리먼트 내에 property 형태로 각 프로파일마다 사용하는 설정값을 지정할 수 있음

배포 (Tomcat 플러그인, Cargo 메이븐 플러그인)
  • Tomcat 플러그인을 이용하여 개발 서버에 직접 war 파일을 배포할 수 있음
    • tomcat-maven-plugin 을 메이븐 플러그인으로 설정
    • 톰캣 서버의 manager를 추가 (tomcat-users.xml 파일 편집)
    • tomcat 플러그인의 deploy 골을 실행
  • Cargo 메이븐 플러그인은 자바 진영에서 사용할 수 있는 대부분의 컨테이너 지원



출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)

단위 테스트

  • 익히 알려진 대로, 단위 테스트는 개별 소스 단위의 모듈/메소드 등이 원하는 대로 동작하는지 검증하는 테스트를 의미
  • 따라서, 아래와 같이 외부 시스템이 포함되는 테스트의 경우, 원칙적으로는 단위 테스트로 보지 않음 (Working Effectively with Legacy Code, Michael C. Feathers)
    • 데이터베이스에 하는 테스트
    • 네트워크와 통신하는 테스트
    • 파일 시스템에 하는 테스트
    • 테스트를 실행할 때 추가적인 작업이 필요한 테스트 (설정 파일 수정 등)
  • 단, 웹 개발 프로젝트 등에서 데이터베이스를 배제한 단위 테스트는 현실적으로 어려움

메이븐 SQL 플러그인 (sql-maven-plugin)
  • execute Goal을 통해 파일에서 관리하는 모든 SQL 문을 실행할 수 있도록 지원
    • 따라서, sql-maven-plugin을 plugin으로 등록하고, 설정을 통해 테이블 스키마를 생성하는 sql 파일을 매 빌드시 실행하게 하면, 모든 개발자간의 db를 일관되게 유지할 수 있음
    • 주요 설정 값
      • <execution>: 플러그인에 수행할 각 sql 구문들을 설정
      • <execution> / <phase> : 구문을 어떤 메이븐 phase에서 수행할 지 설정
      • <execution> / <goals> / <goal> : execute (SQL 수행)
      • <execution> / <configuration> / <url> : DB 접근자
      • <execution> / <configuration> / <autocommit> : commit 여부
      • <execution> / <configuration> / <srcFiles> / <srcFile> : 수행할 SQL 구문 (file)
      • <execution> / <configuration> / <sqlCommand> : 수행할 SQL 구문 (inline)
  • 해당하는 DB에 대한 JDBC 드라이버를 <plugin>에 포함시켜야 함

Carbon Five Database Migration 플러그인
  • 데이터베이스를 초기화하지 않고, 점진적으로 스키마를 변경해 나가면서 개발하는 것이 가능한 메이븐 데이터베이스 관련 플러그인
  • http://mvn.carbonfive.com/public 원격 저장소를 추가해야 함
  • /src/main/db/migrations 디렉토리에 날짜가 접두어로 붙는 .sql 파일을 생성
  • Goal
    • new : SQL 구문을 입력할 수 있는 파일을 생성해준다.
      • new 를 통해 생성한 파일에 SQL 구문의 변경사항을 입력
    • migrate

      • db-migration 툴은 매 빌드시마다 현재 실행되지 않은 DB 구문만 실행시켜줌으로써 table을 모두 drop한 후 create 하는 것이 아니라, 일부 변경사항만 적용하는 것이 가능 


출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)

메이븐 플러그인 소개 페이지


메이븐 플러그인 설정
  • POM의 <plugins> 엘리먼트에 플러그인의 <groupId>, <artifactId>, <version> 등을 명시
  • <plugin> 엘리먼트 하위의 <configuration> 엘리먼트를 사용하면 플러그인의 기본 설정을 변경 가능
    • 예) 소스 컴파일러 버전을 JDK 6으로 지정: <configuration><source>1.6</source></configuration>

메이븐으로 생성한 프로젝트를 이클립스 프로젝트로 변경
  1. mvn eclipse:eclipse
  2. pom.xml 파일에 <classpathentry> 설정
    • <classpathentry> 엘리먼트는 이클립스 프로젝트의 .classpath 파일(프로젝트의 자원 정보를 기술하는 설정 파일)을 생성하기 위해 이 엔트리를 참조    
      • 예1) <classpathentry kind="var" path="M2_REPO/junit/junit/4.7/junit-4.7.jar" />
      • 예2) <classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java" />
  3. eclipse에서 프로젝트 import
  4. eclipse에서 M2_REPO 환경 변수를 메이븐 로컬 저장소로 설정 (Window > Preferences > Java > Build Path > Classpath Variables)

m2eclipse 플러그인
  • Maven 이클립스 플러그인 (http://m2eclipse.sonatype.org/sties/m2e)
  • Maven 프로젝트 생성 
    1. 이클립스에서 New Project > Maven > Maven Project 선택
    2. Archtype 선택하지 않으려면 체크한 후 Next
    3. Group Id, Artifact Id, Version, Packaging, name 등 정보를 입력한 후, Finish
  • Maven 로컬 Repository 변경
    1. USER_HOME/.m2/settings.xml 파일의 <localRepository> 엘리먼트 변경
    2. 이클립스에서 Window > Preferences > Maven > User Setting에서 Update Settings 버튼을 눌러 설정 값이 반영되도록 함
  • Eclipse에서 Maven 사용
    • Run As > Maven 에서 정의된 goal을 수행할 수 있음
    • pom.xml 파일을 편집 가능




출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)

메이븐 저장소

  • 중앙 저장소
    • 오픈 소스 라이브러리, 메이븐 플러그인, 메이븐 아키타입 관리
    • http://repo1.maven.org/maven2/
    • 개발자 임의로 라이브러리 배포 불가
  • 원격 저장소
    • 사내 원격 저장소 또는 별도의 3자 업체에서 제공하는 저장소
  • 로컬 저장소
    • 개발자 PC의 저장소

메이븐 저장소 설정
  • <repository> 엘리먼트 설정을 통해 추가 저장소를 설정 가능

메이븐 의존 라이브러리 관리
  • <dependency> 엘리먼트 설정을 통해 라이브러리 설정
  • <version> 엘리먼트의 의존성 관리
    • 예1) [3.8, 4.8): 3.8 버전을 포함하고, 4.8보다 작은 버전을 사용
    • 예2) LATEST/RELEASE - 가장 최신 버전 사용
    • 개발중인 라이브러리에 SNAPSHOT 접미어 사용 시, 매 빌드 시 최신 버전의 라이브러리 다운로드
  • <scope> 엘리먼트의 속성
    • compile : 해당 라이브러리는 컴파일 단계 이상에서 포함
    • provided : 해당 라이브러리는 배포 단계 및 그 이후 단계에서 제외 (예: servlet.jar)
    • runtime : 애플리케이션 실행 시에만 사용
    • test : 테스트 시점에만 사용
    • system : provided와 비슷하나, 사용자가 직접 제공하는 jar 파일
    • import : 다른 POM 설정 파일에 정의되어 있는 의존관계 설정을 현재 프로젝트로 가져옴

메이븐 의존성 전이
  • 프로젝트에 포함되는 라이브러리가 포함하는 라이브러리를 자동으로 포함시켜줌
    • 즉, 라이브러리의 POM 에 설정된 의존성을 프로젝트에서 로드
  • 의존성 전이를 피하고 싶을 땐 다음과 같은 방법이 가능
    • <exclusion>엘리먼트를 통해 특정 라이브러리를 명시적으로 제외
    • <optional> 엘리먼트를 통해 선택적으로 포함되는 라이브러리를 제외시킬 수 있음
    • <scope>를 통해, 특정 단계에만 포함할 라이브러리를 설정


속성

  • <properties> 엘리먼트 하위의 <property.name>에 정의
  • ${property.name}의 형태로 사용
  • POM/project 속성
    • pom.xml 파일의 엘리먼트에 설정한 정보. pom 또는 project 접두어를 가짐
    • ${project.build.directory}, ${pom.build.directory} : target 디렉토리
    • ${project.build.outputDirectory} : target/classes 디렉토리
    • ${project.name}, ${pom.name} : 프로젝트 이름
    • ${project.version}, ${pom.version}, ${version} : 프로젝트 버전
    • ${project.build.finalName} : package 페이즈를 실행해 압축한 최종 파일 이름
  • setting 속성
    • settings.xml 파일에 설정한 정보. settings 접두어를 가짐
    • ${settings.localRepository} : 로컬 저장소 경로
  • 환경 변수 속성
    • 시스템 환경 변수. env 접두어를 사용
    • ${env.PATH} : 시스템의 PATH 설정
    • ${env.JAVA_HOME} : 시스템의 JAVA_HOME 설정 값
  • 자바 시스템 속성
    • 자바 시스템 속성으로 설정된 모든 속성값을 참조 가능
  • {$basedir}: pom.xml 설정 파일이 위치하는 디렉토리


출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)



Maven 라이프사이클

  • 메이븐은 프로젝트의 각 단계별 빌드 과정을 라이프사이클로 미리 정의하고 있음
  • 기본 라이프 사이클: 소스 컴파일, 테스트, 압축, 배포 등을 담당
    • compile: 소스 코드 컴파일
    • test: 단위테스트 실행
    • package: jar, war 등으로 압축
    • install: 로컬 저장소에 압축한 파일 배포
    • deploy: 원격 저장소(메이븐 저장소)에 압축한 파일 배포
  • clean 라이프 사이클: 모든 산출물 삭제 (target 디렉토리 삭제)
    • clean
  • site 라이프사이클: 프로젝트에 대한 문서 사이트 생성
    • site: 문서 사이트 생성
    • site-deploy: 문서 사이트를 설정된 서버에 배포

Maven 페이즈와 플러그인
  • 메이븐 페이즈는 메이븐 플러그인을 통해 실행됨
  • 메이븐 플러그인 설정
    • pom.xml의 <build><plugins><plugin>에 사용하고자 하는 플러그인 설정
  • Goal
    • 플러그인에서 실행할 수 있는 각각의 작업
    • 예) Compile 플러그인의 Goal
      • compile: 소스 코드 컴파일
      • testCompile: 테스트 코드 컴파일
      • help: 플러그인 도움말 제공

Maven 기본 페이즈
  • 자원 복사 및 소스 컴파일
    • process-resource: 모든 자원을 target 디렉토리로 복사
    • compile: 자바 소스 코드를 컴파일
      • compiler 플러그인에 자바 소스 버전, 타겟 버전, 소스 인코딩 등을 정의할 수 있음
  • 테스트 자원 복사 및 테스트 소스 컴파일
    • process-test-resources: 테스트 자원 복사
    • test-compile: 테스트 소스 코드 컴파일
  • 테스트
    • test: 단위 테스트 실행, 테스트 실행결과 리포트 생성(/target/surefire-reports)
  • 패키징
    • package: jar, war 파일 등이 target 디렉토리에 생성
  • 배포
    • install: 압축한 파일을 로컬에 배포
    • deploy: 원격 저장소에 압축한 파일을 등록
  • 결과물 제거
    • clean: target 디렉토리의 결과물을 모두 제거


출처: 자바 세상의 빌드를 이끄는 메이븐 (박재성 저)



+ Recent posts