-
build.gradle to build.gradle.kts (Groovy를 Kotlin으로 마이그레이션)프로젝트/자프링 -> 코프링 마이그레이션 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
이외의 것들은 Gradle Kotlin DSL primer 문서를 참조해야 합니다.
https://docs.gradle.org/current/userguide/kotlin_dsl.html
마이그레이션 전 유의사항
- 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
https://kwongdevelop.tistory.com/68
https://docs.gradle.org/current/userguide/kotlin_dsl.html
'프로젝트 > 자프링 -> 코프링 마이그레이션' 카테고리의 다른 글
Kotlin DSL Gradle 멀티 모듈 적용 (0) 2022.12.27 @SpringBootApplication 자바[Java] -> 코틀린[Kotlin]으로 변경 (0) 2022.12.06 [kotlin][Mockito][Junit5] any() must not be null 에러 해결 (0) 2022.12.05 Kotlin 각종 어노테이션 사용법(@Index, @Embeddable, @Size) (0) 2022.12.01 Kotlin과 Lombok 컴파일 에러 해결 (0) 2022.11.30