프로젝트/자프링 -> 코프링 마이그레이션

build.gradle to build.gradle.kts (Groovy를 Kotlin으로 마이그레이션)

Junuuu 2022. 12. 11. 00:01
반응형

개요

모든 파일을 자바에서 코틀린으로 변경하였습니다.

이제 남은 것은 build.gradle의 groovy 기반의 빌드 스크립트를 kotlin으로 바꾸고자 합니다.

 

Groovy DSL -> Kotlin DSL

 

DSL은 특정 분야에 최적화된 프로그래밍 언어를 말합니다 

예를 들면 SQL이 있습니다.

 

Gradle공식문서에서 친절하기 Groovy를 Kotlin으로 마이그레이션 하는 문서를 제공합니다

https://docs.gradle.org/current/userguide/migrating_from_groovy_to_kotlin_dsl.html

 

Migrating build logic from Groovy to Kotlin

Declaring dependencies in existing configurations is similar to the way it’s done in Groovy build scripts, as you can see in this example: build.gradle plugins { id 'java-library' } dependencies { implementation 'com.example:lib:1.1' runtimeOnly 'com.exa

docs.gradle.org

 

이외의 것들은 Gradle Kotlin DSL primer 문서를 참조해야 합니다.

https://docs.gradle.org/current/userguide/kotlin_dsl.html

 

Gradle Kotlin DSL Primer

Gradle’s Kotlin DSL provides an alternative syntax to the traditional Groovy DSL with an enhanced editing experience in supported IDEs, with superior content assist, refactoring, documentation, and more. This chapter provides details of the main Kotlin D

docs.gradle.org

 

마이그레이션 전 유의사항

- Java 7은 지원하지 않기 때문에 Java 8 이상으로 실행해야 한다.

- 최신버전의 Gradle, plugins, IDE를 사용하는 것이 먼저입니다.

 

 

Groovy vs Kotlin

- Groovy는 '작은 따옴표' 와 "큰 띠옴표"를 사용할 수 있지만 Kotlin은 "큰 따옴표"만 사용 가능

 

- 변수 할당에 = 사용

 

-  함수 호출에 () 사용

 

예시(build.gradle)

//build.gradle

group "com.acme"
dependencies {
    implementation 'com.acme:example:1.0'
}

 

예시(budil.gradle.kts)

//build.gradle.kts

group =  "com.acme"
dependencies {
    implementation ("com.acme:example:1.0")
}

 

멀티 모듈 환경에서 어떤 모듈은 build.gradle을 사용하고 어떤 모듈은 build.gradle.kts를 사용할 수 있습니다.

 

우선 첫번째로 build.gradle에서 다음과 같은 작업을 수행합니다.

- 큰 따옴표로 사용하여 인용부 통일

- 함수 호출 및 속성 할당을 각각 괄호와 = 연산자를 사용하기

 

기존의 build.gradle(위의 첫 번째 작업 적용)

plugins {
	id "org.springframework.boot" version "2.6.7"
	id "org.asciidoctor.jvm.convert" version "3.3.2"
	id "io.spring.dependency-management" version "1.0.11.RELEASE"
	id "org.jetbrains.kotlin.jvm" version "1.6.21"
	id "java"
	id "org.jetbrains.kotlin.plugin.spring" version "1.6.21"
	id "org.jetbrains.kotlin.plugin.jpa" version "1.6.21"
}

group = "anthill"
version = "0.0.1-SNAPSHOT"
sourceCompatibility = "11"

configurations {
	asciidoctorExtensions
}

repositories {
	mavenCentral()
}

dependencies {
	implementation "org.jetbrains.kotlin:kotlin-reflect"
	testImplementation "org.junit.jupiter:junit-jupiter-params:5.4.2"
	implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1"
	implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
	implementation "org.springframework.boot:spring-boot-starter-data-jpa"
	implementation "org.springframework.boot:spring-boot-starter-web"
	implementation "mysql:mysql-connector-java"
	implementation "org.springframework.boot:spring-boot-starter-validation"
	implementation "org.projectlombok:lombok:1.18.24"
	implementation "org.mindrot:jbcrypt:0.4"
	implementation "io.jsonwebtoken:jjwt:0.9.1"
	asciidoctorExtensions "org.springframework.restdocs:spring-restdocs-asciidoctor"
	testImplementation "org.springframework.restdocs:spring-restdocs-mockmvc"
	compileOnly "org.projectlombok:lombok"
	runtimeOnly "com.h2database:h2"
	testImplementation "org.springframework.boot:spring-boot-starter-test"
}
compileKotlin {
	kotlinOptions {
		jvmTarget = "11"
	}
}

compileTestKotlin {
	kotlinOptions {
		jvmTarget = "11"
	}
}

ext {
	snippetsDir = file("build/generated-snippets")
}

test {
	outputs.dir snippetsDir
	useJUnitPlatform()
}

asciidoctor { // asciidoctor 작업 구성
	configurations "asciidoctorExtensions" // 위에서 작성한 configuration 적용
	dependsOn test // test 작업 이후에 작동하도록 하는 설정
	inputs.dir snippetsDir // snippetsDir 를 입력으로 구성
}

bootJar {
	dependsOn asciidoctor
	copy {
		from "${asciidoctor.outputDir}"            // /html5를 사용하지 않는다!
		into "src/main/resources/static/docs"   // /static/docs로 복사!
	}
}

jar {
	enabled = false
}

 

plugins 적용하기

기존(build.gradle)

plugins {
	id "org.springframework.boot" version "2.6.7"
	id "org.asciidoctor.jvm.convert" version "3.3.2"
	id "io.spring.dependency-management" version "1.0.11.RELEASE"
	id "org.jetbrains.kotlin.jvm" version "1.6.21"
	id "java"
	id "org.jetbrains.kotlin.plugin.spring" version "1.6.21"
	id "org.jetbrains.kotlin.plugin.jpa" version "1.6.21"
}

 

변경(build.gradle.kts)

plugins {
	id("org.springframework.boot") version "2.6.7"
	id("org.asciidoctor.jvm.convert") version "3.3.2"
	id("io.spring.dependency-management") version "1.0.11.RELEASE"
	id("org.jetbrains.kotlin.jvm") version "1.6.21"
	id ("java")
	id ("org.jetbrains.kotlin.plugin.spring") version "1.6.21"
	id ("org.jetbrains.kotlin.plugin.jpa") version "1.6.21"
}

 

Custom Configuration and dependenceis 적용

기존(build.gradle)

configurations {
    asciidoctorExtensions
}

 

변경(build.gradle.kts)

val asciidoctorExtensions by configurations.creating

 

configurations은 implmentation, testImplementation과 같이 asciidoctorExtensions를 사용할 수 있게끔 합니다.

 

예시

asciidoctorExtensions("org.springframework.restdocs:spring-restdocs-asciidoctor")

 

 

sourceCompatibility

기존(build.gradle)

sourceCompatibility = '11'

 

변경(build.gradle.kts)

java.sourceCompatibility = JavaVersion.VERSION_11

 

 

test

기존(build.gradle)

test {
	outputs.dir snippetsDir
	useJUnitPlatform()
}

 

변경(build.gradle.kts)

tasks.withType<Test> {
    useJUnitPlatform()
}

 

 

 

restdocs

기존(build.gradle)

ext {
	snippetsDir = file('build/generated-snippets')
}

asciidoctor { // asciidoctor 작업 구성
	configurations 'asciidoctorExtensions' // 위에서 작성한 configuration 적용
	dependsOn test // test 작업 이후에 작동하도록 하는 설정
	inputs.dir snippetsDir // snippetsDir 를 입력으로 구성
}

bootJar {
	dependsOn asciidoctor
	copy {
		from "${asciidoctor.outputDir}"            // /html5를 사용하지 않는다!
		into 'src/main/resources/static/docs'    // /static/docs로 복사!
	}
}

 

변경(build.gradle.kts)

val snippetsDir by extra {
    file("build/generated-snippets")
}

tasks {
    asciidoctor {
        dependsOn(test)
        configurations("asciidoctorExtensions")
        inputs.dir(snippetsDir)
    }
    register<Copy>("copyDocument") {
        dependsOn(asciidoctor)
        from(file("build/docs/asciidoc/index.html"))
        into(file("src/main/resources/static/docs"))
    }
    bootJar {
        dependsOn("copyDocument")
    }
}

 

gradle에는 project properties와 extra properties가 존재합니다.

val myNewProperty by extra("initial value")

myNewProperty라는 새 추가 속성을 만들고 속성 유형을 결정하는 "초기 값" 값으로 초기화합니다.

 

 

 

 

참고 자료

https://docs.gradle.org/current/userguide/migrating_from_groovy_to_kotlin_dsl.html

 

Migrating build logic from Groovy to Kotlin

Declaring dependencies in existing configurations is similar to the way it’s done in Groovy build scripts, as you can see in this example: build.gradle plugins { id 'java-library' } dependencies { implementation 'com.example:lib:1.1' runtimeOnly 'com.exa

docs.gradle.org

https://kwongdevelop.tistory.com/68

 

Migrating build.gradle from Groovy to Kotlin

guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/ Migrating build logic from Groovy to Kotlin Declaring dependencies in existing configurations is similar to the way it’s done in Groov..

kwongdevelop.tistory.com

https://docs.gradle.org/current/userguide/kotlin_dsl.html

 

Gradle Kotlin DSL Primer

Gradle’s Kotlin DSL provides an alternative syntax to the traditional Groovy DSL with an enhanced editing experience in supported IDEs, with superior content assist, refactoring, documentation, and more. This chapter provides details of the main Kotlin D

docs.gradle.org