메뉴 건너뛰기

XEDITION

MAVEN

2주차 - Maven을 활용한 빌드 환경

엘리후 2016.07.04 21:43 조회 수 : 138

Maven을 활용한 빌드 환경

 

 

빌드환경의 필요성

빌드(Build)란?

  • 소스 코드 파일을 동작하는 독립적인 소프트웨어 산출물로 만드는 과정이다.
  • 빌드의 가장 중요한 단계중 하나는 소스 코드 파일을 실행 코드로 변환하는 컴파일 과정이다. 
  • 간단한 프로그램은 하나의 파일만 컴파일해도 되겠지만, 많은 소스코드와 다양한 버전닝을 필요하는 복잡한 프로젝트는 어떻게 할것인가?
  • 빌드툴(Build Tool)이 이런 수고로움을 덜어주고 있다!!

빌드 툴(Build Tool)

  • 새로운 버전의 프로그램을 빌드할때 사용하는 툴
  • 일반적인 빌드 툴이 제공하는 기능 
    • 전처리(preprocessing), 컴파일(compilation), 패키징(packaging), 테스팅(testing), 배포(distribution)

빌드 자동화란?

개발자가 매일 진행하는 일을 자동화 하는 행동들, 빌드툴들이 이런 자동화를 도와준다

  • 소스 코드를 바이너리 코드로 컴파일
  • 바이너리 코드 패키징
  • 테스트 수행
  • 실서비스 시스템 배포
  • 도큐먼트 및 릴리즈 노트 생성

개발에 있어 빌드란?

  • 애플리케이션 개발에 있어 빌드는 개발하는 애플리케이션을 완성 시켜주는 마지막 단계 
  • 개발한 것들을 산출물, 결과물을 내는 과정
  • 빌드를 잘하는 것은  훌륭한 애플리케이션을 만드는데 중요한 과정이다
  • 좋은 빌드 툴을 선택하는것은 개발의 기본 요건이다!
  • 내가 개발을 하면서 느낀 빌드란

    갓 회사 입사했을때 : 빌드툴이라는 개념조차 몰랐다;; 그때 ANT를 사용하였는데 난 스크립트만 돌리면 알아서 서버에 빌드되고 잘돌아갔던거 같다.
    몇년 후 : ANT라는 존재를 알았으나 새 프로젝트를 진행하지 않는 이상 빌드툴을 고려할 일이 없었다. 단지, 이클립스로 열심히 코드 작성하고 필요한 라이브러리 다운 
    받거나 디렉토리 수정이 다였다.
    Maven 프로젝트를 받았을때 그 신기함을 잊을수 없다. 프로젝트 구성이 자동으로 되고 라이브러리 파일을 다운받을 필요도 없었고 레파지토리(저장소)의 존재는놀라웠다.

    지금은? Maven 프로젝트를 배포를 담당하고 있고 매주 빌드와 배포를 반복하고 있다. 서로 의존하고 있는 큰 프로젝트를 이런 빌드툴없이 사용하였다면 얼마나 많은 시간은 빌드에 소비하였을까? 사실 빌드툴 없는 환경은 생각해본적이 없다.

  • 왜 빌드 툴이 필요한가? 이거 정말 중요할 듯. 
    • 아직도 빌드 툴의 필요성에 대해 의구심을 가지는 개발자들이 있다.
    • 필요성만 느낀다면 이후에는 관심을 가지고 학습하지 않을까?

빌드 툴 소개

Apache Ant 

  • 자바로 구현됨, 자바 프로젝트 빌드에 적합
  • XML 파일(build.xml)을 사용하여 빌드 프로세스와 의존성 정의 

Apache Maven

  • Apache Ant와 비슷하나 컨셉과 동작방식이 다름
  • C#, Ruby, Scala등 Java가 아닌 프로젝트도 빌드와 관리가 가능
  • XML 파일(pom.xml)에 정의함(의존성, 빌드 순서, plug-in등)
  • Maven Repository - 자바 라이브러리나 플러그인을 다운받을수 있음

Gradle

  • Ant나 Maven과 비슷한 컨셉
  • XML대신 DSL을 통해 프로젝트 정의 

Maven 소개

Maven 이란?

  • 빌드툴? 프로젝트 관리 툴?
  • 소스 코드로 부터 배포 가능한 산출물을 빌드하는 '빌드툴'
  • 프로젝트 관리 도구
    • 프로젝트 오브젝트 모델, 표준 집합, 프로젝트 라이프사이클, 의존성관리 시스템, 라이프사이클에 정의된 단계에서 플러그인 골을 실행하기 위한 로직을 포함하는 관리 툴이다
  • Archetype 통해 적합한 구조의 프로젝트 생성, 

    애플리케이션 명칭과 버전 및 연관된 라이브러리에 대한 정보 등을 종합적으로 관리

    서브 프로젝트간의 관계 손쉽게 설정

    Nexus를 통해 저장소 관리 

    Maven이 제공하는 기능
    • Builds
    • Documentation
    • Reporting
    • Dependencies
    • SCMs
    • Releases
    • Distribution

 

