Gradle

황희윤·2023년 10월 12일

Gradle

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

개발자가 짠 소스 코드는 컴퓨터가 바로 이해를 할 수 없다.

따라서 소스 코드를 컴파일하고 라이브러리 의존성을 추가한 뒤, jar이나 war과 같은 실행 가능한 파일로 패키징 해야 실행 가능하다.

소스 코드를 실행 가능한 파일로 변환하는 과정을 빌드라고 한다.

🛠 빌드 도구의 역할

  • 빌드 : 소스 코드를 실행 가능한 파일로 만들기
  • 라이브러리 관리
  • 환경 변수 관리
  • 테스트
  • 배포

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

  • 라이브러리를 직접 다운로드 해줘야 되고 버전도 매번 업데이트 해야 하며, 버전 충돌이 날 가능성도 높다.
  • 빌드와 테스트 작업을 수동으로 수행해야 한다.
  • 프로젝트의 의존성을 파악하기 어렵다.

스크립트 언어로써 가지는 장점

  • 동적으로 실행 가능(소스 코드를 컴파일하지 않고 직접 실행)
  • 추가적인 로직을 작성하고 싶을 때 스크립트 로직을 직접 작성 가능하다.

Groovy

  • JVM 상에서 실행되는 스크립트 언어
  • 자바와 매우 유사해 자바와 호환성이 좋다.

📚 Gradle 구성

Plugin

  • 특정 작업을 위해 모아놓은 task들의 묶음
  • 보통 자바를 빌드할 때 컴파일을 하고 dependency를 추가하고 테스트를 하는 과정이 필요한데 자바 파일을 만들 때마다 매번 해줄 수 없기에 자바 플러그인을 사용한다.

의존성 관리(Dependencies Configuration)

Gradle Dependencies에서 라이브러리를 추가하는 시점을 설정할 수 있다. 왜냐하면 특정 시점에서 불필요한 라이브러리를 추가하는 것은 비효율적이기 때문이다.

Dependencies Configuration의 네 가지 종류

  1. implementation : 런타임과 컴파일 시점 모두에서 사용
  2. compileOnly : 컴파일 시점에서만 사용
  3. runtimeOnly : 런타임 시점에서만 사용
  4. testImplementation : 테스트할 때에만 사용

Repository

  • 라이브러리(모듈)가 저장된 위치
  • 대표적인게 mavenCentral()
  • 라이브러리의 저장소를 명시해주면 Gradle이 해당 저장소에서 필요한 라이브러리를 가져온다.

Gradle 특징

1. 뛰어난 성능 (빠른 빌드 속도)

  • 빌드 캐시 (Build Cache)

    • 빌드 결과물을 캐싱하여 재사용
    • 라이브러리 의존성을 캐시로 저장 후 다시 재사용하기 때문에 시간 단축
  • 점진적 빌드 (Incremental Build)

    • 마지막 빌드 이 후에 변경된 부분만 빌드
    • 변경되지 않은 부분은 캐시에서 재사용
    • 빌드 시작하기 앞서서 어떤 파일들이 수정, 변경되었는지 감지한다.
    • 변경 사항이 없는 경우, 자바 컴파일을 하지 않는다.
  • 데몬 프로세스 (Daemon Process)

    • 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스
    • 서비스의 요청에 응답하기 위해 오래 살아있는 프로세스
    • 초기 빌드 뒤에 다시 초기화하지 않아서 성능이 좋아진다.
    • 다음 빌드부터는 매우 적은 시간만 소요됨

2. 멀티 프로젝트

  • 필요성

    • 만약 관리자 프로젝트와 회원 프로젝트가 나눠져 있으면서 각각의 똑같은 멤버 클래스를 가지고 있을 때, 관리자 프로젝트의 멤버 클래스에서 변경이 일어나면 똑같이 회원 프로젝트의 멤버 클래스에서도 변경이 일어나야 한다.
    • 이런 번거로움을 없애기 위해, 공통되는 도메인을 사용하는 프로젝트를 하나의 프로젝트로 묶어서 관리한다.
    • Gradle은 각 프로젝트가 공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에 사용 가능하도록 한다.
  • 예시

    • root 프로젝트에서는 관리자 프로젝트와 회원 프로젝트가 같이 있고, 두 프로젝트가 공통으로 사용하는 클래스들을 모은 모듈이 있다.
    • settings.gradle에 하위 프로젝트 두 개와 공통 모듈 하나를 include 시킨다.
    • build.gradle에서는 각 프로젝트가 어떤 모듈을 사용하는지에 대해서 의존성을 추가해준다.
    • root 프로젝트는 관리자 프로젝트와 회원 프로젝트를 묶는 역할만 하지 main이 아니기 때문에 jar 파일 생성을 비활성화 시킨다.

3. 설정 주입(Configuration Injection)

  • 정의 : 필요한 라이브러리를 프로젝트에 주입

  • Maven의 상속 구조보다 가독성과 재사용성이 더 좋다(Groovy의 장점).
  • 프로젝트 별로 설정을 다르게 할 수 있다.
profile
HeeYun's programming study

0개의 댓글