개발 공부/Spring

Gradle plugins vs dependencies

gmelon 2022. 6. 25. 16:37

이동욱님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 을 따라 진행하며 웹 앱을 개발하고 배포하는 전체 과정을 쭉 따라고 보고 싶었는데 첫 장부터 막혀버렸다..ㅋㅋ

start.spring.io에서 완성된 프로젝트 파일을 다운로드하여 import 해 사용하는 방식으로 공부해왔어서 gradle 설정에서 문제가 발생하니 해결하기가 어려웠다. (동욱님께서도 책에서 이러한 문제 때문에 직접 gradle 설정 파일을 작성해보기를 권장하신다.)

그래서 이 참에 평소 gradle 설정 파일에서 궁금했던 정보를 찾아 정리해봤다. 워낙 기능과 정보가 방대해서 지금 내 수준에서 필요한 정도로만 정보를 찾고 정리했다. 다른 때와 달리 최대한 gradle 공식 문서만을 참고하려고 노력했다..!

Gradle

  • Gradle은 오픈 소스 자동화 툴로 소스 코드와 의존관계가 있는 라이브러리 등을 빌드 하는데 필요한 일련의 작업을 자동으로 수행해주는 툴이다.

Gradle Wrapper

  • Gradle은 Gradle Wrapper라는 것을 통해 프로젝트를 다운 받아 개발을 수행하는 모든 개발자 및 CI 환경에서 매번 Gradle을 직접 설치하고 버전을 맞춰야 하는 번거로움을 해결한다.
  • Gradle Wrapper를 최초에 프로젝트에 생성하면 아래와 같은 파일들이 생성된다
    • gradle-wrapper.properties - 호스팅 서버, 빌드 버전 등 Gradle Distribution에 대한 정보 저장
    • gradle-wrapper.jar - Gradle Distribution을 다운로드 받기 위해 필요한 코드를 포함하는 .jar 파일
    • gradlew, gradlew.bat - Gradle Wrapper를 사용하여 빌드를 실행하기 위한 윈도우/쉘 스크립트
    • settings.gradle - 빌드 대상이 되는 프로젝트를 지정하는 Gradle 설정 파일
    • build.gradle - 특정 프로젝트의 gradle 설정 파일, dependency, tasks 등을 설정
      .
      ├── settings.gradle
      ├── gradle
      │   └── wrapper
      │       ├── gradle-wrapper.jar
      │       └── gradle-wrapper.properties
      ├── build.gradle
      ├── gradlew
      └── gradlew.bat
  • 이미 프로젝트에 Gradle Wrapper가 존재하는 경우 빌드 스크립트를 실행하면 아래와 같은 로직을 통해 빌드를 진행하게 된다.Untitled(출처 : https://docs.gradle.org/current/userguide/gradle_wrapper.html)

Plugins vs Dependencies

Plugins

  • Gradle 자체는 의도적으로 매우 적은 기능만을 제공한다.
  • 그 외 특정 도메인에 특화된 tasks들은 plugins을 통해 제공된다.
  • 즉, plugins는 Gradle에 기본적으로 포함되지 않는 tasks 들의 집합으로 build.gradle 파일에 아래와 같이 작성하여 불러올 수 있다.
    • plugins를 통해 자바 소스의 빌드, 소스 코드의 위치 명시, spring 프레임워크의 의존관계 관리 등의 tasks를 수행할 수 있음
    • 예를 들어 io.spring.dependency-management plugins를 사용하면 dependencies 에 라이브러리의 버전을 명시하지 않아도 현재 스프링 프레임워크의 버전과 그들의 버전 등등 관계를 고려하여 적절한 버전을 불러와준다.
      plugins {
      id 'org.springframework.boot' version '2.7.1'
      id 'io.spring.dependency-management' version '1.0.11.RELEASE'
      id 'java'
      }

Dependencies

  • 프로젝트에서 사용할 라이브러리 및 모듈과 그 버전을 정의하면 Gradle에서 자동으로 필요한 파일을 내려받아 사용할 수 있도록 하는 기능을 제공한다.
  • 예를 들어 아래와 같이 선언할 수 있다.
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
  • 선언 가능한 dependencies의 종류는 여러 가지가 있는데 대표적인 것들은 아래와 같다.
    • implementation - 컴파일과 런타임에 사용되는 dependency
    • compileOnly - 컴파일 시에만 필요한 dependency
    • runtimeOnly - 런타임에만 필요한 dependency
    • testImplementation - implementation과 동일하나 test에만 사용됨
    • testCompileOnly - compileOnly와 동일하나 test에만 사용됨
    • testRuntimeOnly - testRuntimeOnly와 동일하나 test에만 사용됨