> For the complete documentation index, see [llms.txt](https://wannaqueen.gitbook.io/spring5/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wannaqueen.gitbook.io/spring5/spring-boot/undefined-1/50.-kotlin-support-by-ys.md).

# 50. Kotlin support by ys

{% hint style="info" %}
코틀린은 JVM에서 동작하는 프로그래밍 언어이다. 2011년 7월, 젯브레인사가 공개하였다. 캇린으로 읽어야 한다. 파일 확장자는 .kt 또는 .kts를 사용한다. (java vs kotlin)

* 코틀린(Kotlin)은 인텔리제이(IntelliJ IDEA)라는 제품으로 유명한 젯브레인(JetBrains)에서 만든 언어
* 자바와 100% 호환되어 자바로 작성된 프로젝트에 코틀린 코드를 추가할 수도 있고 자바코드를 모두 코틀린으로 대체할 수도 있습니다.
  {% endhint %}

[Kotlin](https://kotlinlang.org/) 은 Java로 작성된 기존 라이브러리와의 [상호 운용성](https://kotlinlang.org/docs/reference/java-interop.html) 을 제공하면서 간결하고 우아한 코드를 작성할 수있는 JVM (및 기타 플랫폼)을 대상으로하는 정적 유형 언어 입니다.

Spring Boot는 Spring Framework, Spring Data, Reactor와 같은 다른 Spring 프로젝트의 지원을 활용하여 Kotlin 지원을 제공합니다. 자세한 내용은 [Spring Framework Kotlin 지원 문서](https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/languages.html#kotlin) 를 참조하십시오.

Spring Boot와 Kotlin으로 시작하는 가장 쉬운 방법은 [이 포괄적 인 튜토리얼](https://spring.io/guides/tutorials/spring-boot-kotlin/) 을 따르는 [것](https://spring.io/guides/tutorials/spring-boot-kotlin/) 입니다. [start.spring.io](https://start.spring.io/#!language=kotlin) 를 통해 새로운 Kotlin 프로젝트를 만들 수 있습니다 . 언제든지 [Kotlin Slack](https://slack.kotlinlang.org/)의 #spring 채널에 가입 하거나 지원이 필요한 경우 [stack overflow](https://stackoverflow.com/questions/tagged/spring+kotlin) 의 `spring` and `kotlin`태그를 사용하여 질문하십시오 .

### 50.1 요구 사항

스프링 부트는 Kotlin 1.2.x를 지원합니다. 코 틀린를 사용하려면, `org.jetbrains.kotlin:kotlin-stdlib`및 `org.jetbrains.kotlin:kotlin-reflect`클래스 경로에 있어야합니다. `kotlin-stdlib`변종 `kotlin-stdlib-jdk7`과는 `kotlin-stdlib-jdk8`도 사용할 수 있습니다.

[Kotlin 클래스는 기본적으로 최종 클래스](https://discuss.kotlinlang.org/t/classes-final-by-default/166) 이므로 , 스프링 - 주석 클래스를 자동으로 열어 프록시 할 수 있도록 [kotlin-spring](https://kotlinlang.org/docs/reference/compiler-plugins.html#spring-support) 플러그인 을 구성 [하려고](https://kotlinlang.org/docs/reference/compiler-plugins.html#spring-support) 할 것입니다.

[Jackson의 Kotlin 모듈](https://github.com/FasterXML/jackson-module-kotlin) 은 [Kotlin의](https://github.com/FasterXML/jackson-module-kotlin) JSON 데이터 직렬화 / 직렬화에 필요합니다. 클래스 패스에서 발견되면 자동으로 등록됩니다. Jackson과 Kotlin은 있지만 Jackson Kotlin 모듈은없는 경우 경고 메시지가 기록됩니다.

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png)                       |
| --------------------------------------------------------------------------------------------------------------------- |
| 이러한 종속성과 플러그인은 [start.spring.io](https://start.spring.io/#!language=kotlin) 에서 Kotlin 프로젝트를 부트 스트랩하는 경우 기본적으로 제공됩니다 . |

### 50.2 NULL 안전성

Kotlin의 핵심 기능 중 하나는 [null-safety](https://kotlinlang.org/docs/reference/null-safety.html) 입니다. 그것은 다루는 런타임을 오히려 문제를 지연시키고, 오히려  `NullPointerException`을 만나기보다는 컴파일 타임에 `null` 값을 처리합니다. 이렇게하면  `Optional`과 같은 래퍼 비용을 지불하지 않고도 일반적인 버그 소스를 제거하는 데 도움이됩니다. Kotlin은 또한 Kotlin의 [null-safety에](https://www.baeldung.com/kotlin-null-safety) 대한 [포괄적 인 가이드](https://www.baeldung.com/kotlin-null-safety) 에서 설명한대로 nullable 값을 갖는 기능적 구성을 사용할 수 있습니다 .

자바는 타입 시스템에서 null-safety를 표현할 수 없지만, Spring Framework, Spring Data, Reactor는 이제 도구 친화적 인 주석을 통해 API의 null-safety를 제공합니다. 기본적으로 Kotlin에서 사용되는 Java API의 [유형](https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types) 은 null 체크가 완화 된 [플랫폼 유형](https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types) 으로 인식됩니다 . null 허용 주석과 결합 된 [JSR 305 주석에 대한 Kotlin의 지원은 Kotlin의](https://kotlinlang.org/docs/reference/java-interop.html#jsr-305-support) 관련 Spring API에 대해 null 안전을 제공합니다.

{% hint style="info" %}

* 객체 타입의 변수에서 널(null) 값의 허용 여부를 구분하지 않던 자바와 달리, 코틀린은 이를 명확히 구분합니다. 또한 널 값의 허용 여부를 컴파일 단계에서 검사하므로 런타임에서 발생하는 오류를 대폭 줄일 수 있습니다.

출처 : <https://medium.com/@pjh880720/%EC%BD%94%ED%8B%80%EB%A6%B0-kotlin-%EC%9D%B4%EB%9E%80-50dba0b1b9c7>
{% endhint %}

JSR 305 검사는 `-Xjsr305={strict|warn|ignore}` 옵션을 사용하여 `-Xjsr305`컴파일러 플래그를 추가하여 구성 할 수 있습니다 . 기본 동작은 `-Xjsr305=warn`와 같습니. 이 `strict`값은 Spring API에서 유추한 Kotlin 유형을 고려하여 null 안전성을 가져야하지만, Spring API 무효화 선언(nullability declaration)은 부 릴리스 사이에서도 발전 할 수 있고 앞으로 더 많은 검사가 추가 될 수 있다는 지식을 가지고 사용해야합니다.

| ![\[Warning\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/warning.png)                                                                                                                                        |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 일반 유형 인수, varargs 및 배열 요소 null 가능성은 아직 지원되지 않습니다. 최신 정보는 [SPR-15942](https://jira.spring.io/browse/SPR-15942) 를 참조하십시오 . 또한 Spring Boot 자체의 API [에는 아직 주석이 달려 있지 않다는](https://github.com/spring-projects/spring-boot/issues/10712) 것을 명심하십시오 . |

### 50.3 Kotlin API

#### 50.3.1 runApplication

Spring Boot는 다음 예제 와 같이 `runApplication<MyApplication>(*args)`을 사용하여 응용 프로그램을 실행하는 관용적인 방법을 제공합니다 .

```kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class MyApplication

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

이것은 `SpringApplication.run(MyApplication::class.java, *args)`의 드롭 인 대체품입니다. 이것 또한 다음 예제와 같이 응용 프로그램을 사용자 정의 할 수 있습니다.

```kotlin
runApplication<MyApplication>(*args) {
	setBannerMode(OFF)
}
```

#### 50.3.2 확장

Kotlin [확장](https://kotlinlang.org/docs/reference/extensions.html) 은 추가 기능으로 기존 클래스를 확장하는 기능을 제공합니다. Spring Boot Kotlin API는 이러한 확장 기능을 사용하여 새로운 Kotlin 특정 편의 기능을 기존 API에 추가합니다.

`TestRestTemplate`확장은 Spring Framework의 Spring Framework를 위해`RestOperations`를 제공하는 것과 유사합니다.  무엇보다도 Kotlin의 유형화 된 매개 변수를 활용할 수있는 확장이 가능합니다.

### 50.4 의존성 관리

클래스 경로에 다른 버전의 Kotlin 의존성을 섞지 않으려면 다음과 같은 Kotlin 종속성의 종속성 관리가 제공됩니다.

* `kotlin-reflect`
* `kotlin-runtime`
* `kotlin-stdlib`
* `kotlin-stdlib-jdk7`
* `kotlin-stdlib-jdk8`
* `kotlin-stdlib-jre7`
* `kotlin-stdlib-jre8`

Maven을 사용하면 Kotlin 버전을 `kotlin.version`속성을 통해 사용자 정의 할 수 있으며 플러그인 관리가 제공됩니다 `kotlin-maven-plugin`. Gradle을 사용하면 Spring Boot 플러그인 `kotlin.version`이 Kotlin 플러그인의 버전과 자동으로 정렬됩니다 .

### 50.5 `@ConfigurationProperties`

`@ConfigurationPropertie`는 생성자에 의해 초기화 된 불변 클래스는 [아직 지원되지 않기](https://github.com/spring-projects/spring-boot/issues/8762) 때문에 현재는 `lateinit`또는 null 허용 가능한 `var`속성 에서만 작동 합니다 (전자는 권장 됨) .

```kotlin
@ConfigurationProperties("example.kotlin")
class KotlinExampleProperties {

	lateinit var name: String

	lateinit var description: String

	val myService = MyService()

	class MyService {

		lateinit var apiToken: String

		lateinit var uri: URI

	}

}

```

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png)                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 주석 프로세서를 사용 [하여 자신의 메타 데이터](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#configuration-metadata-annotation-processor) 를 생성하려면 `spring-boot-configuration-processor` 종속성을 사용하여 [`kapt`구성해야합니다](https://kotlinlang.org/docs/reference/kapt.html) . |

### 50.6 테스트

Kotlin 코드를 테스트 하는 데 JUnit 4 (`spring-boot-starter-test`기본값이 제공 ) 를 사용할 수 있지만 JUnit 5가 권장됩니다. JUnit 5를 사용하면 테스트 클래스를 한 번 인스턴스화하고 모든 클래스 테스트에 다시 사용할 수 있습니다. 따라서 Kotlin에 적합한 비 정적 메서드에서 주석 `@BeforeAll`과 `@AfterAll`주석 을 사용할 수 있습니다 .

JUnit 5를 사용하려면 `spring-boot-starter-test`의 `junit:junit`종속성을 제외하고 JUnit 5 종속성을 추가하고 그에 따라 Maven 또는 Gradle 플러그인을 구성하십시오. 자세한 내용은 [JUnit 5 설명서](https://junit.org/junit5/docs/current/user-guide/#dependency-metadata-junit-jupiter-samples) 를 참조하십시오. 또한 [테스트 인스턴스 수명주기를 "클래스 단위"](https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle-changing-default) 로 [전환](https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle-changing-default) 해야합니다 .

Kotlin class들을 mock하려면 [MockK](https://mockk.io/) 을 권합니다. Mockito 에 맞는 [`@MockBean`와 `@SpyBean` 주](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications-mocking-beans)석이 필요한 `Mockk` 이 필요하다면, 당신은 [SpringMockK](https://github.com/Ninja-Squad/springmockk) 제공한 유사한 `@MockkBean`하고 `@SpykBean`주석을사용할 수 있습니다 .

{% hint style="info" %}
영어로 `Mock'은`흉내내다'라는 의미를 가지고 있습니다. 목업(Mock-UP)은 실제 제품을 만들기 전 실물크기의 모형을 뜻하는데, IT제품 경우 실제 양산품을 만들기 전에 디자인을 구현해보기 위해 목업을 미리 만드는 것이 보편화돼 있습니다.
{% endhint %}

{% hint style="info" %}
mockito는 유닛 테스트를 위한 Java mocking framework 입니다. mockito를 사용하면 대부분의 로직을 검증 할 수 있습니다.
{% endhint %}

### 50.7 Resources

####

#### 50.7.1 추가 읽기

* [Kotlin 언어 참조](https://kotlinlang.org/docs/reference/)
* [Kotlin Slack](https://slack.kotlinlang.org/) (전용 # 스프링 채널 사용)
* [with `spring`및 `kotlin`태그 Stackoverflow](https://stackoverflow.com/questions/tagged/spring+kotlin)
* [브라우저에서 Kotlin 사용해보기](https://try.kotlinlang.org/)
* [Kotlin 블로그](https://blog.jetbrains.com/kotlin/)
* [굉장한 코 틀린](https://kotlin.link/)
* [튜토리얼 : Spring Boot와 Kotlin으로 웹 애플리케이션 구축하기](https://spring.io/guides/tutorials/spring-boot-kotlin/)
* [Kotlin으로 봄 부팅 응용 프로그램 개발하기](https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin)
* [Kotlin, Spring Boot 및 PostgreSQL을 사용한 지형 공간 메신저](https://spring.io/blog/2016/03/20/a-geospatial-messenger-with-kotlin-spring-boot-and-postgresql)
* [Spring Framework 5.0에서 Kotlin 지원을 소개합니다.](https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0)
* [Spring Framework 5 Kotlin API, 기능적 방법](https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way)

#### 50.7.2 예제

* [spring-boot-kotlin-demo](https://github.com/sdeleuze/spring-boot-kotlin-demo) : 일반 Spring Boot + Spring Data JPA 프로젝트
* [mixit](https://github.com/mixitconf/mixit) : 스프링 부트 2 + WebFlux + 리 액티브 스프링 데이터 MongoDB
* [spring-kotlin-fullstack](https://github.com/sdeleuze/spring-kotlin-fullstack) : JavaScript 또는 TypeScript 대신 프론트 엔드 용 Kotlin2js가있는 WebFlux Kotlin 전체 스택 예제
* [spring-petclinic-kotlin](https://github.com/spring-petclinic/spring-petclinic-kotlin) : spring PetClinic 샘플 응용 프로그램의 Kotlin 버전
* [spring-kotlin-deepdive](https://github.com/sdeleuze/spring-kotlin-deepdive) : Boot 1.0 + Java를 Boot 2.0 + Kotlin으로 단계별 마이그레이션
