language, framework, library/kotlin

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

사바라다 2021. 7. 25. 04:33
반응형

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

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

환경

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

  • 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

반응형