지난 학기, 웹 프로젝트를 진행하면서 Maven을 이용했다. 그런데 필자는 Maven에 대한 이해가 부족한 상태로 개발을 진행했어서 중간중간 어려움이 많았다. 그래서 오늘은 Maven에 대해 공부한 내용을 정리하고자 한다.
Maven이 무엇이냐?
- Maven은 JAVA로 빌드되는 프레임워크에서 쓰이는 프로젝트 관리 도구이다.
* 빌드 : 소스코드로 되어 있는 파일들이 컴퓨터에서 실행될 수 있도록 소프트웨어 가공물로 변환하는 과정이나 결과물을 말한다.
- 내가 경험한 팀 프로젝트를 예로 들어서 설명을 돕자면, 당시 기능중에 자정마다 일일 챌린지를 업데이트하는 스케줄러를 설정해야 했었다. 관련된 라이브러리를 찾아보면서 적용하는 방법을 찾아볼때는 Maven의 역할을 잘 몰랐어서 대충 하라는대로 따라 했었다.
pom.xml 파일에 해당 코드를 추가해주어 자동으로 다운로드되도록 했다.
이렇게 정의를 해놓으면 알아서 자동으로 라이브러리를 다운받고 사용할 수 있고, 팀원과 공유할 때도 편리했다.
- 이처럼 Maven은 필요한 라이브러리를 pom.xml에 명시해놓으면 알아서 네트워크를 통해 다운로드를 해주고,더 나은 개발이 가능하다.
Maven의 장점
- 편리한 Dependecy LIbrary 관리 기능을 제공한다.
- 개발 환경이 서로 다르더라도 pom.xml을 공유하면 정상적으로 실행이 된다.
- war 파일 기반의 배포용으로 자주 사용된다.
-CoC(Convention over Configuration)라는 아이디어에 따라 모든 프로젝트가 일관된 디렉토리 구조와 빌드 프로세스를 유지할 수 있다.
pom(Project Object Model)
- XML 파일에 기반해 반복적으로 수행해온 의존성 설정, 프로젝트 빌드, 리포팅 ,문서화 작업 등을 자동화해주는 문서이다.
- 프로젝트마다 하나의 pom.xml 파일이 있다. 메이븐을 이용하는 프로젝트의 root에 존재하는 xml 파일이다.
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dbp09.condinghip</groupId>
<artifactId>dbp_HBTI</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>dbp_HBTI Maven Webapp</name>
<description>2021-2 DataBaseProgramming(01) 09 HBTI Service Project</description>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<java.version>1.8</java.version>
<servlet-api.version>4.0.1</servlet-api.version>
<jsp.version>2.3.3</jsp.version>
<jstl.version>1.2</jstl.version>
<logback-classic.version>1.2.6</logback-classic.version>
<commons-dbcp2.version>2.9.0</commons-dbcp2.version>
<commons-fileupload.version>1.4</commons-fileupload.version>
<jackson-databind.version>2.12.5</jackson-databind.version>
<junit.version>4.13.2</junit.version>
<mybatis.version>3.5.7</mybatis.version>
</properties>
<dependencies>
<dependency>
<!-- for unit test -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Servlet & JSP API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${jsp.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
</dependencies>
<build>
<finalName>dbp_HBTI</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
엘리먼트
- project : pom.xml 파일의 최상위 루트 엘리먼트
- modelVersion : POM model의 버전
- groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정. 일반적으로 도메인 이름을 거꾸로 적는다.
- artifactId : 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정한다. groupId 내에서 유일해야 한다. Maven을 이용하여 빌드할 경우 artifactId-version.packaging 과 같은 규칙으로 artifact가 생성된다.
위의 예시라면 dbp_HBTI-0.0.1-SNAPSHOT.jar 파일이 생성된다.
- version : 프로젝트의 현재 버전. 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용한다.
- packaging : 어떤 형태로 packaging할 건지를 결정. jar, war, ear 등이 해당된다.
- name : 프로젝트 이름
- url : 프로젝트 사이트가 있다면 사이트 URL 등록 가능
- properties : 속성으로 정의해놓고 dependencies에서 변수처럼 활용할 수 있다. 버전 관리시 용이하다.
- dependencies : 해당 프로젝트와 의존 관계에 있는 라이브러리를 관리한다.
- build : 빌드에 사용할 플러그인 목록
Maven 라이프 사이클
- Maven은 프로젝트의 전체적인 라이프 사이클을 관리하는 도구이기도 하다.
- 라이프 사이클(Life Cycle)이란 Maven에서 미리 정해진 빌드 순서를 일컫는다. 각 빌드 단계를 phase라고 하고, 이들은 서로 의존 관계를 갖고 있다. 즉, 해당 phase가 수행되려면 이전 단계의 phase가 모두 수행되어야 한다는 것이다.
Eclipse에서 Maven Project를 Run as를 눌러보면 기본적인 Maven Build LifeCycle을 확인할 수 있다.
Maven build : 메이븐 빌드를 실행한다.
Maven build.... : 새로운 사용자 빌드를 만든다.
Maven clean : target에 지정된 모든 소스를 삭제한다.
Maven generate-sources : 컴파일 과정에 포함될 소스를 생성한다.
Maven install : Local Repository에 패키지를 복사한다.
일반적으로 Maven은 default, clean, site 세가지로 표준 정의한다.
- Clean : 빌드 시 생성되었던 Output을 지워준다.
- Default (Build) : 일반적인 빌드 프로세스를 위한 모델이다.
- Site : 프로젝트 문서와 사이트 작성을 수행한다.
Maven은 모든 빌드 단위에 대한 Life Cycle이 예약되어 있어서 개발자가 임의로 변경할 수 없다.
각각의 라이프 사이클에 대한 자세한 설명은 이곳을 참고하도록 하자.
다른 라이브러리 관리 프로그램
1. Ant
- Ant는 소프트웨어 빌드 프로세스를 자동화하기 위한 소프트웨어 도구이다.
- 아주 복잡한 스크립트를 사용하고, 이 스크립트는 재사용이 불가하다.
- 스크립트가 복잡하기 때문에 점진적으로 개발 속도가 느려진다.
- 개발자가 직접 소스코드의 위치와 소스코드의 빌드가 된 파일의 위치 등을 build.xml에 정확하게 지정해주어야 한다.
- Life Cycle이 없기 때문에 각 goal에 일일이 작업에 대한 순서를 지정해주어야 한다.
2. Gradle
- XML 대신 groovy 스크립트를 사용하여 동적인 빌드가 가능하다.
- 멀티 프로젝트에서는 더 적합하다.
참고
https://maven.apache.org/what-is-maven.html
https://goddaehee.tistory.com/199
https://sjh836.tistory.com/131
'Dev > Spring' 카테고리의 다른 글
[Spring Boot] Heroku 서버 배포하기 (0) | 2022.05.18 |
---|---|
[Spring Boot] CORS 설정 시 addCorsMappings 에러 해결 (0) | 2022.05.03 |
[Spring boot] JPA 카멜 표기법으로 이름 설정하기 (0) | 2022.04.08 |
[Spring boot] 404 Not Found 에러 해결 - 경로 (0) | 2022.04.08 |
[Back-end] JDBC Programming (0) | 2022.01.22 |