본문 바로가기
Java & Kotlin/Spring

[Spring] kotlin + Spring 시작하기

by heekng 2022. 8. 10.
반응형

Kotlin + Spring 시작하기

최근 취업 준비를 하며 코틀린에 대한 필요성을 느꼇고, 코틀린을 공부해 보았습니다.

뒤이어 Spring에 Kotlin을 적용해 일명 코프링프로젝트를 시작하기로 했습니다.

버전의 경우 제 현재 프로젝트의 버전이 입력되어 있습니다.
때에 따라 다르게 적용하시면 됩니다.

build.gradle - 코틀린 적용

plugins {
    ...
    id 'org.jetbrains.kotlin.jvm' version '1.6.21'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.6.21'
    ...
}

dependencies {
    ...
    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.6.21'
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3'
    ...
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "11"
    }
}

compileTestKotlin{
    kotlinOptions {
        jvmTarget = "11"
    }
}
  • 기존 Java Spring Gradle 프로젝트에서 작성되는 build.gradle 문서는 제외하고, Kotlin을 사용하기 위한 추가적인 부분입니다.
  • id 'org.jetbrains.kotlin.jvm' version '1.6.21'implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8', compileKotlin, compileTestKotlin
    • 기본적으로 자바를 사용하는 스프링에서 코틀린을 사용하기 위한 플러그인, 의존성입니다.
  • implementation 'org.jetbrains.kotlin:kotlin-reflect:1.6.21'
    • nested exception is java.lang.NoClassDefFoundError: kotlin/reflect/full/KClasses와 같이 스프링이 코틀린 클래스에 대해 리플렉션하지 못하는 것을 해결하기 위해 사용하는 의존성입니다.
    • 리플렉션이란? 클래스나 메소드 등을 런타임으로 제어하기 위한 기술
  • id 'org.jetbrains.kotlin.plugin.spring' version '1.6.21'
    • 일반적인 Java Spring에서 Service단의 메서드에 @Transectional어노테이션을 이용해 트랜잭션 위에서 관리하게 됩니다.
    • 이 때, @Transectional 어노테이션이 정상 작동하기 위해서는 해당 메서드를 상속받을 수 있어야 하는데, Kotlin에서 클레스와 메서드는 기본적으로 final이기 때문에 상속받을 수 없습니다.
    • 이를 해결하기 위해 open을 이용해 상속을 열어주어야 합니다.
      모든 메서드에 이러한 open 키워드를 작성하는것을 반복해야 하기 때문에 이처럼 상속을 필요로 하는 클래스와 메서드에 open을 자동으로 적용해주는 플러그인입니다.
  • implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3'
    • Koltin으로 컨트롤러를 작성하다 보면 JSON parsing에 대한 에러를 마주하게 됩니다.
    • Spring에 기본적으로 탑재되어 있는 Jacson이 Kotlin 클래스를 생성하지 못해 나타나는 에러입니다.
    • 이를 해결하기 위해 코틀린에 작동하는 Jackson 의존성을 추가합니다.

build.gradle - JPA, Querydsl 적용

plugins {
    id 'org.jetbrains.kotlin.plugin.jpa' version '1.6.21'

    id 'org.jetbrains.kotlin.kapt' version '1.6.21'
}

dependencies {
    ...
    implementation 'com.querydsl:querydsl-jpa:5.0.0'
    kapt("com.querydsl:querydsl-apt:5.0.0:jpa")
    kapt("org.springframework.boot:spring-boot-configuration-processor")
    ...
}
  • id 'org.jetbrains.kotlin.plugin.jpa' version '1.6.21'
    • Kotlin에서 JPA를 사용하기 위해 추가하는 플러그인입니다.
    • Jpa는 기본적으로 Entity의 기본 생성자를 이용합니다.
    • 하지만 코틀린에서 주 생성자는 프로퍼티를 만들 때 함께 만들기 때문에 비어있는 기본 생성자가 존재하지 않아 에러가 발생하고, 이를 해결하기 위해 이용하는 플러그인입니다.
  • 그 외의 나머지 코드들은 코틀린에서 Querydsl을 사용하기 위한 플러그인, 의존성입니다.
  • kapt란?
    • kapt (Annotation Processing for kotlin)
    • 코틀린이 자바의 어노테이션을 처리할 때 kotlin 파일의 어노테이션 처리를 포함한다.
    • JVM을 기동할 때 Kotlin의 어노테이션을 포함시키기 위해 사용되는 플러그인이다.
    • Java Spring을 이용할 때 annotationProcessor을 이용했는데, annotationProcessor 대신에 사용하면 된다.

main 메서드

@SpringBootApplication
class TestApplication

fun main(args: Array<String>) {
    runApplication<TestApplication>(*args)
}
  • Java와 다른점은 문법의 차이밖에 없습니다.
  • 추가적인 다른점은 args를 runApplication에 입력할 때에 *(스프레드 연산자)를 이용합니다.

끝!

위에서 다루지 않은 Repository, Service, Controller등의 많은 코드들은 Java Spring과 크게 다르지 않고, 문법의 차이만 존재한다 생각하여 다루지 않았습니다.

코틀린을 이용한 첫 스프링 학습을 진행하면서 가장 헷갈렸던 점이 build.gradle 설정이다 보니 이를 주로 작성하였습니다.

많은 도움이 되었으면 합니다 ^^

반응형