[Java] Maven이란?

Java 공부를 진행하면서 강사님께서 하시는 말씀이 'Maven Module을 만들어라', 'pom.xml에 의존성을 정의해라' 등의 이야기를 하셨다. 따라서 진행하기는 했지만 Maven이 무엇인지, pom.xml이 왜 필요한지는 알지 못하기 때문에 정리해보려고 한다.

 

IntelliJ IDEA에서 작성한 Java 파일을 Eclipse의 workspace로 복사해 실행하려고 하면, IDE 간의 프로젝트 구조 차이로 인해 실행이 제대로 되지 않을 수 있다고 한다. (강사님의 설명에 따른 내용이지만 확실하지는 않음.)

만약 팀 프로젝트를 진행할 때, Eclipse에서 작성한 Java 파일이 IntelliJ를 사용하는 팀원의 환경에서 실행되지 않는다면 협업이 어려워질 수 있다. 이러한 문제를 해결하고 서로 다른 IDE에서도 Java 프로젝트를 쉽게 실행할 수 있도록 돕는 도구가 바로 빌드 도구이며, 그 중 대표적인 예가 Maven이다.

 

빌드 (Build)

https://iosdevlime.tistory.com

일단 빌드 도구에 대해 알기 전에 빌드(Build)라는게 무엇인지 알아야한다.

빌드란 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 그 결과를 말한다.

이 과정에서는 소스 코드 파일을 컴파일하고, 링크를 거쳐 실행 파일이나 라이브러리 파일 등을 생성한다.

빌드 도구

"빌드 도구"란 이러한 일련의 빌드 과정을 자동화 해주는 소프트웨어를 의미한다.

개발 기간동안 계속해서 늘어나는 라이브러리 추가, 프로젝트를 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장하게 되었다. 개발자들은 빌드 도구를 통해 프로젝트 정보 관리, 테스트 빌드, 배포 등의 작업을 자동화 할 수 있다.

 

Java 생태계에서 대표적으로 사용하는 빌드 도구가 바로 ‘Maven’과 ‘Gradle’이다. 

 

Maven

Maven은 자바용 프로젝트 관리도구로 Apache Ant 대안으로 만들어졌다.

Java 프로그램 개발 시 많은 외부 라이브러리를 활용하게 되는데, 이를 개발자가 하나하나 관리하려면 시간도 많이 들고, 귀찮을 것이다. 이 때 라이브러리를 효율적으로 활용하기 위해서는 의존성 관리를 자동으로 해주는 Maven(빌드 도구)의 활용이 필수적이다.

 

Maven은 POM.xml(Project Object Model) 파일을 사용해 빌드 설정을 관리한다.

Maven 필요한 라이브러리를 pom.xml에 정의해 놓으면 Maven 중앙 저장소(Maven Central Repository)에서 사용할 라이브러리뿐만 아니라 해당 라이브러리가 작동하는 데에 필요한 다른 라이브러리들까지 자동으로 다운로드하고 관리 해준다.

Maven 기본 디렉토리 구조

https://authentication.tistory.com/20

Maven의 기본 디렉토리 구조는 다음과 같다. 그래서 Eclipse에서 Maven Module을 생성하면 동일한 폴더 구조를 확인할 수 있다.

  • pom.xml : 프로젝트 정보 및 빌드, 의존성 관리 파일
  • src/main/java : Java 소스 파일
  • src/test/java : 테스트 Java 소스 파일 

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.~~</groupId>
    <artifactId>java-study</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>itcodeheaven</artifactId>
  
  <properties>
  	<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
  	<maven.compiler.source>21</maven.compiler.source>
  	<maven.compiler.target>21</maven.compiler.target>
  </properties>
  
  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
  </dependencies>
  
  <build>
	<finalName>itcodeheaven</finalName>  	
  </build>
</project>

 

  • modelVersion : Maven의 버전을 의미
  • groupId : 프로젝트 그룹 id를 뜻하며, 일반적으로 대표하는 사이트 도메인을 역순으로 적어 사용
  • artifactId : groupId외에 달느 프로젝트와는 구분될 수 있는 프로젝트의 ID
  • properties : pom.xml 파일 내에서 빈번하게 사용되는 중복 상수를 정의하는 영역. $(태그명)의 형태로 이용할 수 있다.
  • dependencies : 해당 프로젝트에서 의존성을 가지고 사용하는 라이브러리를 정의하는 영역
  • build : 프로젝트 빌드와 관련된 정보를 설정하는 영역

이렇게 pom.xml파일을 정의하여 프로젝트 정보 관리, 테스트 빌드, 배포 등의 작업을 자동화 할 수 있다.

Maven은 하나의 config 파일(pom.xml)을 통해 의존성을 관리하여, JVM 위에서 Java 프로그램을 실행할 때 필요한 라이브러리들을 손쉽게 가져오고, 빌드 및 실행을 간소화한다.