Back-end/DEV notes

메이븐이란? Maven 파헤치기. pom,repository,lifecycle ...

cheersHena 2020. 12. 14. 21:02
반응형

메이븐이란 Maven ? 

프로젝트의 전체적인 라이프사이클을 관리하는 관리도구이다. 

프로젝트 객체모델(Project Object Model: POM) 이라는 개념을 바탕으로  프로젝트의 의존성관리, 라이브러리관리, 프로젝트 라이프사이클 관리 기능등을 제공하는 프로젝트 관리도구이다. 플러그인을 기반으로 소스코드로부터 배포 가능한 산출물을 만들어내는 빌드 기능을 제공한다. 

 

빌드란? build 

소스코드 파일을 컴퓨터에서 실행 할 수 있는 독립 SW가공물로 변환하는 과정, 결과물 이다. 

즉, 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등 (.xml, .jpg, .jar, .properties ..)을 JVM이나 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다. 

 

빌드도구   build tool 

프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램이다.

계속해서 변동되는 라이브러리 추가, 버전 관리 등의 어려움을 해소하고자 등장했다.

ex) Maven, Ant, Gradle .. 등이 있다. 

 

메이븐 특징

  • 필요한 라이브러리를 특정문서(pom.xml)에 정의만 해주면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리 작동에 필요한 하위 라이브러리까지 네트워크를 통해서 자동으로 다운받아준다.

  • 중앙 저장소를 통한 자동 의존성 관리를 한다.

    중앙 저장소는 라이브러리를 공유하는 파일서버이고, 저장소는 아파치재단에서 운영관리하는 저장소를 사용할 수도 있고 별도의 사설 저장소를 사용할 수도 있다. 

  • 프로젝트 전체내용에 대한 기술 및 설정을 담당하는 pom과 라이브러리관리에 대한 dependency / repository 관리 모델 그리고 컴파일, 테스트, 패키징 등의 빌드생명주기를 다루는 라이프사이클 및 관련 플러그인들과의 연동을 다루는 부분으로 구성된다. 

 

메이븐 아키텍쳐 

Maven Architecture

 

프로젝트 객체 모델 POM 

Project Object Model. 프로젝트의 구조와 내용을 설명하고 있으며 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.0http://maven.apache.org/maven-v4_0_0.xsd">
 
 <modelVersion>4.0.0</modelVersion>  <!--POM model의 버전-->
  <groupId>egovframework.dev.com</groupId>  <!--프로젝트를 생성하는 조직의 고유 아이디를 결정-->
  <artifactId>egovframework-dev-com</artifactId> <!--프로젝트 빌드시 파일 대표명 --> 
  <version>1.0</version>   <!--현 프로젝트의 버전 --> 
  <packaging>war</packaging>  <!--패키징 유형(jar, war, ear 등)-->
  <name>egovframework-dev-com Maven Webapp</name> <!--프로젝트 이름-->
  
  <dependencies>  <!--dependencies 태그 안에는 프로젝트와 의존관계에 있는 라이브러리들을 관리-->
    <dependency>
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId>
      <version>4.4</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  
  <plugins> <!--빌드에 사용할 플러그인 목록--> 
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>    
    </plugin>
  </plugins>
  
</project>

 

메이븐 레파지토리 Repository 

artifact 들의 저장소로 로컬 및 리모트 레파지토리로 구성되며 프로젝트는 pom.xml에서 선언한 dependency들을 저장소로부터 불러와 사용한다.

* artifact란? :자바 프로젝트를 빌드할때 많이 사용되는 maven에서는 빌드로 생성되는 프로젝트의 결과물을 의미한다. 아티팩트는 자바 프로젝트의 성격에 따라 다르지만 일반적으로는 . jar, . war, .ear 등의 확장자를 갖게 된다.

 

  •  메이븐 설치시 로컬의 maven artifact들을 저장/관리하는 repository가 자동으로 구성된다.

    기본설정은 C:\Documents and Settings\Administrator\.m2\repository 디렉토리에 구성되며,

    사용자 변경가능.(settings.xml에 원하는 로컬 저장소의 경로를 지정)

  • 메이븐 설정파일 settings.xml 

    - 메이블 빌드 툴과 관련 설정파일이다.

    - Maven_home/conf 디렉토리에 위치. (메이븐 설치 시 기본제공)

  • 원격 저장소 (remote repository)

    메이븐에서 제공하는 중앙저장소 또는 각 기업에서 사용하는 사설 원격저장소(nexus 등)들이 있고 개발자는 환경설정을 통해 하나이상의 외부 레파지토리에서 필요로 하는 artifact들을 다운로드 받아 사용할 수 있다. 

  • 일반적으로 개발시 사용되는 라이브러리들은 모두 프로젝트 내부 디렉터리에 담고 경로설정을 통해 사용해야 하지만 메이븐에서는 의존성 설정을 통해 (pom.xml에 선언하여 사용) 사용 및 관리한다. 

  • 레파지토리 호출 프로세스 

    1. 프로젝트의 pom.xml에서 라이브러리 선언

    2. 개발자 로컬 레파지토리에서 선언한 라이브러리 검색 

      - 존재 시 프로젝트에 라이브러리 cache

      - 미존재 시 원격 레파지토리에 요청

    3. 원격 레파지토리에서 선언한 라이브러리 검색

      - 로컬 레파지토리는 원격 레파지토리에서 검색된 artifact를 내려받아 저장한다. 

 

