Maven이란?
Maven은 지금까지 애플리케이션을 개발하기 위해 반복적으로 진행해왔던 작업들을 지원하기 위하여 등장한 도구입니다.
Maven을 사용하면 빌드(Build), 패키징, 문서화, 테스트와 테스트 리포팅, git, 의존성관리, svn등과 같은 형상관리서버와 연동(SCMs), 배포 등의 작업을 손쉽게 할 수 있습니다.
Maven을 이해하려면 CoC(Convention over Configuration)라는 단어를 먼저 이해해야 합니다.
CoC란 일종의 관습을 말하는데, 예를 들자면 프로그램의 소스파일은 어떤 위치에 있어야 하고, 소스가 컴파일된 파일들은 어떤 위치에 있어야 하고 등을 미리 정해놨다는 것입니다.
이 말은 관습에 이미 익숙한 사용자는 쉽게 Maven을 사용할 수 있는데, 관습에 익숙하지 않은 사용자는 이러한 제약사항에 대해서 심한 거부감을 느낄 수 있습니다.
Maven을 사용한다는 것은 어쩌면 이러한 관습 즉 CoC에 대해서 알아나가는 것이라고도 말할 수 있습니다.
Maven 이점
Maven을 사용할 경우, 굉장히 편리한 점들이 많습니다.
많은 사람이 손꼽는 장점 중에는 1)편리한 의존성 라이브러리 관리가 있습니다.
관련된 라이브러리가 많아질수록 이러한 방식은 상당히 불편해집니다.
Maven을 사용하면 설정 파일에 몇 줄 적어줌으로써 직접 다운로드 받거나 하는 것을 하지 않아도 라이브러리를 사용할 수 있습니다.
프로젝트에 참여하는 개발자가 많아지게 되면, 프로젝트를 빌드하는 방법에 대하여 가이드하는 것도 쉬운 일이 아닙니다.
Maven을 사용하게 되면 2)Maven에 설정한 대로 모든 개발자가 일관된 방식으로 빌드를 수행할 수 있게 됩니다.
Maven은 또한 3)다양한 플러그인을 제공해줘서, 굉장히 많은 일들을 자동화시킬 수 있습니다.
Maven이 참조하는 설정
1) settings.xml
settings.xml은 maven tool 자체에 관련된 설정을 담당합니다.
경로:
- ${user.home}/.m2/settings.xml -> default path
- ${maven.home}/conf/settings.xml
용도
1) Proxies
방화벽이나 SSL 이슈를 해결하기 위해 Proxy 설정을 합니다.
2) Servers
저장소 서버에 관련된 설정
저장소(nexus)의 인증하는 방법을 제공합니다.
등등..
회사에서 보안때문에 초기 설정 시 setting.xml을 통해서 빌드해야했던 경우가 있었다. 특히 nexus 에서 다운로드 안될 때 담당하시는 분께 말씀을 드렸어야 했는데 다른 설정에서 잘못한 줄 알고 한참 헤맸었다.
참고: https://nesoy.github.io/articles/2021-03/maven-settings
2) pom.xml
Archetype을 이용하여 Maven 기반 프로젝트를 생성할 경우 생성된 프로젝트 최상위 디렉토리에 pom.xml 파일이 생성됩니다.
- archetype이란? 영어로는 원형이라는 의미로 여기서는 프로젝트의 틀(템플릿)이라고 할 수 있습니다.
- 어떤 아키타입을 선택했느냐에 따라서 자동으로, 여러 가지 파일들을 생성하거나 라이브러리를 셋팅해주거나 등의 일을 해줍니다.
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.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.or.connect</groupId>
<artifactId>examples</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>mysample</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
각각의 태그의 의미는 다음과 같습니다.
- project : pom.xml 파일의 최상위 루트 엘리먼트(Root Element)입니다.
- modelVersion : POM model의 버전입니다.
- groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정합니다. 일반적으로 도메인 이름을 거꾸로 적습니다.
- artifactId : 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정합니다. Maven을 이용하여 pom.xml을 빌드할 경우 다음과 같은 규칙으로 artifact가 생성됩니다. artifactid-version.packaging. 위 예의 경우 빌드할 경우 examples-1.0-SNAPSHOT.jar 파일이 생성됩니다.
- packaging : 해당 프로젝트를 어떤 형태로 packaging 할 것인지 결정합니다. jar, war, ear 등이 해당됩니다.
- version : 프로젝트의 현재 버전. 추후 살펴보겠지만 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용합니다. Maven의 버전 관리 기능은 라이브러리 관리를 편하게 합니다.
- name : 프로젝트의 이름입니다.
- url : 프로젝트 사이트가 있다면 사이트 URL을 등록하는 것이 가능합니다.
scope는 다음과 같은 4가지가 있습니다.
- compile : 컴파일 할 때 필요. 테스트 및 런타임에도 클래스 패스에 포함됩니다. scope 을 설정하지 않는 경우 기본값입니다.
- runtime : 런타임에 필요. JDBC 드라이버 등이 예가 됩니다. 컴파일 시에는 필요하지 않지만, 실행 시에 필요한 경우입니다.
- provided : 컴파일 시에 필요하지만, 실제 런타임 때에는 컨테이너 같은 것에서 제공되는 모듈. servlet, jsp api 등이 이에 해당. 배포 시 제외됩니다.
- test : 테스트 코드를 컴파일 할 때 필요. 테스트 시 클래스 패스에 포함되며, 배포 시 제외됩니다.
Maven 을 이용할 경우 얻게 되는 큰 이점 중의 하나는 Dependency Management 기능입니다.
위 pom.xml 파일에서 <dependencies/> 엘리먼트가 Dependency Management 기능의 핵심이라고 할 수 있습니다.
해당 엘리먼트 안에 필요한 라이브러리를 지정하게 됩니다.
참고:
https://www.boostcourse.org/web316/lecture/16723?isDesc=false
https://jeong-pro.tistory.com/168
추가 참고 자료 링크
- 아티팩트란
a.zany.kr:9003/board/bView.asp?bCode=52299899&aCode=13729
- 다중 모듈 개념 및 설정
blog.naver.com/PostView.nhn?blogId=choigohot&logNo=40188252806
- 메이븐 레포리터리에 대해서
- 메이븐 설정 중 distributionManagement 이란?
'기술' 카테고리의 다른 글
Spring Boot의 Java 버전 변경하기 (maven, Intellij) (0) | 2024.05.08 |
---|---|
Maven을 이용한 웹 어플리케이션 생성 및 설정 (0) | 2022.07.23 |
RHEL7의 malloc (0) | 2021.01.03 |
Unicode와 encoding (0) | 2020.09.09 |
안전한 패스워드 (0) | 2020.04.20 |