Build Management Tool
글을 쓰게 된 계기
빌드 통합도구 란 무엇이고 Gradle과 Maven은 어떤 차이가 있는지 알아보자.
이 주제는 우연찮게 포스팅하게 되었다. 계기는 개발자들과 술자리에서 각자 회사에서 면접 질문을 이야기 하다가 나왔다.
여러 질문들을 말했지만 가장 인상 깊었던 것은 Gradle, Maven 둘의 차이점이 뭔가에 대한 질문이었다.
그래서 술먹었지만 궁금하기도하고 정리하고 자고 싶어서 늦은 시간 컴퓨터를 켜고 정리를 해보자.
기억날 때 바로 실행하자 !! Just do it !
막상 Gradle과 Maven을 찾아 보면서 느낀점은 Build Management tool을 먼저 알아야지 더 잘 알 수 있을 것 같아서 차근 차근 알아가 보자.
- 정리 순서
- 1. Build Management tool
- 2. Maven
- 3. Gradle
소프트웨어 빌드 도구
빌드 도구 소스 코드에서 실행 가능한 애플리케이션 생성을 자동화하는데 사용한다.
종속성 다운로드, 코드 컴파일 및 패키징, 테스트 실행 및 배포와 같은 다양한 작업을 스크립팅하거나 자동화한다.
Command Line, IDE 내부 또는 리포지토리에서 코드를 체크아웃하고 빌드 머심으로 확인 후 지속적인 통합 도구를 통해 trigger할 수 있다.
- 종속성 다운로드
- 코드 컴파일 및 패키징
- 테스트 실행
- 프로덕션 시스템에 배포
언어마다 다른 빌드 시스템이 존재한다. 일반적으로 빌드 시스템은 도메일별 언어 또는 XML을 사용하여 빌드를 지정한다.
빌드 프로세스 유형 3가지
- CI(지속적 통합) 빌드(Continuous Integration (CI) builds)
- 모든 개발자가 릴리스 전 마지막 순간에 체크인을 시도할 때 호환되지 않거나 버그가 있는 코드로 인한 통합 문제를 방지한다. 배포에는 실행할 수 있도록 단순히 코드를 준비하는 것이 포함되지만 CI빌드에는 테스트 제품군에 대해 코드를 실행하는 작업이 포함된다.
- 게이트 체크인 빌드(Gated check-in builds)
- 게이트 체크인 빌드는 Gated commit 이라고 불린다. 이 것은 개발자가 공유 메모라인에 변경 사항을 커밋하기 전에 CI서버에서 게이트 커밋을 요청해야 하는 소프트웨어 통합 패턴이다. 그렇게 하면 변경 사항이 실제로 커밋되기 전에 빌드가 중단되는지 여부를 관찰할 수 있다.
- 야간 빌드 (Nightly Builds)
- Nightly Builds는 예약 빌드라고도 불린다. 빌드는 매일 예정된 시간에 수행된다. 이 프로세스는 일반적으로 야간에 발생하므로 업무 외 시간에 빌드 컴퓨터에서 코드를 컴파일하고 다음 날 아침 개발자가 테스트할 수 있다.
빌드 도구란 ?
최신 빌드 자동화 도구는 단순히 코드르 컴파일 하는 것이 아니다.
소스코드를 얻고, 테스트할 실행 파일을 배포하고, 복잡한 빌드 프로세스를 최적화하여 워크플로를 활성화한다. 모든 종류의 장단점이 있는 빌드 도구가 있다.
일반적으로 특정 언어를 기반으로 한다.
예를 들어 Maven과 Ant는 XML기반 도구이고 Grunt는 Json기반, sbt는 Scala기반 도구이다.
빌드 도구 기능
- 임시 명령 실행
- 종속성을 기반으로 명령 실행 순서 지정
- 다른 명령 병렬화
- 파일 변경 사항 감독 및 변경 사항을 기반으로 명령 실행
- 컴파일러와 같은 외부 프로세스 사용
- 구성 및 재구성 허용
- 종속성 다운로드
빌드 도구의 이점
- 간단히 프로젝트를 빌드 할 수 있고 수동으로 실행하는 단계에서 발생하는 오류가 줄어 들고 프로세스의 일관성도 높아진다.
- 자동화된 빌드를 통해 팀이 문제가 발생했을 때 거의 즉시 오류에 대한 책임이 있는 사람을 알 수 있다.
- 여러 상호 의존적인 프로젝트가 있는 환경에서 특히 중요하므로 사람들이 다른 프로젝트에서 동시에 작업할 때 아무 것도 손상되지 않도록 한다.
- 외부 그룹(고객 사이트 등)은 안정적인 빌드를 선택하여 제품 또는 기능이 아직 진행 중인 동안 사용할 수 있다.
빌드 도구에 대해서 잠깐 보았다.
이제 구체적인 Tool을 알아보자..
세대가 있는지는 모르겠지만 시대별로 대표적인 것들(아래 것들 말고도 더 많다. 하지만 글쓴이가 아는 것들만 쓰겠다.. 점점 알게되면 추후 포스팅을 하겠다.)
1. Make
- Unix 개열 운영체제에서 사용되었다.
- 참고
2. Ant
- appche에서 만듬
- Make에서 Java를 사용하기 어려움 → 대안 : Ant
- 크로스 플랫폼에 대응하기 위해서 범용성을 높였다.
- 빌드 파일에 설명된 프로세스를 서로 종속된 대상 및 확장 지점으로 구동하는 것이 목적
- Java library 및 Command Line Tool 이다.
- Java로 작성되었다.
- 참고
이제 이 글의 주인공들을 소개해보겠습니다.
3. Maven
이디시어 단어인 Maven
은 ‘지식의 축적’을 의미한다. Maven은 Jakarta Tubine 프로젝트의 빌드 프로세스를 단순화하려는 시도로 시작되었다고 한다.
Maven 이 나오기 전에 Ant 는 각각 다른 고유한 Ant 빌드 파일이었다고 한다.
제작자들은 프로젝트를 구축하는 표준 방법, 프로젝트 구성에 대한 명확한 정의 , 프로젝트 정보를 게시하는 쉬운 방법, 여러 프로젝트에서 JAR을 공유하는 방법이 필요하다고 느꼈다고 한다.
그 결과로 모든 Java 기반 프로젝트를 빌드하고 관리하는 데 사용할 수 있는 도구 Maven이 만들어 졌다고 한다.
- Maven이 만들어진 목표
- 빌드 프로세스를 쉽게 만들기
- unifrom 빌드 시스템 제공
- Maven은 프로젝트 개체 모델(POM)과 플러그인을 사용하여 프로젝트를 빌드한다.
- Maven 프로젝트에 익숙해지면 모든 Maven 프로젝트가 어떻게 빌드되는지 알 수 있다. → 시간 비용이 절약된다.
- 프로젝트 정보 제공
- Maven은 부분적으로 POM에서 가져오고 부분적으로 프로젝트 소스에서 생성된 유용한 프로젝트 정보가 제공한다.
- 소스제어에서 직접 생성된 로그 변경 (Change log created directly from source control)
- 상호 참조 소스 (Cross referenced sources)
- 프로젝트에서 관리하는 메일링 리스트(Mailing lists managed by the project)
- 프로젝트에서 사용하는 종속성(Dependencies used by the project)
- 커버리지를 포함한 단위테스트 보고서(Unit test reports including coverage)
- Maven은 부분적으로 POM에서 가져오고 부분적으로 프로젝트 소스에서 생성된 유용한 프로젝트 정보가 제공한다.
- Encouraging better development practices → 😅😅
- Maven 기능 요약
- 프로젝트 또는 모듈 간단하게 시작
- 모든 프로젝트에서 일관된 사용
- 자동 업데이트, 종속성 폐쇄(전이적 종속성이라고도 불린다)를 포함한 우수한 종속성 관리
- 여러 프로젝트를 동시에 쉽게 작업 기능
- 즉시 사용할 수 있는 대규모 라이브러리 및 메타데이터 리포지토리, 최신 릴리스의 실시간 가용성을 위한 최대 규모의 오픈 소스 프로젝트 배치
- Java 또는 스크립팅 언어로 플러그인을 쉽게 작성할 수 있는 기능으로 확장 기능
- 추가 구성이 거의 또는 전혀 없이 새로운 기능에 즉시 액세스
- Maven 외부의 종속성 관리 및 배포를 위한 Ant 작업
- 모델 기반 빌드
- Maven은 대부분의 경우 스크립티을 수행할 필요 없이 프로젝트에 대한 메타데이터를 기반으로 하는 JAR, WAR 또는 배포와 같은 사전 정의된 출력 유형으로 여러 프로젝트를 빌드할 수 있다.
- 일관적 프로젝트 정보 사이트
- 빌드 프로세스와 동일한 메타데이터를 사용하여 Maven은 추가하려는 문서를 포함하는 웹 사이트 또는 PDF를 생성할 수 있으며 프로젝트 개발 상태에 대한 표준 보고서에 추가한다.
- 릴리스 관리 및 배포 게시
- 많은 추가 구성 없이 Maven은 소스 제어 시스템(Subversion 또는 Git과 같은)과 통합되고 특정 태그를 기반으로 프로젝트 릴리스를 관리합니다. 다른 프로젝트에서 사용할 수 있도록 배포 위치에 이를 게시할 수도 있다.
- Maven은 JAR와 같은 개별 출력, 다른 종속성 및 문서를 포함하는 아카이브 또는 소스 배포로 게시할 수 있다.
- 종속성 관리
- Maven은 JAR 및 기타 종속성의 중앙 저장소 사용을 권장한다.
- Maven은 프로젝트의 클라이언트가 Perl의 CPAN과 같은 중앙 JAR 저장소에서 프로젝트를 빌드하는 데 필요한 모든 JAR을 다운로드하는 데 사용할 수 있는 메커니즘과 함께 제공됩니다. 이를 통해서 Maven 사용자는 프로젝트 간에 JAR을 재사용할 수 있고 프로젝트 간 통신을 장려하여 이전 버전과의 호환성 문제가 처리되도록 할 수 있다.
참고
4. Gradle
Gradle은 거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연하도록 설계된 오픈 소스 빌드 자동화 도구이다.
**Overview**
- High performance(고성능)
- Gradle은 입력 또는 출력이 변경되어 실행해야 하는 작업만 실행하여 불필요한 작업을 방지한다.
- 빌드 캐시를 사용하여 이전 실행 또는 다른 시스템(공유 빌드 캐시 사용)의 작업 출력을 재사용할 수 있다.
- JVM foundation(JVM 기초)
- Gradle은 JVM에서 실행되기 때문에 반드시 JVM이 있어야한다.
- 사용자 정의 작업 유형 및 플러그인과 같은 빌드 로직에서 표준 Java API를 사용할 수 있으므로 Java플랫폼에 익숙한 사람에게는 이점이다.
- Gradle은 JVM 프로젝트 빌드에만 제한되지 않으며 기본 프로젝트 빌드 지원가 함께 패키지로 제공된다.
- Conventions(규약)
- Gradle은 Maven의 일부를 가져와서 규칙을 구현하여 Java 프로젝트와 같은 일반적인 유형의 프로젝트를 쉽게 구축할 수 있다.
- 플러그인을 적용하면 많은 프로젝트에서 슬림한 빌드 스크립트로 쉽게 끝낼 수 있다. 하지만 이러한 규칙이 제한되진 않는다.
- Gradle은 규칙을 재정의할 수 있고 고유한 작업을 추가할 수도 있고 규칙 기반 빌드에 다른 많은 사용자 지정을 수행할 수 있다.
- Extensibillty(확장성)
- Gradle을 쉽게 확장하여 고유한 작업 유형을 제공하거나 모델을 빌드할 수 있다.
- IDE 지원
- Android Studio, IntelliJ IDEA, Eclipse 및 NetVBeans와 같은 여러 주요 IDE를 사용하여 Gradle 빌드를 가져와 상호 작용할 수 있다.
- Insight
- build scans은 빌드 문제를 식별하는 데 사용할 수 있는 빌드 실행에 대한 광범위한 정보를 제공한다.
- 빌드 성능과 관련된 문제를 식별하는 데 특히 유용하다. 빌드 스캔을 다른 사람과 공유할 수도 있다. 이것은 빌드 문제를 해결하기위해 누군가에게 물어볼 때 유용하다.
Gradle에 대해 알아야할 5가지
1. Gradle은 범용 빌드 도구
- Gradle을 사용하면 빌드하려는 대상이나 수행 방법에 대해 거의 가정하지 않기 때문에 모든 소프트웨어를 빌드 할 수 있다.
- 빌드를 만들기 위해 많은 작업을 수행해야 한다는 의미는 아니다. 플러그인을 통해 규칙 및 미리 빌드된 기능 계층을 추가하여 일반적인 유형의 프로젝트(ex. Java library)를 쉽게 빌드 할 수 있다.
- 사용자 지정 플러그인을 만들고 게시하여 고유한 규칙을 캡슐화하고 기능을 빌드할 수도 있다.
2. 핵심 모델은 작업(task)을 기반으로 한다.
Gradle은 빌드를 작업(작업의 단위 - units of work)의 방향성 비순환 그래프(DAG)로 모델링 한다. 앞의 말에 뜻은 빌드가 기본적으로 작업 세트를 구성하고 종속성을 기반으로 함께 연결하여 해당 DAG를 생성한다는 뜻이다.
task 그래프가 생성되면 Gradle은 어떤 작업을 어떤 순서로 실행해야 하는지 결정한 다음 실행을 진행한다.
- Gradle 작업 그래프의 두 가지 예시
일반 작업 그래프
표준 Java 빌드에 대한 부분 작업 그래프
거의 모든 빌드 프로세스를 이러한 방식으로 작업 그래프로 모델링할 수 있으며, 이것이 Gradle이 매우 유연한 이유 중 하나이다.
Task의 구성
- Actions - 파일 복사 또는 소스 컴파일과 같은 작업을 수행하는 부분
- Inputs - 작업(actions)이 사용하거나 작동하는 값, 파일 및 디렉토리
- Outputs - 작업(actions)이 수정하거나 생성하는 파일 및 디렉토리
3. Gradle에는 몇 가지 고정 빌드 단계가 있다.
- Gradle은 세 단계로 빌드 스크립트를 평하고 실행한다는 것을 이해하는 것이 중요하다.
초기화
빌드를 위한 환경을 설정하고 참여할 프로젝트를 결정한다.구성
빌드에 대한 작업 그래프를 구성 및 구성한 다음 사용자가 실행하려는 작업을 기반으로 실행해야 하는 작업과 순서를 결정한다.실행
구성 단계가 끝날 때 선택한 작업을 실행한다.
이러한 단계는 Gradle의 빌드 수명 주기
를 형성한다.
Gradle 수명 주기 작업
4. Gradle은 여러 가지 방법으로 확장할 수 있다.
Gradle과 함께 번들로 제공되는 빌드 로직만 사용하여 프로젝트를 빌드할 수 있다면 좋지만 거의 불가능하다고 한다. 대부분의 빌드에는 사용자 지정 빌드 논리를 추가해야 하는 몇 가지 특별한 요구사항이 있다.
Gralde 확장할 수 있는 몇 가지
- 사용자 정의 작업 유형
- 빌드가 기존 작업이 할 수 없는 일부 작업을 수행하도록 하려면 고유한 작업 유형을 작성하기만 하면된다. 일반적으로 사용자 정의 작업 유형에 대한 소스 파일을
buildSrc
디렉토리 또는 패키지된 플러그인에 넣는 것이 가장 좋다. 그런 다음 Gradle에서 제공하는 것과 마찬가지로 사용자 지정 작업 유형을 사용할 수 있다.
- 빌드가 기존 작업이 할 수 없는 일부 작업을 수행하도록 하려면 고유한 작업 유형을 작성하기만 하면된다. 일반적으로 사용자 정의 작업 유형에 대한 소스 파일을
- Custom task actions
Task.doFirst()
및Task.doLast()
메서드를 통해 작업 전후에 실행되는 사용자 지정 빌드 논리를 연결할 수 있다.
- 프로젝트 및 작업에 대한 추가 속성
- 추가 속성은 Gradle의 핵심 플러그인에서 생성한 것과 명시적으로 생성하지 않은 작업에도 적용할 수 있다.
- 사용자 지정 규칙
- 규칙은 사용자가 더 쉽게 이해하고 사용할 수 있도록 빌드를 단순화하는 방법이다.
- Java builds와 같은 표준 프로젝트 구조 및 이름짓는 규칙을 사용하는 빌드에서 불 수 있다.
- 커스텀 모델
- Gradle을 사용하면 작업, 파일 및 종속성 구성을 새로운 개념을 빌드에 도입할 수 있다.
- 빌드 프로세스의 적절한 모델링은 빌드의 사용 용이성과 효율성을 크게 향상 시킬 수 있다.
5. API에 대해 작동하는 빌드 스크립트
- Gradle의 빌드 스크립트를 실행 가능한 코드로 보는 것은 쉽다. 하지만 그것은 구현 세부사항이다. 잘 설계된 빌드 스크립트는 해당 단계가 작업을 수행하는 방법이 아니라 소프트웨어를 빌드하는 데 필요한 단계를 설명한다.
빌드 관리 툴 글을 회고하며…
이건 이상하게 이해가 엄청 안된다. 중간 중간에 좀 어려운 단어가 있고 그걸 또 공부하려면 엄청난 양의 문서가 나온다.. 허 … 이걸 어떻게 … 할지 모르겟다. 우선 첫 술에 배부를 수 없다. 간략하게라도 정리하고 세부적으로 가지를 뻗어 나가야겠다.
누군가 빌드 관리 툴이 뭐야 ? 라고 조오금 설명할 자신있는가 ? 허허 없다…… 그런 질문이 들어올 때마다 집와서 정리한 것을 보고 부족한 점을 정리하고 계속 나의 무능력함의 허물을 벗어나가보자.. ㅋㅋㅋㅋ
다음 포스팅은 Maven VS Gradle 하려고한다. 이게 원래 주 포인트였는데 하나하나 알아가려다가 문서의 바다에 빠지게 되었다.