우당탕탕 개발일지

Gradle(그래이들) 개념 및 특징 본문

개발

Gradle(그래이들) 개념 및 특징

kyunge_ev 2023. 3. 29. 21:02

Gradle(그래이들)이란?

유연성과 성능에 중점을 둔 오픈 소스 빌드 자동화 도구

Groovy Script 를 이용한 Build 자동화 시스템

같은 빌드 도구인 Ant, Maven의 장점을 모아 2012년에 출시 

Android OS의 빌드 도구로 채택

간결함 / 빠른 속도 / 유연성 / 확장성 / 다양하고 많은 문서화 등의 장점이 있음

📌 빌드 관리 도구 ( = Gradle / Maven / Ant )

  • 프로젝트에서 필요한 xml, properties, jar 파일들을 자동으로 인식하여 빌드해주는 도구
  • 빌드 되기전 미리 소스 코드를 컴파일, 테스트, 정적분석 등을 하여 실행가능한 앱인지 확인 및 빌드 실행을 해줌
  • 프로젝트의 정보 관리, 테스트 빌드, 배포 등의 작업을 해줌
    • 배포작업 ⇒ 배포가 되는 위치로 빌드 된 jar, war 파일을 제공해줌
  • 외부 라이브러리를 참조하여 자동으로 다운로드 및 업데이트 관리 해줌
    • 개발 된 제일 주된 목적
    • 개발 전엔 필요한 라이브러리가 있다면 모두 다운받아 라이브러리에 수동으로 추가해주고, 버전 업이 되었는지까지 개발자가 직접 확인하는 작업이 필요했다. ⇒ 이런 번거로운 부분을 빌드 관리 도구가 관리해줌

📌 Groovy 문법

  • JVM 위에서 동작하는 동적 타입 프로그래밍 언어
    • JVM 언어 중 하나로 DSL에 의한 확장성이 좋은 언어
  • Java와 유사한 문법 구조로 학습에 용이
    • Java처럼 소스 코드를 컴파일하여 클래스를 생성할 수도 있고, 컴파일을 거치지 않고 직접 실행할 수도있어 스크립트로 사용할 수 있음
  • Java 뿐 아니라 Python, Ruby 등에 많은 영향을 받은 프로그래밍 언어로 문법이 간결함
  • 대부분 Gradle Script를 작성하기 위해 사용되고 있음
    • Gradle Kotlin이 등장하고 나서는 Gradle Groovy를 Gradle Kotlin으로 많이 전환하는 추세임

Gradle 기능

  • Incremental Builds (증분 빌드)

Java Complie과 같은 내장 작업은 입력 집합(Java소스파일)과 출력 집합(class파일)을 선언 Gradle은 위의 정보를 사용하여 작업이 최신 상태이고, 작업을 수행해야하는지를 확인 입/출력이 변경되지 않은 경우 Gradle은 해당작업을 건너뛸 수 있음 ⇒ 불필요한 빌드를 또 할 필요가 없음

  • Build Caching (캐싱 구축)

작업이 다른 컴퓨터에서 이미 실행 된 경우 Gradle은 로컬에서 실행을 건너뛰고 대신 빌드 캐시에서 작업의 출력을 로드할 수 있음

  • Incremental Subtasks (증분 하위 작업)

Gradle은 빌드 실행 간에 작업의 입/출력이 변경되었음을 발견하면 작업이 다시 실행됨 task incremental API를 사용하여 어떤 파일이 변경되었는지를 알 수 있기 때문에 모두 빌드 할 필요없이 변경된 작업만 독립적으로 빌드할 수 있음

  • Incremental Annotation Processing (증분 주석 처리)
  • Parallel Execution(병렬 실행)

Worker API를 통해 작업 및 작업 내 작업의 병렬 실행을 허용함 ⇒ 병렬 처리는 매우 세분화되기 때문에 성능이 훨씬 빨라짐

  • Task timeouts (작업시간 초과)

모든 task에 실행 시간을 제한하는 데 사용되는 제한 시간 속성이 존재함 작업이 제한 시간에 도달하게 되면 해당 작업 실행 스레드가 중단되고 빌드가 완료될 수 있음

 Gradle 기본 구조

  • 모든 Gradle Script는 하나 이상의 Project로 구성됨 / 모든 Project는 하나의 task로 구성됨
    • Gradle Script > Project > task
      • Project
        • 소스를 jar로 모으거나, 자바 프로젝트를 컴파일 하거나, 테스트를 실행하고, 어플리케이션을 배포하는 등의 업무로 구성된다.
      • Task
        • 작업의 최소 단계
  • Gradle은 자바 6버전 이상의 JVM 환경에서 사용가능
  • Gradle 설치 또는 Gradle wrapper를 이용하여 실행환경을 구성

 Gradle 용어

  • /.gradle /gradle
    • gradle 버전별 엔진 및 설정 파일
  • /.idea
    • 에디터 관련 파일들
  • /gradlew /gradlew.bat
    • gradle 명령파일
    • gradlew : Unix용 실행 스크립트 / gradlew.bat : Windows용 실행 스크립트
  • /settings.gradle
    • 빌드할 프로젝트 정보 설정(트리형태로 멀티프로젝트 구성)
  • /build.gradle
    • 프로젝트 빌드에 대한 모든 기능 정의
    • 의존성이나 플러그인 설정 등을 위한 스크립트 파일
  • /src
    • 자바소스파일
  • /gradlew-wrapper.jar
    • Wrapper 파일
  • /gradle-wrapper.properties
    • Gradle Wrapper 설정 파일
  • Gradle Wrapper
    • 사용자가 Gradle을 설치하지 않았어도 Gradle tasks를 실행할 수 있도록 도움
    • 프로젝트 생성자와 사용자가 동일한 버전의 Gradle 사용할 수 있음

  • repositories
    • 라이브러리가 저장된 위치 등 설정
    • mavenCentral() : 기본 Maven Repository
  • dependencies
    • 라이브러리 사용을 위한 의존성 설정

 Gradle Life-Cycle

