Maven

2020. 11. 11. 21:36공부 정리/Back end

1. Maven


Maven은 지금까지 애플리케이션을 개발하기 위해 반복적으로 진행해왔던 작업들을

지원하기 위하여 등장한 도구

 

Maven을 사용하면 빌드(Build), 패키징, 문서화, 테스트와 테스트 리포팅, git, 의존성 관리, svn등과 같은 형상관리 서버와 연동(SCMs), 배포 등의 작업을 손쉽게 할 수 있다.

Maven을 이해하려면 CoC(Convention over Configuration)라는 단어를 먼저 이해해야 한다.

 

a. CoC(Convention over Configuration)


설정보다 관습 또는 구성보다 관습(convention over configuration), 

관습에 따른 코딩(coding by convention)

소프트웨어 프레임워크에 사용되는 소프트웨어 디자인 패러다임

 

CoC란 일종의 관습을 말하는데, 예를 들자면 프로그램의 소스파일은 어떤 위치에 있어야 하고, 소스가 컴파일된 파일들은 어떤 위치에 있어야 하고 등을 미리 정해놨다는 것이다. Maven을 사용한다는 것은 어쩌면 이러한 관습 즉 CoC에 대해서 알아나가는 것이라고도 말할 수 있다. 

 

많은 사람이 손꼽는 장점 중에는 편리한 의존성 라이브러리 관리가 있다.

Maven을 사용하면 설정 파일에 몇 줄 적어줌으로써 직접 다운로드 받거나 하는 것을 하지 않아도 라이브러리를 사용할 수 있다.

Maven을 사용하게 되면 Maven에 설정한 대로 모든 개발자가 일관된 방식으로 빌드를 수행할 수 있게 된다.

Maven은 또한 다양한 플러그인을 제공해줘서, 굉장히 많은 일들을 자동화시킬 수 있다.

 

b. LifeCycle


 

  • Maven에서는 clean, build, site의 세 가지 Lifecycle을 제공하고 있다.
  • 컴파일(compile), 테스트(test), 패키지(package), 배포(depooy)등의 과정은 빌드 Lifecycle에 속한다.
  • Maven은 모든 빌드 단위에 대한 Lifecycle이 예약되어 있어서 개발자가 임의로 변경할 수 없다.
  • 각 Lifecycle은 순서를 갖는 단계(phase)로 구성된다.
  • Maven의 기본 Lifecycle을 이해하려면 Phase와 Goal의 개념을 이해해야 한다.

출처: http://wiki.gurubee.net/download/attachments/2457635/6_MavenLifecycle.png

 

○ Phase & Goal


phase

  • Phase는 Build Lifecycle의 각각의 단계를 의미 한다.
  • Phase는 특정 순선에 따라서 goal이 실행되도록 구조를 제공한다.
  • Phase 간에는 의존 관계가 있다.
    예를 들어 package phase가 수행되기 위해서는 이전 phase가 순서대로 수행된 다음에 실행된다.

 

Goal

  • Goal은 Ant의 Target과 같은 개념으로 생각하면 된다.

 

phase & Goal의 관계

  • Maven에서 제공하는 모든 기능은 플러그인 기반으로 동작한다.
  • Maven에서 기본으로 제공하는 Phase를 실행하면 해당 Phase와 연결된 플러그인의 Goal이 실행된다.
  • 각 phase는 0개 이상의 goal과 바인드 되어 있으며, 대부분 0 또는 1개 이상의 Goal이 바인드 되어 있다.

출처http://wiki.gurubee.net/download/attachments/2457635/6_goal.png
출처http://wiki.gurubee.net/download/attachments/2457635/6_maven_phase.png

 

Plugin Goal

  • Maven에서 플러그인을 실행할 때 '플러그인이름 : 플러그인 지원 Goal'의 형식으로 실행할 기능을 선택할 수 있다.
  • 예를 들어 mvn compiler:compile은 'compiler' 플러그인에서 'compile' 기능(goal)을 실행한다는 것을 뜻 한다.

출처: http://wiki.gurubee.net/display/SWDEV/Maven+Lifecycle

 

○ Maven default Phase & Goal


process-resources

  • resources:resources Goal이 실행된다.
  • Maven Resources Plugin
  • <resource> directory(/src/main/resources)를 <outputDirectory>에 생성한다.

compile

  • resources:resources, compiler:compile Goal이 실행된다.
  • Maven Compiler Plugin
  • 소스 코드를 컴파일해서 클래스를 <outputDirectory>에 생성한다.

test-compile

  • compiler:compile, compiler:testCompile Goal이 실행된다.
  • 테스트 소스 코드를 컴파일한다.

test

  • compiler:compile, compiler:testCompile, surefire:test Goal이 실행된다.
  • Maven Surefire Plugin
  • junit과 같은 테스트 코드를 실행, 테스트가 실패하면 빌드를 멈춘다
  • target/surefie-reports디렉토리 안에 test 리포트 파일을 생성한다

package

  • package를 실행하면 compile, test-compile, test 순으로 실행된 다음 jar, war파일이 target 디렉토리 아래에 생성된다.
  • 패키징에 따라 아래의 플러그 인을 사용한다.
  • Maven Jar Plugin
  • Maven WAR Plugin
  • Maven EAR Plugin

install

  • 로컬 리파지토리에 패키지를 배포한다.
  • Maven Install Plugin

deploy

  • 원격 리파지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 한다.
  • Maven Deploy Plugin

clean

  • target 디렉토리의 결과물을 모두 제거한다.
  • Maven Clean Plugin

 

c. POM (Project Object Model)


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

POM(Project Object Model)은 단순한 라이브러리 역할을 한다.

<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 model의 버전

groupId: 프로젝트를 생성하는 조직의 고유 아이디를 결정, 일반적으로 도메인의 이름을 거꾸로 적는다.

artifactId: 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정한다.

위의 예시로 빌드할 경우, examples-1.0-SNAPSHOT.jar 파일이 생성된다.

packaging: 해당 프로젝트를 어떤 형태로 packaging 할 것인지 결정, jar, war, ear 등이 해당한다.

version: 프로젝트의 현재 버전

name: 프로젝트의 이름

url: 프로젝트 사이트가 있다면 사이트 URL을 등록하는 것이 가능

 

프로젝트의 디렉토리 구조

출처: https://cphinf.pstatic.net/mooc/20180723_93/1532327705849hiuxX_PNG/_.PNG

 

 

출처 & 참고

'공부 정리 > Back end' 카테고리의 다른 글

VO, DTO, DAO  (0) 2021.02.27
MVC  (0) 2020.12.07
container  (0) 2020.11.20
REST API -Web API  (0) 2020.11.12
servlet, WAS  (0) 2020.11.06