본문 바로가기
프로그래밍/kotlin

[kotlin + Spring] 코틀린 환경에서 Spring Boot 사용하기

by 사바라다 2021. 7. 25.

우리가 자바를 사용하는 이유는 스프링 프레임워크가 있기 때문이다라는 말이 있을 정도로 자바 언어를 사용하는 유저에게 스프링은 정말 없어서는 안될 존재이기도 합니다. 최근 코틀린이 자바유저들의 관심을 받기 시작한것도 물론 언어적으로 좀 더 실용적이라는 관점도 있지만 스프링을 사용할 수 있기때문에 진입장벽이 낮게 여겨지는 이유도 있을것이라고 봅니다.

그런이유로, 오늘은 코틀린 환경에서 스프링 프레임워크를 사용해보도록 하겠습니다.

환경

오늘 프로젝트는 아래의 환경을 기반으로 이루어집니다. 만약 동일하게 따라했으나 오류가 난다면 버전문제일 수 있으니 확인해주시기 바랍니다.

  • JDK
    • 버전 : 1.8.0.292
  •  kotlin
    • 버전 : 1.4.32
  • spring boot
    • 버전 : 2.4.5
  •  gradle
    • 버전 : 6.8.3
  •  intellij
    • 버전 : 2021.1.1

프로젝트 시작하기

intellij에서 코틀린으로 Spring 환경을 잡아주기 위해서 initialize하는 방법입니다.

gradle kotlin dsl 설정

프로젝트를 관리하기 위해서 빌드 도구 설정을 해주어야합니다. 빌드 도구에 대해서는 이전에 빌드 도구가 뭐에요 ? 포스팅을 올린적이 있습니다. 짧은 글이니 궁금하신분든을 참고해주시바랍니다. gradle kotlin dsl의 전체 설정의 코드를 먼저 보고 필요한 부분에 대해서 하나하나 설명을 드리도록 하겠습니다.

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.4.32"
    kotlin("plugin.spring") version "1.4.32"
    id("org.springframework.boot") version "2.4.5"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
}

group = "personal.project"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

plugin

kotlin에서 spring을 실행하기 위한 plugin들을 살펴보도록 하겠습니다. 먼저 plugin이란 미리 구성해둔 task들의 그룹입니다. 특정 빌드과정에서 필요한 기본정보들을 포함하고 있으며 필요에 따라 커스터마이징 할 수 있습니다.

plugins {
    kotlin("jvm") version "1.4.32"
    kotlin("plugin.spring") version "1.4.32"
    id("org.springframework.boot") version "2.4.5"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
}

먼저 kotlin(<...>)id(<...>)가 있습니다. kotlin(<...>)kotlin 전용 id를 축약해 놓은 것입니다. 따라서 kotlin(<...>)id(<...>)로 표현할 수 있으며 id('org.jetbrains.kotlin.<...>')와 동일한 의미를 가집니다.

  • kotlin("jvm")
    • kotlin은 멀티플랫폼을 지원하는 언어입니다.
    • 어떤 플랫폼들을 지원하는지는 공식 홈페이지의 Supported platforms에서 확인가능합니다.
    • 프로젝트에서는 jvm을 타겟으로 한다고 명시합니다.
  • kotlin("plugin.spring")
    • 해당 플러그인은 allopen 플러그인입니다. ( 참조 : org.jetbrains.kotlin.plugin.spring)
    • 코틀린은 기본적으로 클래스는 final로써 open 키워드를 명시적으로 사용하지 않으면 상속이 불가능합니다.
    • spring의 AOP는 cglib를 사용하는데 이는 상속을 통해서 Proxy 패턴을 사용합니다.
    • 따라서 해당 플러그인은 클래스를 open을 기본으로 해줍니다.
  • id("org.springframework.boot")
    • spring boot를 사용하기 위한 플러그인입니다.
  • id("io.spring.dependency-management")
    • spring 관련 의존성의 버전관리를 일괄적으로 하기 위한 플러그인입니다.

의존성(dependencies)

의존성을 한번 보도록 하겠습니다. Java에서도 spring boot를 사용할때 이용하는 의존성은 간단하게 설명하며 kotlin 전용 의존성은 좀 더 깊게 이야기하도록 하겠습니다.

  • implementation("org.springframework.boot:spring-boot-starter-web")
    • spring boot를 이용하기 위한 의존성
  • testImplementation("org.springframework.boot:spring-boot-starter-test")
    • spring boot 테스트를 이용하기 위한 의존성
  • implementation("org.jetbrains.kotlin:kotlin-reflect")
    • kotlin은 런타임 라이브러리 용량을 줄이기 위해서 기본적으로 reflect를 제공해주지 않습니다.
    • 이 의존성을 추가하시면 reflect를 이용할 수 있게 됩니다.
  • implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    • 이 라이브러리는 kotlin에서 필수적인 기능들을 제공해줍니다.
    • let, apply, use, synchronized 등의 함수
    • collection의 이용에 도움이되는 확장 함수
    • 문자열을 다루는 다양한 유틸들
    • IO와 threading 관련 함수들

main

빌드 도구에 대한 설정이 마무리되셨다면 아래와 같은 코드를 src/main/kotlin/{패키지명}에 코틀린 클래스를 만들어 입력합니다.

@SpringBootApplication
class LighthouseApplication

fun main(args: Array<String>) {
    runApplication<LighthouseApplication>(*args)
}

마무리

이렇게 설정한 후 실행을 해보시면 정상적으로 잘 실행이 되실것이라고 보여집니다.

사실 위 설정들은 코틀린에서 Spring을 실행하기 위한 가장 기본적인 설정입니다.

jpa, annotation을 정상적으로 실행하기 위해서는 kapt, all-open 등 좀 더 다양한 plugin 들이 필요로 하게됩니다.

이런 부분은 추후에 다른 포스팅을 통해서 여러분께 소개드리도록 하겠습니다.

감사합니다.

참조

kotlinlang_targeting-the-jvm

댓글