본문 바로가기
Develope_Web&App/02_Spring

Maven이란 무엇인가?

by 스타트업_디벨로퍼 2021. 2. 18.

Maven 알아가기 

#1 빌드란?

 - 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 그에 대한 결과물 이다.
 - 이를 좀더 쉽게 풀어 말하자면 우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등(.xml, .jpg, .jar, .properties)을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.

 

#2 빌드 도구(Build tool)

 - 빌드 도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램.
 - 빠른기간동안 계속해서 늘어나는 라이브러리 추가, 프로젝트를 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장.
 - 초기의 java 빌드도구로 Ant를 많이 사용하였으나 최근 많은 빌드도구들이 생겨나 Maven이 많이 쓰였고, 현재는 Gradle이 많이 쓰인다.
(Ant는 스크립트 작성도 많고, 라이브러리 의존관리가 되지 않아 불편함)

 

2. Maven

#1 정의 및 특징

 - Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다.
 - Maven은 Ant와 마찬가지로 프로젝트의 전체적인 라이프 사이클을 관리하는 도구 이며, 많은 편리함과 이점이 있어 널리 사용되고 있다.
   (프로젝트의 작성부터 컴파일, 페트스 등 프로젝트 라이프사이클에 포함되는 각 테스트를 지원해준다.)

 - Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.
 - Maven은 중앙 저장소를 통한 자동 의존성 관리를 중앙 저장소(아파치재단에서 운영 관리)는 라이브러리를 공유하는 파일 서버라고 볼 수 있고, 메이븐은 자기 회사만의 중앙 저장소를 구축할수도 있다.
 - 간단한 설정을 통한 배포 관리가 가능 하다.

 

#2 Ant vs Maven

1. Ant는 비교적 자유도가 높은 편
    (Ant : 전처리 / 컴파일 / 패키징 / 테스팅 / 배포 가능)

2. Maven은 정해진 라이프사이클에 의하여 작업 수행하며, 전반적인 프로젝트 관리 기능까지 포함.
    (Build Tool + Project Management)

 

#3 Maven LifeCycle

1) LifeCycle
 - 미리 정해진 빌드순서
 - 메이븐은 프레임워크이기 때문에 동작 방식이 정해져있고, 미리 정의하고 있는 빌드 순서가 있다. 이를 라이프사이클(Lifecycle)이라 한다. 

◎ Default(Build) : 일반적인 빌드 프로세스를 위한 모델이다.
◎ Clean : 빌드 시 생성되었던 파일들을 삭제하는 단계
◎ Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
◎ Compile : 프로젝트의 소스코드를 컴파일 하는 단계
◎ Test : 유닛(단위) 테스트를 수행 하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)
◎ Pacakge : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등등의 파일 등의 배포를 위한 패키지로 만드는 단계
◎ Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
◎ Install : 패키지를 로컬 저장소에 설치하는 단계
◎ Site : 프로젝트 문서와 사이트 작성, 생성하는 단계
◎ Deploy : 만들어진 package를 원격 저장소에 release 하는 단계

 

최종 빌드 순서는 compile => test => package 이다. 
① compile : src/main/java 디렉토리 아래의 모든 소스 코드가 컴파일 된다.
② test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스 코드 컴파일 된다. 

     ※ junit : 단위 테스트 프레임워크. 테스트 단계를 거치기 위해 의존 설정을 해준다.
③ packaging : 컴파일과 테스트가 완료 된 후, jar, war 같은 형태로 압축하는 작업.

2) Phase(단계)
Build Lifecycle의 각각의 단계를 Phase라고 한다.
Phase는 의존관계를 가지고 있어 해당 Phase가 수행되려면 이전 단계의 Phase가 모두 수행되어야 한다.
즉, 모든 빌드단계는 이전 단계가 성공적으로 실행되었을 때 실행된다는 것이 Dependency 입니다.

3) Goal
 - 특정 작업, 최소한의 실행 단위(task).
 - 하나의 플러그인에서는 여러 작업을 수행할 수 있도록 지원하며, 플러그인에서 실행할 수 있는 각각의 기능(명령)을 Goal이라고 한다.
(각각의 Phase에 연계된 Goal을 실행하는 과정을 Build라고 한다.)

 - 플러그인의 goal을 실행하는 방법은 다음과 같다.
 - mvn groupId:artifactId:version:goal(아래와 같이 생략 가능)
 - mvn plugin:goal

#4 Maven 설정파일

1) settings.xml
- 메이븐 빌드 툴과 관련한 설정파일
- MAVEN_HOME/conf 디렉토리에 위치 (메이븐 설치 시 기본 제공)
- settings.xml의  설정
  