Maven의 시작

메이븐은 Jakarta Turbine 프로젝트의 빌드 프로세스를 단순화 하기 위해 시작되었다. 
여러 프로젝트 마다 자신의 ANT 빌드 파일과 JAR파일들이 존재 하고 있었다. 이런 환경은 빌드를 복잡하게 만든다. 
점차 프로젝트가 커짐에 따라 프로젝트를 빌드하는 표준방법 필요하게 되었다. 이로 인해 나온것이 바로 메이븐이다.

Maven의 목적

개발자가 짧은 기간에 개발의 전체 상태를 이해 할 수 있도록한다

 

Making the build process easy
Providing a uniform build system
Providing quality project information
Providing guidelines for best practices development
Allowing transparent migration to new features

Maven 간단하게 보기 

간단한 웹 프로젝트 시작하기

 

  1. archetype:generate
    $ mvn archetype:generate -DgroupId=net.sasary.study -DartifactId=sasary -DarchetypeArtifactId=maven-archetype-webapp
  2. eclipse 프로젝트 설정 추가 

    $ mvn eclipse:eclipse
  3. eclipse에서 프로젝트 import
  4. 완성 
  5. 컴파일 하기( 이클립스에서만 띄운다면 mvn 툴을 사용해서 하면 된다 (smile) ) 

    $ mvn compile
  6. 패키지 만들기

    $ mvn package

 

프로젝트 공통 구조

src/main/java Application/Library sources
src/main/resources Application/Library resources
src/main/filters Resource filter files
src/main/assembly Assembly descriptors
src/main/config Configuration files
src/main/scripts Application/Library scripts
src/main/webapp Web application sources
src/test/java Test sources
src/test/resources Test resources
src/test/filters Test resource filter files
src/site Site
LICENSE.txt Project's license
NOTICE.txt Notices and attributions required by libraries that the project depends on
README.txt Project's readme

 

maven lifecycle과 dependency

 

 

  • 메이븐에서 의존관계 라이브러리 관리 방법

ant vs maven

자바 환경에서 주로 사용하는 Maven과 Ant는 항상 비교되는 이슈 중 하나인거 같다. 과연 둘을 비교하는것이 맞을까? 
내가 느낀 Ant와 Maven의 차이는 서로 대등한 기능들에 대한 비교상대는 아닌거 같다. 비교하기에는 서로의 컨셉부터 다르지 않은가?

Apache Ant
Apache Maven

기존의 make와 같은 빌드의 단점을 보완한 XML 기반의 빌드툴
하나이상의 정의된 xml 파일 스크립트에 의해 동
xml 파일에 정의된 target을 수행하고 target은 task수행
각 작업은 정의된 순서에 따라 진행되어 짐

Ant와 비슷하나 프로젝트 관리를 위한 컨셉으로 만들어진 프로젝트 관리툴
모든 프로젝트를 특정한 구조와 지원되는 task work-flow들의 일련으로 간주
Pom.xml에 프로젝트 구조와 동작 정의
프로젝트의 구조와 work-flow는 정해진 컨벤션에 맞춰 동작

무슨일을 하고 무엇에 의존하는지 명확하게 정의할수 있도록 xml 최적화
Ant가 실행하는 모든 것들은 Ant 스크립트에서 확인할수 있음

익숙하지 않은 사용자도 쉽게 접근 가능

간결한 프로젝트 정의, 다른 개발도구나 서버환경에서 자동으로 통합 가능함

쉽게 구조를 검사할수 있고, 결과물에 대해 이해한 상태에서 work-flow를 수행해 볼수 있다. 

숙련된 개발자도 스크립트 실행없이는 빌드를 추론하기 어렵고

복잡한 스크립트는 부담스러운 과제가 될수도 있음

메이븐 시작시 이해과정 필요, 이미 완성된 프로젝트에 적용하기 어려움

자율성이 떨어진다는 의견도 있다

Ant 예제 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
project name="MyProject" default="dist" basedir=".">
    <description>
        simple example build file
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>
 
  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>
 
  <target name="compile" depends="init"
        description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>
 
  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>
 
    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
  </target>
 
  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

Maven 예제 

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</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>

 

의문점?

  • Maven은 빌드 툴인가?

  • Gradle을 사용하는건 어떤가?

참고자료

출처 https://slipp.net/wiki/pages/viewpage.action?pageId=4489306
위로