1. (Script)초기화 단계

Gradle의 Script 파일을 읽거나 Gradle의 도메인 객체가 생성되는 단계

  • Script 파일 확인 및 읽기
  • 멀티 or 싱글 프로젝트 판단 ⇒ settings.gradle 로 확인 ⇒ Setting 객체 생성
  • Setting 객체를 이용하여 각 프로젝트의 org.gradle.api.Project 객체 생성
  • 명령어 옵션 및 인수 설정

2. 구성 / 프로젝트 설정 단계

프로젝트를 빌드하기 위해 필요한 정보 및 자원들에 대한 설정이 이루어지는 단계

  • 참조 중인 라이브러리 확인 ⇒ build.gradle
  • build.gradle에 있는 task를 읽어 Task Container를 이용하여 task 객체 및 task 그래프 생성

3. task 실행 단계

그래프에서 대상이 되는 task를 확인하여 빌드를 실행

  • task 추출 및 실행

 Ant vs Maven vs Gradle

Ant

  • xml 기반의 빌드 스크립트
  • 빌드 기능만 가지고 있음
    • 그 외 기능은 개발자가 수동으로 관리 해줘야함
    • 라이브러리 추가 or 버전 관리등
  • 자유로운 빌드 단위 지정
  • 간단하고 사용하기 쉬움
  • Life-Cycle 없음

Maven

  • 자바의 대표적인 관리 도구
  • Ant를 대처하기 위해 개발
  • 프로젝트 외부 라이브러리를 쉽게 참조할 수 있게 pom.xml 파일로 명시하여 관리
  • 라이브러리 추가 시 해당 라이브러리가 참조되고 있는 다른 라이브러리까지 관리
  • Life-Cycle 도입
  • pom.xml로 편하게 라이브러리/의존성 관리

⇒ xml 기반의 빌드는 대규모 프로젝트로 갈 수록 복잡해짐

⇒ Life-Cycle이 중요한 이유?

  • 빌드의 순서를 지정할 수 있음
  • 빌드가 잘 못 된 경우 싹 밀고 새롭게 빌드를 할 수 있음

Gradle

  • Maven에 비해 더 빠른 처리 속도를 가지고 있음
  • 멀티 프로젝트(Multi-Project) 빌드에 최적화하여 설계
  • Maven에 비해 더 간결한 Script 구성이 가능함
    • 이유? Groovy 언어로 Script 작성하기 때문
    • xml로 스크립트를 작성하면 태그로 되어있기 때문에 태그 열고 닫고, 위상에 대한 정렬도 해줘야하기 때문에 Groovy로 작성한 스크립트 보다 복잡함
  • 아직까지는 메이븐이 점유율이 높지만 Gradle이 점점 치고 올라오는 추세
    • 지금까지 메이븐으로 빌드 관리를 해왔기 때문에 갑자기 변경되긴 어려운것
  • 대규모 프로젝트에서 성능이 좋음
    • 간략하고 간편한 스크립트 작성
    • 빌드 재사용 가능 ⇒ 빌드가 된건 패스하는 기능이 있음
  • Gradle을 설치할 필요없이 사용할 수 있음(⇒ Gradle Wrapper)
  • Maven : pom.xml / Gradle : build.gradle

 

 

 

 

📚 참고자료

https://www.youtube.com/watch?v=3Jp9kGDb01g

외부라이브러리 대표 사이트 : https://mvnrepository.com/

Gradle 공식 사이트 : https://docs.gradle.org/current/dsl/

 

Gradle DSL Version 8.0.2

A build script is made up of zero or more statements and script blocks. Statements can include method calls, property assignments, and local variable definitions. A script block is a method call which takes a closure as a parameter. The closure is treated

docs.gradle.org

Groovy : https://honeyinfo7.tistory.com/242

 

그레이들의 라이프 사이클과 그루비

이글은 오늘 아침에 공부한 그레이들의 내용을 정리한 글이다. 금일 오전에는 그레이들의 빌드 라이프 사이클과 그루비가 어떤 것인지 약간의 맛보기 형식으로 공부를 진행하였다. 그러면 정리

honeyinfo7.tistory.com