티스토리 뷰

반응형

Gradle이란?

Gradle은 오픈소스 빌드 자동화 툴이다. Gradle은 거의 모든 타입의 소프트웨어를 빌드할 수 있는 유연함을 가진다.

 

Gradle의 특징

1. High performance

Gradle은 실행시켜야 하는 task만 실행시키고 다른 불필요한 동작은 하지 않는다. 또, build cache를 사용함으로써 이전 실행의 task output을 재사용할 수 있다. 심지어 서로 다른 기계에서도 build cache를 공유하여 성능을 높일 수 있다.

2. JVM foundation

Gradle은 JVM에서 실행되고, JVM을 사용하려면 JDK를 설치해야 한다. 따라서 Java Standard API를 빌드 로직에 사용할 수 있다. 또한 Gradle을 다양한 플랫폼에서 실핼할 수 있다.

3. Conventions

Gradle은 Maven으로부터 의존 라이브러리 관리 기능을 차용했다. 따라서 컨벤션을 따라 Java 프로젝트와 같은 일반적인 유형의 프로젝트를 쉽게 빌드할 수 있다. 그리고 필요하다면 컨벤션을 오버라이딩하거나 task를 추가하면서 컨벤션 기반의 빌드를 커스터마이징 할 수 있다.

4. Extensibility

Gradle을 확장하면 고유의 task 타입을 제공하거나 모델을 빌드할 수 있다.

5. IDE, Build Scan support

Android Studio, IntelliJ IDEA, Eclipse 등의 IDE에서 Gradle을 임포트하여 사용할 수 있다. 그리고 빌드를 모니터링할 수 있는 Build Scan을 지원한다.

 

Spring Boot 프로젝트에서 Gradle

Gradle 프로젝트를 생성하고 나면 다음과 같은 구조를 볼 수 있다.

Gradle 프로젝트 구조

이 중에 Gradle 관련 기본 구조로 간추리면 다음과 같다.

├─ gradle
│       └─ wrapper
│       ├─ gradle-wrapper.jar
│       └─ gradle-wrapper.properties
├─ gradlew
├─ gradlew.bat
├─ build.gradle
└─ settings.gradle

  • gradlew
    리눅스 또는 맥OS용 실행 쉘 스크립트 파일이다.
  • gradlew.bat
    윈도우용 실행 배치 스크립트 파일이다.
  • gradle-wrapper.jar
    JAR 형식으로 압축된 Wrapper 파일이다. gradlew나 gradlew.bat 파일이 프로젝트 안에 설치되는 이 파일을 사용하여 Gradle task를 실행한다.
  • gradle-wrapper.properties
    Gradle Wrapper 설정 정보 파일이다. Wrapper의 버전 등을 설정할 수 있다.
  • build.gradle
    프로젝트의 라이브러리 의존성, 플러그인, 라이브러리 저장소 등을 설정할 수 있는 빌드 스크립트 파일이다.
  • settings.gradle
    프로젝트의 구성 정보 파일이다. 멀티 프로젝트를 구성하여 프로젝트를 모듈화할 경우, 하위 프로젝트의 구성을 설정할 수 있다.

 

라이브러리 의존성 관리

 

Gradle dependency overview

의존성은 종종 모듈로 제공되는데, 이 모듈들을 저장하고 있는 곳을 repository라고 한다. repository는 로컬 저장소가 될 수도 있고 원격 저장소가 될 수도 있다. Gradle에게 어디서 의존성 모듈을 가져올건지 알려줘야 하는데, repository 선언을 통해 할 수 있다.

Gradle은 특정 task를 실행시키기 위해 필요한 의존성들을 런타임시에 원격 저장소에서 다운로드받거나 로컬 저장소에서 가져온다. 멀티 프로젝트를 구성했을 경우에는 다른 프로젝트를 가져온다. 이 과정을 dependency resolution이라고 한다.

 

Gradle은 향후에 불필요한 네트워크 호출을 하지 않기 위해 의존성 파일들을 dependency cache라고 하는 로컬 캐시에 저장한다.

 

라이브러리 의존성 설정은 build.gradle 스크립트 파일에서 할 수 있다. build.gradle 파일 내부의 코드를 보면 다음과 같이 플러그인, 저장소, 의존성을 설정하는 스크립트가 작성된 것을 볼 수 있다. 스크립트는 Groovy Kotlin 언어로 작성될 수 있는데, 프로젝트를 생성하면 기본으로 Groovy로 작성된다.

plugins {
    id 'org.springframework.boot' version '2.3.2.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'com.lim'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.webjars:bootstrap:4.5.0'
    implementation 'org.webjars:jquery:3.5.1'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

1. Declaring repositories

repository에는 다양한 종류가 있다. repository를 형식과 연결 방법으로 구분지을 수 있다.

  • Format에 따른 구분
    • Maven 기반 저장소(가장 일반적으로 쓰이는 Maven Central, JCenter, Google Android 등이 있다.)
    • Ivy 기반 저장소
    • 로컬 디렉토리 형식 저장소
  • Connectivity에 따른구분
    • 인증 체계가 구성된 저장소(BasicAuthentication, DigestAuthentication, HttpHeaderAuthentication등의 인증 체계가 있다.)
    • HTTPS, SFTP, AWS S3, Google Cloud Storage 등과 같이 다양한 종류의 원격 프로토콜로 연결 가능한 저장소

 

repositories {
    mavenCentral()
}

위의 코드에서 Gradle이 의존성 모듈을 가져올 저장소를 선언하는 부분이다.
Maven Central 저장소에서 의존성을 가져오도록 설정되어있다.

Gradle repository notation

만약 Bintray JCenter, Google Android 저장소에서 가져오도록 설정하고 싶다면 jcenter(), google() 노테이션을 활용하여 스크립트를 수정하면 된다.

2. Dependency Configuration

Gradle 프로젝트에서 선언된 모든 의존성은 사용되는 특정 범위를 가진다. 예를 들어 어떤 의존성은 컴파일 할 때에만 사용될 수 있고, 다른 의존성은 런타임할 때에 사용될 수 있다. 이렇게 의존성의 범위를 표현한 것을 dependency configuration이라고 한다.

  • Implementation: 구현할 때에만 사용된다.
  • compileOnly: 컴파일할 때에만 사용되고 런타임 때에는 사용되지 않는다.
  • runtimeOnly: 런타임 때에만 사용된다.
  • testImplementation: 테스트할 때에만 사용된다.

3. Declaring Dependencies

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.webjars:bootstrap:4.5.0'
    implementation 'org.webjars:jquery:3.5.1'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

이 부분에서 사용할 의존성을 configuration과 함께 선언해준다. Spring Boot에서는 starter을 통해 버전 관리를 쉽게 할 수 있도록 도와준다. 따라서 starter를 사용할 때에는 버전을 따로 명시하지 않아도 된다.

 

출처 : https://limdevbasic.tistory.com/12

반응형
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함