[Servlet]Maven이란?

2019. 3. 5. 17:01JAVA Back-End

 

이전에 JSTL을 이용하기 전에 JSTL관련 라이브러리를 다운받아 웹 프로젝트의 WEB-INF/lib폴더에 복사해 사용했었습니다. 프로젝트가 커질수록 의존(사용)하는 라이브러리가 많아지고 복잡해집니다... 

프로젝트에 참여하는 개발자가 많아지면 라이브러리 관리가 더 어려워지고, 프로젝트가 복잡해질수록 소스코드를 컴파일하고 배포하기도 어려워집니다.이러한 문제점들을 해결하기 위해서 다양한 도구가 존재하는데 Maven에 대해서 알아보겠습니다. 추후 성능면에서 뛰어난 Gradle에 대해서 정리해보겠습니다 :)


Maven?


Maven은 애플리케이션을 개발하기 위해 반복적으로 진행해왔던 작업들을 지원하기 위해서 등장한 소프트웨어 프로젝트 관리 및 이해 도구입니다.

Maven을 이용하면 빌드 / 패키징 / 문서화 / 테스트 / 테스트리포팅 / Git / 의존성 관리 / SVN 등과 같은 형상관리서버와 연동, 배포 등을 쉽게 할 수 있습니다. 

CoC (Convention over Configuration)

구성에 대한 관습입니다. 즉, 일종의 관습으로, 예를 들면 프로그램의 소스 파일은 어떤 위치에 있어야하고, 소스 코드가 컴파일 된 파일들은 어떤 위치에 있어야 한다!! 등을 미리 정해놓은 약속들로 보면 좋습니다.

Maven을 이해하기 앞서 CoC를 이해해야 합니다. Maven은 프로젝트에 대한 정의들을 CoC를 바탕으로 구체화했습니다.

소스코드 : ${basedir}/src/main/java
리소스 : ${basedir}/src/main/resources
테스트 코드 : ${basedir}/src/test
컴파일 시  ${basedir}/target/classes 에 바이트 코드가 생성
배포할 수 있는 .jar 파일 ${basedir}/target에 생성될 것을 가정

Maven을 사용한다는 건 CoC를 알아가는 것이라고 보면 좋겠습니다.

Maven을 사용해서 좋은 점?

  • 편리한 의존성 라이브러리 관리 (dependency)

JSTL을 사용하기 전 .jar 파일들을 다운받아 내 프로젝트의 /WEB-INF/lib 폴더에 복사해 사용했었습니다. 

하지만 프로젝트가 커지고 외부 라이브러리를 몇 백개 사용할 때마다 이런 방식은 상당히 불편합니다...

Maven을 사용하면 설정 파일에 몇 줄 적음으로써 직접 다운받지 않아도 라이브러리를 사용할 수 있습니다!

  • 프로젝트 빌드(Build) 방법 가이드

큰 프로젝트에 참여하는 개발자가 많아지면, 프로젝트 빌드 방법에 대해 가이드하는 것도 상당한 힘이 들어갑니다.

Maven같은 빌드 도구를 사용하면 Maven 설정 대로 모든 개발자가 일괄된 방식으로 빌드 수행이 가능해집니다.

  • 다양한 플러그인을 제공해줘, 많은 일들을 자동화시킬 수 있습니다.

Maven 기본

Archetype을 이용해 Maven 기반 프로젝트를 생성할 경우 생성된 프로젝트 하위에 pom.xml 파일이 생성됩니다.

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 모델의 버전입니다.
  • groupId : 프로젝트를 생성하는 조직의 고유아이디. 일반적으로 도메인 이름을 거꾸로 적습니다.
  • artifactId : 해당 프로젝트에 의해 생성되는 artifacti의 고유 아이디를 결정합니다. Maven을 이용해 pom.xml을 빌드할 경우 다음과 같은 규칙으로 artifact가 생성됩니다. artifactid-version.packaging. 위 예의 경우 빌드할 경우 mysamexamples-1.0-SNAPSHOT.jar파일이 생성됩니다.
  • packaging : 해당 프로젝트를 어떤 형태로 패키징 할 지 결정합니다. jar / war / ear 등이 해당됩니다.
  • version : 프로젝트의 현재 버전. 프로젝트가 개발 중일 땐 SNAPSHOT을 접미사로 사용합니다. Maven의 버전 관리 기능은 라이브러리 관리를 편하게 합니다
  • name : 프로젝트 이름.
  • url : 프로젝트 사이트가 있다면 사이트 URL을 등록할 수 있습니다. 
Maven을 이용할 경우 얻는 가장 큰 이점 중 하나는 Dependency Management 기능입니다. 
pom.xml에서 </dependencies> 엘리먼트가 Dependency Management 기능의 핵심입니다.
이 기능을 통해 외부 라이브러리를 지정하고 사용할 수 있게됩니다.  Maven은 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동되는 데 필요한 사용된 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운받아 줍니다.



<참고>

 https://julingks.tistory.com/entry/Maven-CoCConvention-over-Configuration [My Tech Notes]

[ edwith - 웹프로그래밍 부스트코스 ] 를 개인적으로 공부하고 정리한 공간입니다. 잘못된 부분은 피드백 주시면 감사하겠습니다