Apache POI 라이브러리를 사용하여 주간 문제를 풀이하였었다. 풀이 시 프로젝트를 Maven을 통해서 생성하였는데 당시 구글링을 통해 넘어갔던 개념에 대해서 다시 한 번 짚고 넘어가기 위해 본 글을 작성한다.
Maven에 대해 알아보기 전에 빌드 개념에 대해서 먼저 알아보자.
빌드란?
프로젝트를 위해 작성한 코드나 여러 자원들(.xml, .jar, .properties)를 JVM이나 톰캣 같은 WAS가 인식할 수 있는 구주로 패키징하는 과정 및 결과물
Maven
- Apache 사에서 만든 빌드 툴
- pom.xml 파일을 통해 정형화된 빌드 시스템으로 프로젝트를 관리
- 프로젝트의 전체적인 라이프 사이클 관리
특징
- 간단한 프로젝트 설정
- 자동 업데이트, 종속성 폐쇄를 포함한 뛰어난 종속성 관리
- 종속성 관리
- Maven은 JAR 및 기타 종속성의 중앙 저장소 사용을 권장
- Maven 사용자는 프로젝트 전체에서 JAR을 재사용할 수 있으며 프로젝트 간 통신을 장려하여 이전 버전과의 호환성 문제를 처리
- 종속성 관리
- 정형화된 빌드 시스템 제공
- pom과 플러그인 세트를 사용하여 프로젝트 빌드
구조

ant와의 차이점
- Ant가 비교적 자유도가 높다. 전처리, 컴파일, 패키징, 테스팅, 배포 가능
- Maven은 정해진 라이프사이클에 의하여 작업 수행
- 전반적인 프로젝트 관리 기능까지 포함
gradle과의 차이점
- XML 대신 groovy 스크립트를 사용하여 동적인 빌드 가능
- maven은 멀티프로젝트에서 상속구조인데, gradle은 주입 방식
- 멀티프로젝트에서 gradle이 더 적합
plug in
- 메이븐은 플러그인을 구동해주는 프레임워크
- 플러그인은 다른 산출물과 같이 저장소에서 관리
- 메이븐은 여러 플러그인으로 구성되어 있음
- 각각의 플러그인은 하나 이상의 goal(명령)을 포함
- goal : Maven의 실행 단위
- plug in과 goal의 조합으로 실행
-
ex. mvn <plugin>:<goal> = mvn archetype:generate
-
- 메이븐은 여러 goal을 묶어서LifeCycle Phase로 만들어서 실행
플러그인 골
Maven에서 플러그인을 실행할 때에는 '플러그인이름:플러그인지원골'의 형식으로 실행할 기능을 선택한다. 예를 들어 compiler:compile은 'compiler'는 플러그인에서 'compile' 기능(goal)을 실행한다는 것을 뜻한다.
플러그인 목록
구분 | Plugin명 | 설명 |
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 |
기타 다양한 도구 |
Life Cycle
미리 정해진 빌드 순서로 메이븐은 clean , build, site의 라이프 사이클을 제공
- Phase(단계)
- 빌드 라이프사이클의 각 단계를 Phase라고 한다.
- Phase는 의존관계를 가지고 있기 때문에 해당 Phase가 실행되기 위해서는 이전 단계의 Phase가 모두 수행이 되어야한다.
- Goal
- 하나의 플러그인에서는 여러 작업을 수행할 수 있도록 지원한다.
- 플러그인에서 실행할 수 있는 각각의 기능을 Goal 이라고 한다.
- 특정 작업을 말하며, 최소한의 실행 단위이다.
라이프 사이클
- clean : 빌드 시 생성되어있었던 파일들을 삭제한다.
- validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
- compile : 프로젝트 소스코드를 컴파일 하는 단계
- test : 단위 테스트를 수행하는 단계. 테스트 실패 시 빌드 실패로 처리하며, 스킵이 가능하다.
- package : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 파일의 배포를 위한 패키지로 만든다.
- verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인한다.
- site : 프로젝트 문서와 사이트 작성, 생성하는 단계
- deploy : 만들어진 package를 원격 저장소에 release하는 단계
더보기
[표] 디폴트 라이프사이클의 주요 단계(phase)
단계 | 설명 | 단계에 묶인 플러그인 실행 |
generate-sources | 컴파일 과정에 포함될 소스를 생성한다. 예를 들어 DB 테이블과 매핑되는 자바 코드를 생성해주는 작업이 이 단계에서 실행된다. | |
process-sources | 필터와 같은 작업을 소스 코드에 처리한다. | |
generate-resources | 패키지에 포함될 자원을 생성한다. | |
process-resources | 필터와 같은 작업을 자원 파일에 처리하고, 자원 파일을 클래스 출력 디렉토리에 복사한다. | resources:resources |
compile | 소스 코드를 컴파일해서 클래스 출력 폴더에 클래스를 생성한다. | compiler:compile |
generate-test-sources | 테스트 소스 코드를 생성한다. 예를 들어 특정 클래스에서 자동으로 테스트 케이스를 만드는 작업이 이 단계에서 실행된다. | |
process-test-sources | 필터와 같은 작업을 테스트 소스 코드에 처리한다. | resources:testResources |
generate-test-resources | 테스트를 위한 자원 파일을 생성한다. | |
process-test-resources | 필터와 같은 작업을 테스트 자원 파일에 처리하고, 테스트 자원 파일을 테스트 클래스 출력 폴더에 복사한다. | |
test-compile | 테스트 소스 코드를 컴파일해서 테스트 클래스 추력 폴더에 클래스를 생성한다. | compiler:testCompile |
test | 테스트를 실행한다. | surefire:test |
package | 컴파일 된 코드와 자원 파일들을 jar, war와 같은 배포 형식으로 패키징한다. | 패키징에 따라 다름 jar - jar:jar war - war:war pom - site:attach-descriptor ejb - ejb:ejb |
install | 로컬 리포지토리에 패키지를 복사한다. | install:install |
deploy | 생성된 패키지 파일을 원격 리포지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 한다. | deploy:deploy |
라이프사이클의 특정 단계를 실행하려면 다음과 같이 mvn [단계이름] 명령어를 실행
mvn test
mvn deploy
플러그인 직접 실행
mvn surefire:test
Maven은 표준화된 라이프사이클을 제공하고 있기 때문에 개발자가 컴파일-테스트-패키징 등의 과정을 손으로 정의하지 않아도 되며, 개발자는 Maven이 제공하는 단계 중 필요한 단계만 실행하면 된다.
즉, 나머지 작업(컴파일, 테스트 실행, jar 파일 생성)은 모두 Maven이 처리
'인실리코젠' 카테고리의 다른 글
[인실리코젠] Spring Boot + MVC 이론 정리 (0) | 2024.01.17 |
---|---|
[인실리코젠] WebCrawling - 1 (0) | 2024.01.16 |
[인실리코젠] Apache POI 라이브러리를 이용한 Exel 데이터 읽기 2 (0) | 2024.01.12 |
[인실리코젠] Programmers Lv2.JadenCase 문자열 만들기 리뷰 답변 및 BPM(Business Process Management) 프로세스 모델링 (1) | 2024.01.11 |
[인실리코젠] Apache POI 라이브러리를 이용한 Exel 데이터 읽기 (2) | 2024.01.11 |