Build Tools

빌드 도구란, 빌드 자동화를 통해 실행가능한 프로그램(애플리케이션)을 만들어 주는 프로그램을 말한다.

  • 빌드 : 소스코드 파일들을 컴퓨터에서 실행할 수 있는 소프트웨어로 변환하는 일련의 과정으로, compile, test, deploy 등 모든 과정의 집합

대표적인 빌드 도구 종류에는 Ant, Maven, Gradle이 있다.

Ant

Ant의 가장 큰 장점은 개발자가 자유롭게 빌드 단위(target)을 지정하고 빌드 단위간의 의존관계를 자유롭게 설정할 수 있다는 것이다. 하지만 자유도가 높다는 것은 잘 활용할 경우 좋은 도구가 될 수 있지만 그렇지 않을 경우 애물단지로 전락할 가능성이 있다.

  • XML 기반 빌드 스크립트(build.xml)

  • 규칙이 없음

  • 절차적

  • 생명주기를 갖지 않아 각각의 target에 대한 의존성을 직접 정의 해줘야한다.

단점

  • 유연성이 높지만, 프로젝트가 복잡해지는 경우 build 과정의 이해가 어렵다

  • XML, Remote Repository를 가져올 수 없다

  • 스크립트의 재사용이 어렵다.

  • Apache Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어짐

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

  • pom.xml 파일에 필요한 라이브러리를 정의해 두면, 해당 라이브러리가 작동하는 의존성 라이브러리들까지 관리하여, 자동으로 다운로드 받아줌

  • 간단한 설정을 통한 배포 관리가 가능

라이브러리가 서로 종속되어있을 경우 XML이 복잡해지며, 계층적인 데이터를 표현하기에는 좋지만, 플로우나 조건부 상황을 표현하기 어렵다는 단점이 있다.

Gradle

  • 현재 가장 많이 사용되는 빌드 도구

  • Gradle은 프로젝트를 위한 범용 빌드 도구이다. 안드로이드 스튜디오에서 기본 빌드시스템으로 사용

  • Ant의 유연성(기본적인 빌드 도구 기능)과 효과적인 빌드 툴인 Maven의 편리성(의존 라이브러리 관리 기능)을 조합하여 많은 오픈소스 프로젝트의 빌드 시스템으로 채택되고 있다

  • xml 언어에 대한 단점도 Groovy 언어(JVM 환경언어)를 사용해 해결

    • Gradle은 Groovy DSL로 작성하며, 설정 정보는 변수에 값을 넣는 형태로, 동적인 빌드는 Groovy 스크립트로 Gradle용 플러그인을 호출하거나 직접 코드를 짤 수 있다.

기본적으로 프로젝트 하위에 build.gradle 파일로 생성이 되며, 프로젝트에서 사용할 라이브러리와 버전을 관리할 수 있다.

  • sourceCompatibility : Java Version

  • dependencies : 라이브러리 의존성 관리

만약 인텔리제이로 프로젝트 실행시에 Build and run이 Gradle로 되어있으면, 실행 속도가 느린 경우가 있으므로 아래와 같이 설정을 intellij로 변경해주는 것이 좋다.

![](./assets/스크린샷 2021-04-11 오후 10.36.27.png)

image-20210411224538606

다음과 같이 Gradle 에서 의존성을 확인할 수 있다.

CLI로 빌드하기

다음처럼 build를 수행하면 프로젝트 하위에 build({project명}/build/ )가 생성된 것을 볼 수 있다.

/builds/libs 하위에 jar파일이 생성된 것을 볼 수 있으며,

로 스프링 서비스를 실행할 수 있다.

만약에 생성된 빌드를 지우고 싶으면 gradlew clean 을 수행하면된다.

Gradle vs Maven

  • Maven은 Build라는 동적인 요소를 XML로 정의하기에 어려운 부분이 많다.

    • 설정 내용이 길어지고 가독성이 떨어짐

    • 의존 관계가 복잡한 프로젝트 설정하기에 부적절

    • 상속 구조를 이용한 멀티 모듈 구현

    • 특정 설정을 소수의 모듈에서 공유하기 위해서는 부모 프로젝트를 생성하여 상속하게 해야함(상속의 단점)

  • Gradle은 Groovy DSL을 사용하기 때문에, 동적인 빌드는 빌드 스크립트로 플러그인을 호출하거나 직접 코드를 짤 수 있다.

  • Configuration Injection 방식을 사용해 공통 모듈을 상속해서 사용하는 단점 커버

  • 설정 주입시 프로젝트의 조건을 확인할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.

참고

Last updated

Was this helpful?