** 메이븐을 빌드할 때 의존 관계에 있는 라이브러리, 플러그인을 중앙 저장소에서 개발자 PC로 다운로드 하는위치(로컬저장소)의 기본 설정 'USER_HOME/.m2/repository' 인데 settings.xml의 에 원하는 로컬 저장소의 경로를 지정, 변경할 수 있다.

 

2) POM(프로젝트 객체 모델(Project Object Model))
- POM은 pom.xml파일을 말하며 pom.xml은 메이븐을 이용하는 프로젝트의 root에 존재하는 xml 파일이다.
   (하나의 자바 프로젝트에 빌드 툴을 maven으로 설정하면, 프로젝트 최상위 디렉토리에 "pom.xml"이라는 파일이 생성된다.)
 - Maven의 기능을 이용하기 위해서 POM이 사용된다. 
 - 파일은 프로젝트마다 1개이며, pom.xml만 보면 프로젝트의 모든 설정, 의존성 등을 알 수 있다.
 - 다른 파일이름으로 지정할 수도 있다. (mvn -f 파일명.xml test). 하지만 pom.xml으로 사용하기를 권장한다.

 

ex) POM.XML 예시 (기본 SpringBoot 프로젝트의 Pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion> <!--POM model의 버전-->
	<parent> <!--프로젝트의 계층 정보-->
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.god</groupId> <!--프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.-->
	<artifactId>bo</artifactId> <!--프로젝트 빌드시 파일 대표이름 이다. groupId 내에서 유일해야 한다.Maven을 이용하여 빌드시 다음과 같은 규칙으로 파일이 생성 된다.
		artifactid-version.packaging. 위 예의 경우 빌드할 경우 bo-0.0.1-SNAPSHOT.war 파일이 생성된다.-->
	<version>0.0.1-SNAPSHOT</version> <!--프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용-->
	<packaging>war</packaging> <!--패키징 유형(jar, war, ear 등)-->
	<name>bo</name> <!--프로젝트, 프로젝트 이름-->
	<description>Demo project for Spring Boot</description> <!--프로젝트에 대한 간략한 설명-->
	<url>http://goddaehee.tistory.com</url> <!--프로젝트에 대한 참고 Reference 사이트-->

	<properties>
	<!-- 버전관리시 용이 하다. ex) 하당 자바 버전을 선언 하고 dependencies에서 다음과 같이 활용 가능 하다.
	<version>${java.version}</version> -->
		<java.version>1.8</java.version>
	</properties>

	<dependencies> <!--dependencies태그 안에는 프로젝트와 의존 관계에 있는 라이브러리들을 관리 한다.-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build> <!--빌드에 사용할 플러그인 목록-->
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>


 

▶ 엘리먼트
◎ modelVersion : POM model의 버전
◎ parent : 프로젝트의 계층 정보
◎ groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.
◎ artifactId : 프로젝트 빌드시 파일 대표이름 이다. groupId 내에서 유일해야 한다. Maven을 이용하여 빌드시 다음과 같은 규칙으로 파일이 생성 된다.
     artifactid-version.packaging. 위 예의 경우 빌드할 경우 bo-0.0.1-SNAPSHOT.war 파일이 생성된다.  (하단 예시 파일 참고)
◎ version : 프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용.
◎ packaging : 패키징 유형(jar, war, ear 등)
◎ name : 프로젝트, 프로젝트 이름
◎ description : 프로젝트에 대한 간략한 설명
◎ url : 프로젝트에 대한 참고 Reference 사이트
◎ properties : 버전관리시 용이 하다. ex) 하당 자바 버전을 선언 하고 dependencies에서 다음과 같이 활용 가능 하다.
      <version>${java.version}</version>
◎ dependencies : dependencies태그 안에는 프로젝트와 의존 관계에 있는 라이브러리들을 관리 한다.
◎ build : 빌드에 사용할 플러그인 목록

 

ex) 최종적으로 위와 같은 설정을 통해 메이븐 빌드를 한 결과

 

복잡한 프로젝트, 멀티 프로젝트의 경우는 Gradle이 많이 사용된다고 한다.



출처: https://goddaehee.tistory.com/199 [갓대희의 작은공간]

 

 

 

출처 : mangkyu.tistory.com/8

 

[Maven] Maven이란 무엇인가?

Spring 프레임워크 기반의 프로젝트를 진행하려고 보니 Spring의 내용들을 Maven 프로젝트에 추가를 해주어야 했습니다. 당연히(?) 망나니 개발자께서는 메이븐을 처음들어 보았기에 메이븐에 대해

mangkyu.tistory.com

1. [Maven]메이븐이란 무엇인가?


 

Apache Maven의 사전적 정의는 다음과 같습니다. 

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

                   Apache License로 배포되는 오픈 소스 소프트웨어이다.                   

