| Maven이란?
https://hijjang2.tistory.com/329
JSTL에 대해서 배울 때 JSTL과 관련된 라이브러리를 다운로드 하여(위 링크 참조), WEB-INF/lib폴더에 복사하여 설치했었다.
그러나 프로젝트가 복잡해질수록 사용하는 라이브러리가 많아지게 된다.
또한 프로젝트에 참여하는 사용자가 많아질수록 라이브러리의 관리는 어려워진다. 그리고 프로젝트가 복잡해질수록 소스를 컴파일하고 배포하는 것도 점점 어려워진다. 이러한 문제를 해결하기 위해 다양한 도구들이 존재하는데, 그중 하나가 Maven이다. Maven을 사용하면 빌드(Build), 패키징, 문서화, 테스트와 테스트 리포팅, git, 의존성관리, svn등과 같은 형상관리서버와 연동(SCMs), 배포 등의 작업을 손쉽게 할 수 있다.
Maven을 이해하려면 CoC(Convention over Configuration)라는 단어를 먼저 이해해야 한다. CoC란 일종의 관습을 말하는데, 예를 들자면 프로그램의 소스파일은 어떤 위치에 있어야 하고, 소스가 컴파일된 파일들은 어떤 위치에 있어야 하고 등을 미리 정해놨다는 것이다. 이 말은 관습에 이미 익숙한 사용자는 쉽게 Maven을 사용할 수 있는데, 관습에 익숙하지 않은 사용자는 이러한 제약사항에 대해서 심한 거부감을 느낄 수 있다. Maven을 사용한다는 것은 어쩌면 이러한 관습 즉 CoC에 대해서 알아나가는 것이라고도 말할 수 있다.
| Maven 기본
Maven을 생성하면 기본 파일구조는 다음과 같다. Maven으로 생성된 프로젝트의 경우 자바 소스는 src/main/java 폴더에 생성된다. 웹 어플리케이션과 관련된 html, css등은 src/main/webapp 폴더에서 작성해야 한다. 그런데, 생성된 프로젝트를 보면 src/main/java 폴더가 보이지 않는데, 이는 필요한 폴더는 별도로 만들어줄 필요가 있다는 것이다.
Archetype을 이용하여 Maven 기반 프로젝트를 생성할 경우 생성된 프로젝트 하위에 pom.xml 파일이 생성된다. pom.xml 파일을 살펴보면 다음과 같다.
각각 태그 의미 :
project : pom.xml 파일의 최상위 루트 엘리먼트(Root Element)이다.
modelVersion : POM model의 버전이다.
< 프로젝트 연관 정보>
groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.
artifactId : 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정한다. Maven을 이용하여 pom.xml을 빌드할 경우 다음과 같은 규칙으로 artifact가 생성된다. artifactid-version.packaging. 위 예의 경우 빌드할 경우 mysamexamples-1.0-SNAPSHOT.jar 파일이 생성된다.
packaging : 해당 프로젝트를 어떤 형태로 packaging 할 것인지 결정한다. jar, war, ear 등이 해당된다.
version : 프로젝트의 현재 버전. 추후 살펴보겠지만 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용한다. Maven의 버전 관리 기능은 라이브러리 관리를 편하게 한다.
< 프로젝트 정보 항목>
name : 프로젝트의 이름이다.
url : 프로젝트 사이트가 있다면 사이트 URL을 등록하는 것이 가능하다.
< dependencies >
Maven을 이용할 경우 얻게 되는 큰 이점 중의 하나는 Dependency Management 기능이다. 위 pom.xml 파일에서 <dependencies/> 엘리먼트가 Dependency Management 기능의 핵심이라고 할 수 있다. 해당 엘리먼트 안에 필요한 라이브러리를 지정하게 된다.이 프로젝트에서 의존하는 다른 프로젝트 정보를 기술한다.
dependency : 의존하는 프로젝트 POM 정보를 기술이다.
groupId : 의존하는 프로젝트의 그룹 ID이다.
artifactId : 의존하는 프로젝트의 artifact ID이다.
version : 의존하는 프로젝트의 버전이다.
scope : 의존하는 범위 (compile, runtime, provided, test 로 scope 가 나뉨)이다.
간략하게 설명하자면, 해당 라이브러리를 다운받을 때 리포지토리에 관련 pom도 같이 다운로드 받게 되는데 그 pom을 통해 명시된 의존 관계의 모듈도 함께 다운로드가 되게 된다. 그리고 그 정보를 클래스 패스에 추가하게 된다.
위에 설명한 구조를 표현하면 아래와 같다.
| Maven 라이프사이클
Maven은 미리 정의하고 있는 빌드 순서를 통해 (라이프사이클) 빌드결과 삭제, 컴파일 및 자원복사, 테스트, 압축(패키지) 배포 등의 단계를 밟게 된다.
Maven에서는 clan, build, site의 세 가지 Lifecycle을 기본적으로 제공하고 있다. 또한 컴파일(compile), 테스트(test), 패키지(package), 배포(deploy)등의 과정은 빌드 Lifecycle에 속하게 된다.
각 단계에 따른 Goal이 존재한다. Maven에서 기본적으로 제공하는 Phase와 연결된 플러그인의 Goal이 실행된다. 대표적으로 resources, compiler, package 등이 존재한다. 이 밖에 더 다양한 단계가 존재하지만 가장 많이 사용되는 것만 정리하면 아래와 같다.
'■ 용어 정리' 카테고리의 다른 글
[용어정리] JavaScript의 window 객체 (0) | 2020.04.28 |
---|---|
[용어정리] JDBC(Java Database Connectivity) (0) | 2020.04.28 |
[용어정리] REST API 란? (0) | 2020.04.28 |
[용어정리] JSTL(JSP Standard Tag Library) (0) | 2020.04.28 |
[용어정리] EL(Expression Language) 이란? (0) | 2020.04.28 |