실무 프로젝트로 배우는 Kotlin & Spring/JAVA 프로젝트에 코틀린 도입하기

JAVA 기반 스프링 프로젝트에 코틀린 적용

webmaster 2022. 11. 5. 01:09
728x90

build.gradle

plugins {
    id 'org.springframework.boot' version '2.7.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version "1.6.21"
}

group = 'com.fastcampus'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

build.gradle.kts

plugins {
    id("org.springframework.boot") version "2.7.0"
    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.allopen") version "1.6.21" //코틀린은 모두 상속이 안되기 때문에 해당플로그인으로 allopen 해주어야 한다
    kotlin("plugin.spring") version "1.6.21"
    //kotlin("plugin.noarg") version "1.6.21"
    kotlin("plugin.jpa") version "1.6.21"
}
/*
allOpen {
    annotations("org.springframework.boot.autoconfigure.SpringBootApplication"
    , "org.springframework.transaction.annotation.Transactional"
    )
    //항상 패키지를 지정해 주어야하는 단점이 있다.
}
 */
/*
noArg{
    annotation("javax.persistence.*")
    //엔티티는 noargConstruct 가 있어야 하는데 이를 생성해 준다.
    //항상 패키지를 지정해야하는 단점이 있다
}
 */


group = "com.fastcampus"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    compileOnly("org.projectlombok:lombok:1.18.24")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    runtimeOnly("com.h2database:h2")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}
  • kotlinDSL을 사용해서 만들 수 있는 kts 파일을 사용해, 빌드 환경을 구성할 수 있다.
    • 기본적으로 함수로 쓰이기에 ()로 변경만 해주면 비슷하게 사용할 수 있다.
  • Spring의 기능을 사용하기 위해서는(@SpringBootApplication과 같은 애노테이션) 보통은 상속이 가능한 클래스인 open클래스여야 하는데 코틀린은 기본적으로 상속이 불가능하게 되어있다.
    • 이를 해결하기 위해서는 매번 open 을 붙이는 것이 아닌, allOpen 플러그인을 사용하는 것이다(단, 매번 클래스를 적어줘야 하는 단점이 있기 때문에 코틀린에서는 spring 플러그인을 제공한다)
  • JPA 같은 경우 기본적으로 noArgumentConstruct가 존재해야하는데, 이도 역시 noArg라는 플러그인을 제공한다(위와 마찬가지로 매번 클래스를 적어줘야 하는 단점이 있어, 코틀린에서는 jpa 플러그인을 제공한다) 
728x90