pat coding

[Maven / Gradle] 빌드 도구 정리 본문

Tools

[Maven / Gradle] 빌드 도구 정리

uuukpyo 2020. 8. 20. 11:44
728x90

빌드란?

 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 결과

사용이유?

라이브러리 추가, 버전 동기화에 특화적임

 


1. Maven

메이븐은 자바프로젝트의 빌드를 자동화해주는 툴이다.

 

설정 파일

1) settings.xml

  메이븐 툴 자체에 관련된 설정을 담당

2) 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
 	 <groupId>org.springframework.boot</groupId>
 	 <artifactId>spring-boot-starter-parent</artifactId>
 	 <version>2.0.5.RELEASE</version>
 	 <relativePath/>
   </parent>
</project>

 위의 예시처럼 xml 방식으로 작성해야한다.

 

엘리먼트

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

필요한 라이브러리를 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한

다른 라이브러리들까지 네트워크를 통해서 자동으로 다운받아 준다.  

 

빌드순서 또는 생명주기(LifeCycle)

- Default(Build) : 일반적인 빌드 프로세스를 위한 모델이다.
- Clean : 빌드 시 생성되었던 파일들을 삭제하는 단계
- Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
- Compile : 프로젝트의 소스코드를 컴파일 하는 단계
- Test : 유닛(단위) 테스트를 수행 하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)
- Pacakge : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등등의 파일 등의 배포를 위한 패키지로 만드는 단계

- Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
- Install : 패키지를 로컬 저장소에 설치하는 단계
- Site : 프로젝트 문서와 사이트 작성, 생성하는 단계
- Deploy : 만들어진 package를 원격 저장소에 release 하는 단계


2. Gradle

Groovy 언어를 활용한 DSL를 스크립트로 사용한다.

변수선언, if, else, for 등의 로직 구현이 가능하다.

 

설정 파일

1) build.gradle

Gradle
buildscript {
    ext {
        springBootVersion = '1.5.4.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

apply plugin 에 사용하고자 하는 플러그인을 작성한다.

dependencies 에 라이브러리와 같은 의존성추가를 한다.

 

빌드

Gradle은 우리가 소스를 작성하는 것과 "동시"에 빌드 할 수 있도록 도와 주는 장치이다.

그렇기 때문에 소스코드를 수정할때마다 동시에 다시 빌드 된다.

 

Gradle은 해당 Task들을 순서대로 실행 시킨다.

각각의 Task들은 다음 순서의 Task에서 사용할 산출물 들을 생성하고, 해당 산출물들은 저장 된다.

그렇기 때문에 빌드를 다시할때 산출물 들이 같으면 해당 Task들은 수행 하지 않는다.

 

새로운 Gradle 버전이 출시되면 자동으로 업데이트 한다.

새로운 버전의 dependencies들이 출시되면 자동으로 업데이트 한다.


두 빌드의 비교

Gradle이 시기적으로 늦게 나온만큼 성능이 뛰어나다!

속도면에서 Gradle이 Maven보다 최대 100배 빠르다.

가독성면에서 Gradle 이 앞서고, 의존성이 늘어날 수록 속도의 차이가 많이나게 된다.

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


 

?? 어쩌다보니

Gradle 이 Maven 보다 뛰어난점만 작성한 것 같은데?..

728x90
Comments