반응형
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을 자동으로 적용해주는 플러그인입니다.
- 일반적인 Java Spring에서 Service단의 메서드에
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
설정이다 보니 이를 주로 작성하였습니다.
많은 도움이 되었으면 합니다 ^^
반응형
'Java & Kotlin > Spring' 카테고리의 다른 글
[Spring] ExceptionHandlerLoggedImpl 에러가 나타난다면 (0) | 2022.08.24 |
---|---|
[Spring] AOP Joinpoint의 getThis()와 getTarget() (0) | 2022.08.20 |
[Spring] kotlin spring lazy loading 삽질기 (0) | 2022.08.13 |
[Spring] SpringBoot 기본 TimeZone 설정하기 (0) | 2022.06.13 |
[Spring] UnmarshallingFailureException 에러 해결하기 (0) | 2022.06.06 |
[Spring] Validation을 이용해 검증하기 (0) | 2022.05.29 |