ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 빌드 관리 도구, 예제와 함께 Gradle 알아보기
    📖 개발 공부 2024. 1. 21. 11:00

    프로젝트에서 gradle이 어떻게 돌아가는지 이해도를 높이기 위해 글을 작성해보겠다.

    일단, 공식 문서 내용이 너무 많아서 🥲 프로젝트에 적용했던 설정들을 토대로 정리해보려고 한다.

    Gradle 이란?

    gradle은 오픈소스 빌드 자동화 툴이다.

     

    어떤 플랫폼에서든 소프트웨어를 구축, 테스트, 게시 및 배포하는 경우 gradle은 코드 컴파일 및 패키징부터 웹 사이트 게시까지 전체 개발 수명주기를 지원할 수 있는 유연한 모델을 제공한다.

    • 컴파일(Compile): Gradle은 Java 파일을 바이트코드로 컴파일하는 과정을 자동화한다.
    • 테스트(Test): 어플리케이션이 예상대로 정상 작동하는지 확인하는 자동화된 테스트를 수행한다.
    • 패키징(Packaging): JAR 또는 WAR 파일과 같은 배포 가능한 형태로 애플리케이션을 패키징한다.
    • 배포 및 실행(Deploy & Run): 컴파일된 애플리케이션을 서버에 배포하고 실행한다.

     

    또한 증분 빌드(Incremental Builds)와 캐싱 메커니즘을 활용하여 빌드 시간을 최소화한다.

     

    repository 살펴보기

    repository는 라이브러리 검색 및 다운로드할 저장소이다. 이를 통해 프로젝트에서 필요한 의존성을 다운받을 수 있다.

     

    Maven Central repository

    repositories {
        mavenCentral()
    }
    

     

    mavenCentral은 Maven Central 저장소를 가리킨다.

    이를 통해 프로젝트에서 필요한 라이브러리를 Maven Central 저장소에서 다운로드 받을 수 있다.

     

    예를 들어,

    // repositories {
    //     mavenCentral()
    // }
    
    dependencies {
        implementation("org.springframework.boot:spring-boot-starter-web:_")
    }
    

    위와 같이 mavenCentral이 주석처리되면, 위 의존성을 찾을 수 없어 빌드가 실패한다.

     

    Google Maven repository

    repositories {
        google()
    }
    

    이는 google의 maven 저장소를 참조하는 데 사용된다. 주로 Android 개발에 필요한 라이브러리와 플러그인을 제공한다.

     

    Custom repository by URL

    repositories {
        maven {
            url = uri("<https://repo.spring.io/release>")
        }
    }
    

     

    Gradle에서 사용자 정의 저장소에서도 의존성을 다운로드를 받을 수 있다.

    다음과 같은 상황에서 쓰일 수 있다.

    • 특정 라이브러리나 플러그인이 표준 저장소에 없고 특정한 URL을 가진 저장소에만 호스팅되어 있는 경우
    • 회사나 조직 내부에서 자체적으로 관리하는 라이브러리를 사용하는 경우

     

     

    Configuration 살펴보기

    참고

     

    Gradle 프로젝트에서 선언된 모든 의존성은 사용되는 특정 범위를 가진다.

    어떤 의존성은 컴파일할 때에만 사용될 수 있고, 다른 의존성은 런타임할 때에 사용될 수 있다.

     

    옵션들을 살펴보자.

    • Implementation: 컴파일 및 런타임에만 사용된다. (이는 api와 implementation 차이를 알아볼 때 자세히 설명하겠다.)
    • compileOnly: 컴파일에만 사용되고, 런타임엔 사용되지 않는다.
      compileOnly("org.projectlombok:lombok")
      

      Lombok은 개발자가 반복적인 코드(예: getter, setter, toString 등)를 작성하지 않도록 도와주는 라이브러리인데, 이는 코드 생성을 위해 컴파일 시에만 사용된다.
    • runtimeOnly: 런타임에만 사용되고, 컴파일엔 사용되지 않는다.
      runtimeOnly("com.h2database:h2")

      H2는 인메모리 SQL 데이터베이스로, 주로 개발 및 테스트 환경에서 사용된다. 애플리케이션이 실행될 때만 필요하며, 컴파일 시에는 필요하지 않다.


      compileOnly, runtimeOnly 옵션을 통해서 불필요한 라이브러리를 배포 파일에 포함시키지 않음으로써 애플리케이션 패키징 크기를 줄일 수 있다.
    • testImplementation: Implementation과 동일한 테스트용 옵션이다.
    • testCompileOnly: compileOnly과 동일한 테스트용 옵션이다.
    • testRuntimeOnly: runtimeOnly과 동일한 테스트용 옵션이다.

     

    api와 implementation의 차이

    의존성 범위를 설정할 때 이 둘을 헷갈릴 때가 종종 있었다. 이제 더이상 헷갈리지않겠노라!! 작성해본다.

    • api
      모듈의 공개 API에 포함되며, api로 선언된 이 모듈을 사용하는 다른 모듈에 의해 직접 사용될 수 있다. 그렇기 때문에 의존성이 변경될 때마다 모듈의 소비자들도 재컴파일해야한다.
    • implementation
      해당 모듈의 내부 구현에만 영향을 미치므로, 의존성이 변경되어도 다른 모듈에 영향을 주지 않고 해당 모듈만 재빌드된다.
      implementation 의존성은 모듈 내부에서만 사용되고, 모듈의 API를 구성하는 데에는 포함되지 않는다. 즉, 외부에 노출되지 않는다.또한 implementation 의존성은 외부에 노출되지 않아, 의도치 않은 API 노출을 방지할 수 있다.

     

    https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph

    즉, api는 외부에 노출되어야 할 의존성에 사용되며, 변경 시 다른 모듈에 영향을 줄 수 있다. 반면, implementation은 모듈 내부에서만 필요한 의존성에 사용되며 빠른 빌드 시간을 제공한다.

     

    plugins

    참고

     

    Gradle의 plugins 블록은 프로젝트 빌드에 필요한 플러그인들을 선언하는 곳이다. 플러그인은 Gradle 빌드 과정에 추가적인 기능을 제공한다.

    또한 apply 구문을 통해 필요에 따라 선택적으로 적용할 수 있다. 이는 프로젝트의 빌드 프로세스를 효율적이고 유연하게 만들게 한다.

    plugins {
        // Java 프로젝트를 빌드하는 데 필요한 표준 작업과 설정 제공
        java 
        // IntelliJ IDEA용 설정을 자동화하는 플러그인
        idea 
        // springboot 애플리케이션의 빌드와 실행을 간편하게 만들어 줌.
        // apply false: 필요한 경우에만 사용하기 위함.
        id("org.springframework.boot") apply false
    }

     


     

     

    잘 알지 못하고 넘어갔던 구문들을 하나씩 살펴보니까 빌드 과정이 어떻게 돌아가는지 더 잘 이해하게 되었다. 

    근데 공식 문서 양이 어마무시해서 내가 정리한 내용들은 정말 극소수의 내용일 수 있다. 

     

    최소한 쓰고 있는 구문들은 다 숙지할 수 있도록, 또 빌드 스크립트를 스스로 작성할 수 있게끔 이해하도록 해보아야곘당!

    728x90
    반응형

    댓글

Designed by Tistory.