카테고리 없음

Gradle이란

salmon16 2024. 6. 3. 18:18

Gradle이란

거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 빌드 자동화 도구 

 

빌드 자동화 도구

소스코드를 컴파일하고 의존성을 추가해 실행 가능한 파일. jar,. war로 패키징을 해주어야 한다.

즉 소스 코드를 실행 가능한 파일로 변환해 주는것을 빌드라고 한다.

 

빌드 도구는 코드를 실행 가능한 파일로 만들어주는 과정 및 라이브러리 관리, 테스팅 등을 자동화하여 수행한다.

 

빌드 도구를 사용하지 않을 때 문제점

  1. 반복적인 작업을 수작업으로 진행해야 하므로 비효율적이다.
  2. 라이브러리를 직접 다운로드 및 버전 업데이트를 해야한다.
  3. 프로젝트의 의존성을 파악하기 어렵다.

APACHE ANT

  • 기본적인 컴파일, 패키징, 배포 작업 수행 가능
  • XML 기반의 스크립트 사용
  • 작성에 정해진 규칙이 없어 유연성을 가짐
  • 라이브러리 의존관계를 정의하는 구조의 부재
  • 정해진 규칙이 없어 유지보수가 어렵다.

Maven

  • 정해진 라이프 사이클에 따라 빌드 진행
  • pom.xml 파일 사용
  • 라이브러리 의존성 자동 관리 기능 추가
  • xml파일 기반으로 가독성이 좋지 않음
  • 상속 구조를 이용한 멀티 모듈 구현
  • 의존관계가 복잡한 프로젝트에는 부적

Gradle

Groovy 기반의 스크립트 언어

스크립트 언어

  • 동적으로 실행 가능
  • 추가적인 로직을 작성하고 싶을 때 스크립트 로직을 직접 작성할 수 있다.
  • Gradle이 지원하는 플러그인을 호출할 수도 있다.

Groovy 기반의 DSL

  • Groovy 기반으로, 자바와 유사한 문법 구조를 가지며 Java와 호환된다.
  • JVM에서 실행되는 스크립트 언어 (Groovy)

 

plugins

plugins이란 특정 작업을 위해 모아놓은 task들의 묶음이다.

plugins에 java를 추가하면 컴파일, 의존성 추가, 테스트 등 반복된 일을 자동으로 해준다

 

dependencies

프로젝트에서 사용하는 라이브러리나 패키지를 의존성이라고 한다.

프로젝트별로 어떤 의존성을 갖는지 명시해 주어야 한다.

라이브러리를 추가하는 시점을 설정할 수 있다.

  • implementation : 런타임 + 컴파일 시점 모두사용
  • complieOnly : 컴파일할 때만 사용되고 런타임 때는 미사용
  • runtimeOnly : 런타임 때에만 사용
  • testImplementation : 테스트할 때만 사용

repositories

repositories는 라이브러리가 저장된 위치를 정의한다.

대표적으로 Maven Central(), Jcenter(), Google Android()등이 있다.

라이브러리의 저장소를 명시해 주면 Gradle이 해당 저장소에서 필요한 라이브러리를 가져온다.

 

Gradle Build Cache

  • 빌드 결과물을 캐싱하여 재사용한다.
  • 라이브러리 의존성을 캐시로 저장 후 이전에 다운로드한 라이브러리를 재사용한다. 

Gradle 점진적 빌드

  • 마지막 빌드 호출 이후 변경된 부분만 빌드한다.
  • 변경되지 않은 부분은 캐시 결과를 검색해 재사용한다.
  • 태스크의 입력, 출력 혹은 변경되지 않은 부분은 빌드하지 않는다.

Gradle 데몬 프로세스 사용

  • 데몬 프로세스란 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스이다.
  • 초기 빌드 이후 빌드 실행 시 초기화 작업을 거치지 않는다.
  • 초기 빌드된 결과물을 데몬 프로세스에 저장 후 이후 빌드를 진행하면 데몬 프로세스에서 결과물을 가져와 진행한다.
  • 이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 매우 적은 시간만 소요된다.

멀티프로젝트에서의 활용

멀티 프로젝트란 공통되는 도메인을 사용하는 프로젝트를 하나의 프로젝트로 묶어서 관리하는 것이다.

Gradle은 각 프로젝트가 공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에서 사용할 수 있다.

Configuration Injection

  • 필요한 정보를 직접 프로젝트에 주입하는 방식이다.
  • 공통되는 정보는 묶어서 주입 가능하다.
  • 프로젝트별로 설정을 다르게 주입 가능하다.
  • Maven의 상속 구조와 비교했을 때 가독성 측면에서 우월하다.