본문 바로가기

오픈소스

Maven를 사용하는 이유

#Maven를 사용하는 이유

Maven 이란?

프로젝트 빌드, 관리에 사용되는도구 아파치 프로젝트 이다.
소스코드로 부터 배포 가능한 산출물(artifact) 빌드 하는 빌드툴이라고도 한다.

메이븐 활용

  • 일반적인 활용은 5가지 흐름으로 구성된다.

    1. build

      • 소스코드를 컴파일한다.
      • 테스트코드를 컴파일한다.
      • 기타 패키지 생성을 위한 바이너리를 생성한다.
    2. package

      • 배포 가능한 파일을 생성한다. (war, jar)
    3. Test

      • 단위테스트를 실행
      • 빌드 결과가 정상적인지 점검한다.
    4. Report

      • 빌드/패키지/테스트 결과를 정리하고 빌드 수행 리포트를 생성한다.
    5. Release

      • 빌드 후 생성된 artifact를 로컬 혹은 원격 저장소로 저장(배포)한다.

메이븐활용을 위한 5가지 핵심개념!

메이븐을 제대로 사용하기 위해서는 이 5가지는 꼭 알 고 있어야 한다. 근데 몰라도 난 사용했었다.ㅋ

  1. 플러그인

    • 메이븐(Maven)은 플러그인 실행 프레임워크이다.
    • 메이븐은 플러그인 메커니즘에 의해 기능이 확장된다.(모든작업은 플러그인이 수행한다.)
    • 플러그인은 다른 산출물(artifacts)와 같이 저장소에서 관리된다.
    • 플러그인은 골(goal)의 집합이다.
  2. 라이프사이클

    • 메이븐 동작 방식은 일련의 단계(phase)에 연계된 goal을 실행하는 것이며, 논리적인 작업 흐름인 단계의 집합이 라이프사이클이다.
      • 빌드 단계(build phases)들은 사전 정의된 순서대로 실행된다.
      • 모든 빌드 단계는 이전 단계가 성공적으로 실행되었을 때 실행된다.
    • 빌드 단계는 goal들로 구성된다.
      • Goal은 특정 작업, 최소한의 실행단위이다.
      • 각 단계는 0개 이상의 goal과 연관(associate)된다.
    • 메이븐은 3개 표준 라이프사이클을 제공한다.
      • clean : 빌드 시 생성도었던 산출물을 지운다.
      • default : 일반적인 빌드 프로세스를 위한 모델이다.
      • site : 프로젝트 문서와 사이트 작성을 수행한다.
  3. 의존성

    • 라이브러리 다운로드 자동화
      • 라이브러리를 찾아서 일일이 다운로드 받을 필요없다. 필요하다고 선언만하면 자동으로 다운로드 받는다.
    • 메이븐은 선언적(명령식이 아니다.)
      • 사용되는 jar 파일들의 선언을 통해 메이븐이 알아서 관리 재 다운로드, 최신버전 설치등
    • 메이븐이 관리한다.
      • 라이브러리 디렉터리를 생성할 필요 없음
  4. 프로파일(profile)

    • 서로다른 대상 환경을 위한 다른 빌드 설정
    • 동작방식(Activation)
    • 메이븐은 정상절차(step) 이외에 프로파일을 위한 절차를 추가로 수행한다.
  5. POM(Project Object Model) 프로젝트 객체모델

    • 프로젝트당 하나의 Pom.xml

    • 3가지 coordinates를 이용하여 자원을 식별

      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>12</version>
    • POM 중요속성

      <groupId> : 프로젝트의 패키지 명칭
      
      <artifactId> : artifact 이름, groupId 내에서 유일해야 한다.
      
      <version> : artifact 의 현재버전 ex. 1.0-SNAPSHOT
      
      <name> : 어플리케이션 명칭
      
      <packaging> : 패키징 유형(jar, war 등)
      
      <distributionManagement> : artifact가 배포될 저장소 정보와 설정
      
      <parent> : 프로젝트의 계층 정보
      
      <dependencyManagement> : 의존성 처리에 대한 기본 설정 영역
      
      <dependencies> : 의존성 정의 영역
      
      <repositories> : 이거 안쓰면 공식 maven 저장소를 활용하지만, 사용하면 거기 저장소를 사용
      
      <build> : 빌드에 사용할 플러그인 목록을 나열
      
      <reporting> : 리포팅에 사용할 플러그인 목록을 나열
      
      <properties> : 보기좋게 관리가능, 보통 버전에 많이 쓴다.
      
      <!-- properties 에 이렇게 추가하면 -->
      <spring-version>4.3.3.RELEASE</spring-version>
      
      <!-- dependencies 에 이렇게 쓸수 있다. -->
      <version>${spring-version}</version>

Maven철학

Convention Over Configuration(COC) : 설정보단 관습

  • 개발자의 소스나 실행파일 디렉터리 명칭을 보고 알 수 있다.
  • 개발자들의 관습 혹은 암묵적으로 알고 있는 디렉터리 위치나 정보를 똑같이 사용하자
  • 설정 작업이 간결해지고 쉬워진다.(관습과 다른 내용만 서술/명시한다.)

PS.

지금까지 Maven에 대해서 알아 보았다. gradle, ant 등이 있지만 아직 난 명시적인 maven을 더 선호하고 있다.
근데 코틀린에 관심이 생기면서 그레들이 코틀린 dsl이 추가 되면서 관심이 가는중이다.


'오픈소스' 카테고리의 다른 글

Docker 로 Mysql 5.7 버전 설치하기  (0) 2021.06.29
[오픈소스] Armeria  (0) 2019.04.23