Local / Remote Repository. 

* 로컬 레파지토리 Local Repository

artifact들을 로컬파일 시스템에 cache하는 기능으로 원격 레파지토리에서 다운로드 받아 artifact들을 저장/관리한다.

 

* 원격 레파지토리 Remote Repository

주로 http 서버로 thirdparty에서 제공하는 artifact들을 제외한 모든 artifact들을 제공한다. 

 

 

메이븐 디렉터리 구조.

메이븐은 bast practices을 기반으로 정규화된 디렉터리 구조를 제공하고 있으며 모든 소스파일들은 /src 디렉터리 이하에, 빌드된 output은 /target 디렉터리 밑에 위치한다. 

 

 

메이븐 라이프 사이클 Life Cycle 

메이븐 빌드는 미리정해진 동작 방식이 정해져 있고, 미리 정의된 빌드 순서가 있다. 

이를 라이프사이클 LifeCycle 이라 한다.

 

Maven Life Cycle

메이븐 생명주기 단계는 각각 플로그인과 바인딩되어 실제로 바인딩된 플러그인이 명령을 실행하며, 단계순서에 따라 순차적으로 빌드가 실행되어 개발자가 실행한 명령을 수행한다.

ex) mvn install 명령을 실행하면 , compile -> test -> package -> verify -> install 순으로 실행되는 것. 

 

 

메이븐 플러그인 Plugins

  • 메이븐은 대부분의 빌드 작업시 플러그인을 활요하며 메이븐 엔진이 생명주기 단계들과 플러그인을 바인딩 시켜 빌드작업을 수행한다.

  • 플러그인은 다른 artifacts와 같이 저장소에서 관리된다.

  • 메이븐은 여러 플러그인으로 구성되어 있으며, 각각의 플러스인은 하나이상의 goal(명령,작업) 을 포함한다. goal은 메이븐의 실행 단위이다.  메이븐은 여러 goal을 묶어서 lifecycle phases로 만들고 실행한다. ex) mvn clean install

 

플러그인 목록

 

의존성 관리. 

  • 메이븐은 POM에서 선언된 dependency설정으로 빌드 및 배포시 필요 라이브러리들을 관리하고 로컬 및 원격 저장소에서 선언된 라이브러리들을 다운받아 사용한다. 

  • 개발자는 프로젝트에 사용할 라이브러리를 직접 업로드하지 않고 pom.xml에 dependency로 정의만 해두면 메이븐이 repository에서 검색해서 자동으로 추가해준다. 심지어 참조하는 모든 라이브러리 까지 찾아서 추가해준다. 

의존성 추가 ex) 

  <project>
    ......
    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.4</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
    
  </project>
  
  //와 같이 선언하여 junit테스트를 위한 라이브러리를 사용할 수 있음. 
  • 의존성 분석 순서

    1. 로컬 저장소에서 의존성 확인

    2. 원격 저장소 리스트에서 의존성 확인

    3. 1과 2가 실패하면 의존성 에러 보고

     

  • 의존성<dependency> 필수 선언 항목

    <groupId>: 부분적인 프로젝트나 조직에서의 라이브러리 집합을 식별하기 위해 제공한다.

    <artifactId>: 프로젝트의 실제 이름으로 groupId와 합쳐져 프로젝트 식별에 쓰인다.

    <version>: 선언한 의존성 artifact의 버전으로 프로젝트 내에서 사용하는artifcat의 일관성을 추구할 수 있다.

 

 

반응형