역시 사전적 정의만을 참고하여 이해하기에는 저의 능력이 부족한 까닭에 여러 자료들을 참고하여 나름대로 이해를 해보았는데

모두가 이해하기 쉽게 제 경험을 들어 이야기해보겠습니다. 

 

대학교 2학년 때 학교 프로젝트 주제로 RPG게임 제작을 진행해본 적이 있습니다. 그때는 Java 와 mysql을 연동하여 사용하였는데 그때가 처음으로 라이브러리를 사용했을 때입니다. 그때는 필요한 jar파일이 mysql connector 하나밖에 없었기에 수동으로 라이브러리를 추가를 해주었습니다. 그런데!!!! 만약 프로젝트규모가 상당히 큰 경우에는 어떻게 할까요? 개발자들이 서로 필요한 jar파일을 공유하고 그것을 메일이나 카톡으로 주고받고 하면 너무 번거롭지 않을까요?? 

그래서 이러한 라이브러리들을 편리하게 공유하고 다운받고자 나온 것이 메이븐입니다. 

 

즉, 요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 네트워크를 통해서 라이브러리들을 자동으로 다운받아줍니다. 

그러므로 우리는 jar파일을 공유하고 카톡으로 보내는 등의 쓸모없는 짓을 할 필요 없이 pom.xml에 필요한 것을 명시해놓으면 네트워크를 통해서 라이브러리를 매우 손쉽게 다운받을 수 잇습니다.

 

2. Maven의 장점


 

① 라이브러리의 관리를 매우 용이하게 해준다.

② 프로젝트의 작성부터 컴파일, 페트스 등 프로젝트 라이프사이클에 포함되는 각 테스트를 지원해준다.

③ war파일 기반의 배포용으로도 자주 사용된다.

그 외에도 여러가지가 있는데 여기까지만 정리하도록 하겠습니다.

저도 처음에는 힘들었지만 계속 사용하려고 노력하다보니 어느정도 익숙해졌습니다.

 

3. Maven의 LifeCycle


 

메이븐은 프레임워크이기 때문에 동작 방식이 정해져있는데, 일련의 단계(Phase)에 연계된 Goal 을 실행하는 과정을 

Build라고 하며, 미리 정의되어있는 Build들의 순서를 라이프사이클(Lifecycle)이라 합니다.

즉, 미리 정의된 빌드순서를 라이프사이클(Lifecycle)이라 하고, 각 빌드 단계를 Phase라고 합니다.

 

기본적으로 Eclipse에서는 Run as를 눌러보면 기본적인 Maven Build LifeCylce을 볼 수 있습니다.

 

여기 나와있는 것들을 간단한 것들중 일부만 간단히 설명하자면 아래와 같다.

Maven build : 메이븐 빌드를 실행한다.

Maven build.... : 새로운 사용자 빌드를 만든다.

Maven clean : target에 지정된 모든 소스를 삭제한다.

Maven generate-sources : 컴파일 과정에 포함될 소스를 생성한다.

Maven install : Local Repository에 패키지를 복사한다.

 

 

일반적으로 메이븐은 3개의 표준 라이프사이클을 제공합니다.

 

  • Clean : 빌드 시 생성되었던 Output을 지워준다.
  • Default(Build) : 일반적인 빌드 프로세스를 위한 모델이다.
  • Site : 프로젝트 문서와 사이트 작성을 수행한다.

 

아래의 그림에서 처럼 compile, test, pacakge 등의 과정은 Build Lifecycle에 속합니다. 

또한 Maven은 모든 빌드단위에 대한 Lifecycle이 예약되어 있어서 개발자가 임의로 변경 할 수 없습니다.

 

 

 

 

위에서 잠깐 나온 Phase와 Goal에 대해 그림으로 표현하자면 아래와 같습니다.

 

 

Phase는 다음과 같은 특징을 지닙니다.

  • Phase는 특정 순서에 따라서 goal 이 실행되도록 구조를 제공한다.
  • Phase간에는 의존 관계가 있습니다. ex) compile phase가 수행되는 순서는 정해진 이전 phase의 다음이다.

즉, 모든 빌드단계는 이전 단계가 성공적으로 실행되었을 때 실행된다는 것이 Dependency 입니다.

 

Goal은 특정 작업, 최소한의 실행 단위(task)로, 각 단계(Phase)는 0개 이상의 goal과 연관있습니다.

그러므로 빌드 단계들은 goal들로 구성되어있다고 말할 수 있습니다.

 

(사진 출처: http://wiki.gurubee.net/display/SWDEV/Maven+Lifecycle)

반응형

'Develope_Web&amp;App > 02_Spring' 카테고리의 다른 글

mysql - springboot 연동하기  (0) 2021.02.25