스프링 부트 #4.30. 코틀린 지원
2020/06/16 - [IT/SpringBoot] - 스프링 부트 #4.27-4.30. 웹 소켓 등
2020/06/16 - [IT/SpringBoot] - 스프링 부트 #4.26. 테스트
2020/06/16 - [IT/SpringBoot] - 스프링 부트 #4.15-25. REST서비스 호출 외
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.14. 메시징
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.13. 캐싱
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.12. NoSQL
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.11. SQL 데이터베이스 작업
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.10. 보안
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.8-9 Graceful/RSocket
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.7 웹 애플리케이션 개발
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.5-6 국제화/JSON
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.3-4 프로필/로깅
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.2 외부화된 구성
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.1 스프링 애플리케이션
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #3. 사용
4.30. 코틀린 지원
Kotlin은 Java에서 작성된 기존 라이브러리와의 상호 운용성을 제공하면서 간결하고 우아한 코드를 작성할 수 있는 JVM(및 기타 플랫폼)을 대상으로 하는 정적 형식의 언어입니다.
스프링 부트는 스프링 프레임워크, 스프링 데이터 및 원자로와 같은 다른 스프링 프로젝트의 지원을 활용하여 Kotlin 지원을 제공합니다. 자세한 내용은 스프링 프레임워크 Kotlin 지원 문서를 참조하십시오.
스프링 부트과 Kotlin로 시작하는 가장 쉬운 방법은이 포괄적 인 자습서를따르는 것입니다 . start.spring.io통해 새로운 Kotlin 프로젝트를 만들 수 있습니다. 코틀린 슬랙의 #spring 채널에 참여하거나 지원이 필요한 경우 스택 오버플로의 태그와 함께 질문을 주시기 바랍니다.spring
kotlin
4.30.1. 요구 사항
스프링 부트는 코틀린 1.3.x를 지원합니다. Kotlin을 사용하려면 클래스 경로에 있어야 합니다. 변형및 또한 사용할 수 있습니다.org.jetbrains.kotlin:kotlin-stdlib
org.jetbrains.kotlin:kotlin-reflect
kotlin-stdlib
kotlin-stdlib-jdk7
kotlin-stdlib-jdk8
Kotlin 클래스는 기본적으로 최종이기때문에 스프링 주석이 추가된 클래스를 자동으로 열기 위해 코틀린 스프링 플러그인을 구성하여 프록시를 할 수 있습니다.
잭슨의 코틀린 모듈은 코틀린에서 JSON 데이터를 직렬화 / 분류하는 데 필요합니다. 클래스 경로에서 찾을 때 자동으로 등록됩니다. 잭슨과 코틀린이 존재하지만 잭슨 코틀린 모듈이 없는 경우 경고 메시지가 기록됩니다.
이러한 종속성및 플러그인은 기본적으로 제공됩니다 한 부트 스트랩은 start.spring.io코틀린 프로젝트를 스트랩경우. |
4.30.2. 널 안전
Kotlin의 주요 기능 중 하나는 무효 안전입니다. 런타임으로 문제를 연기하고 . 이렇게 하면 래퍼와 같은 래퍼 비용을 지불하지 않고 버그의 일반적인 소스를 제거하는 데 도움이 됩니다. Kotlin은 또한 Kotlin의 무효 안전에 대한이 포괄적인 가이드에 설명된 대로 무효화 가능한 값을 가진 기능 구조를 사용할 수 있습니다.null
NullPointerException
Optional
Java는 유형 시스템에서 null-safety를 표현할 수 없지만 스프링 프레임워크, 스프링 데이터 및 반응기는 이제 툴링 친화적 인 주석을 통해 API의 무효 안전을 제공합니다. 기본적으로 Kotlin에서 사용되는 Java API의 형식은 null 검사가 완화되는 플랫폼 유형으로 인식됩니다. Kotlin의 JSR 305 주석에 대한 지원은 무효 주석과 결합되어 코틀린의 관련 스프링 API에 대한 무효 안전성을 제공합니다.
JSR 305 검사는 다음 옵션을 가진 컴파일러 플래그를 추가하여 구성할 수 있습니다. 기본 동작은 . 이 값은 Spring API에서 유추된 Kotlin 유형에서 null-safety를 고려해야 하지만 스프링 API 무효화 선언이 사소한 릴리스 간에도 발전할 수 있고 향후 더 많은 검사가 추가될 수 있다는 지식과 함께 사용해야 합니다.-Xjsr305
-Xjsr305={strict|warn|ignore}
-Xjsr305=warn
strict
일반 형식 인수, varargs 및 배열 요소 무효화는 아직 지원되지 않습니다. 최신 정보는 SPR-15942를 참조하십시오. 또한 스프링 부트의 자체 API는 아직 에 추가되지 않습니다. |
4.30.3. 코틀린 API
runApplication
스프링 부트은 다음 예제와 같이 응용 프로그램을 실행하는 관용적인 방법을 제공합니다.runApplication<MyApplication>(*args)
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)
runApplication<MyApplication>(*args) {
setBannerMode(OFF)
}
확장
Kotlin 확장은 추가 기능으로 기존 클래스를 확장할 수 있는 기능을 제공합니다. 스프링 부트 Kotlin API는 이러한 확장을 사용하여 기존 API에 새로운 Kotlin 특정 편의성을 추가합니다.
TestRestTemplate
스프링 프레임워크에서 스프링 프레임워크에서 제공하는 것과 유사한 확장이 제공됩니다. 무엇보다도 확장은 Kotlin 재화 된 유형 매개 변수를 활용할 수 있게 합니다.RestOperations
4.30.4. 종속성 관리
클래스 경로에 코틀린 종속성의 다른 버전을 혼합하지 않도록하기 위해, 스프링 부트은 Kotlin BOM을 수입.
메이븐과 함께, Kotlin 버전은 속성을 통해 사용자 정의 할 수 있으며 플러그인 관리는 제공됩니다. 그라드와 함께, 스프링 부트 플러그인은 자동으로 코틀린 플러그인의 버전과 정렬.kotlin.version
kotlin-maven-plugin
kotlin.version
스프링 부트은 또한 코틀린 코루틴 BOM을 가져와서 코루틴 종속성 버전을 관리합니다. 버전은 속성을 통해 사용자 정의 할 수 있습니다.kotlin-coroutines.version
org.jetbrains.kotlinx:kotlinx-coroutines-reactor 종속성은 기본적으로 하나의 부트스트랩이 start.spring.io대한 하나 이상의 반응 성 의존성을 가진 Kotlin 프로젝트를 트랩하는 경우 제공됩니다. |
4.30.5. @ConfigurationProperties
@ConfigurationProperties
@ConstructorBinding
함께 사용하는 경우 다음 예제와 같이 변경할 수 없는 속성을 가진 클래스를 지원합니다.val
@ConstructorBinding
@ConfigurationProperties("example.kotlin")
data class KotlinExampleProperties(
val name: String,
val description: String,
val myService: MyService) {
data class MyService(
val apiToken: String,
val uri: URI
)
}
애노션 프로세서를 사용하여 고유한 메타데이터를 생성하려면 종속성으로 kapt를 구성해야 합니다. 기본 값 또는 사용되지 않는 항목 감지와 같은 일부 기능은 kapt가 제공하는 모델의 제한으로 인해 작동하지 않습니다. spring-boot-configuration-processor |
4.30.6. 테스트
JUnit 4를 사용하여 Kotlin 코드를 테스트할 수 있지만 JUnit 5는 기본적으로 제공되며 권장됩니다. JUnit 5를 사용하면 테스트 클래스를 한 번 인스턴스화하고 모든 클래스의 테스트에 대해 다시 사용할 수 있습니다. 이렇게 하면 코틀린에 적합한 비정적 메서드에 주석과 주석을 사용할 수 있습니다.@BeforeClass
@AfterClass
JUnit 5는 기본값이며 빈티지 엔진은 JUnit 4와의 후진 호환성을 위해 제공됩니다. 사용하지 않는 경우 . 또한 테스트 인스턴스 수명 주기를 "클래스당"으로 전환해야합니다.org.junit.vintage:junit-vintage-engine
코틀린 클래스를 모의하려면 MockK를 권장합니다. Mockito 특정 @MockBean
주석과 @SpyBean
것과 동등한 항목이 필요한 경우 유사 및 주석을 제공하는 SpringMockK를 사용할 수 있습니다.Mockk
@MockkBean
@SpykBean
4.30.7. 자원
추가 읽기
예제
- 스프링 부트-코틀린 데모: 정규 스프링 부트 + 스프링 데이터 JPA 프로젝트
- 믹스 :스프링 부트 2 + 웹 플럭스 + 반응 스프링 데이터 MongoDB
- 스프링 코틀린 풀 스택: 웹 플럭스 코틀린 풀 스택 예 대신 자바 스크립트 또는 TypeScript의 프론트 엔드에 대한 Kotlin2js
- 스프링 애완 동물 클리닉 - 코틀린: 스프링 애완 동물 클리닉 샘플 응용 프로그램의 코틀린 버전
- 스프링 코틀린 딥디브: 부트 1.0 + 자바 부트 2.0 + Kotlin에 대한 단계 마이그레이션에 의해 단계
- 스프링 부트 -co루틴 데모: 코루틴 샘플 프로젝트
4.31. 도커 이미지 구축
스프링 부트 응용 프로그램은 Docker 이미지로 포장하여 컨테이너화할 수 있습니다. 일반적인 스프링 부트 지방 항아리는 이미지를 빌드하는 데 사용할 수 있는 Dockerfile에 몇 줄만 추가하여 Docker 이미지로 변환할 수 있습니다. 그러나 도커 이미지와 마찬가지로 지방 항아리를 복사하고 실행하는 데는 여러 가지 단점이 있습니다. 포장을 풀지 않고 지방 항아리를 실행할 때 항상 일정량의 오버헤드가 있으며 컨테이너화된 환경에서는 눈에 띄는 것이 될 수 있습니다. 또 다른 문제는 응용 프로그램의 코드와 모든 종속성을 Docker 이미지의 한 계층에 배치하는 것이 최적이 아님입니다. 사용하는 스프링 부트 버전을 업그레이드하는 것보다 코드를 더 자주 다시 컴파일할 수 있기 때문에 작업을 좀 더 구분하는 것이 좋습니다. 응용 프로그램 클래스 앞에 jar 파일을 레이어에 넣으면 Docker는 종종 맨 아래 레이어만 변경하면 캐시에서 다른 파일을 선택할 수 있습니다.
4.31.1. 도커 이미지 레이어링
Dockerfile로 빌드할 수 있는 최적화된 Docker 이미지를 보다 쉽게 만들 수 있도록 Spring Boot는 항아리에 레이어 인덱스 파일을 추가할 수 있도록 지원합니다. 파일에는 파일이 들어야 하는 레이어와 함께 항아리의 모든 파일이 나열됩니다. 인덱스의 파일 목록은 레이어를 추가해야 하는 순서에 따라 정렬됩니다. 즉시 다음 레이어가 지원됩니다.layers.idx
dependencies
(일반 릴리스 종속성의 경우)spring-boot-loader
(아래의 모든 것org/springframework/boot/loader
)snapshot-dependencies
(스냅샷 종속성의 경우)application
(응용 프로그램 클래스 및 리소스의 경우)
다음은 파일의 예를 보여 주다.layers.idx
dependencies BOOT-INF/lib/library1.jar
dependencies BOOT-INF/lib/library2.jar
spring-boot-loader org/springframework/boot/loader/JarLauncher.class
spring-boot-loader org/springframework/boot/loader/jar/JarEntry.class
...
snapshot-dependencies BOOT-INF/lib/library3-SNAPSHOT.jar
application META-INF/MANIFEST.MF
application BOOT-INF/classes/a/b/C.class
이 계층화는 응용 프로그램 빌드 간에 변경될 가능성에 따라 코드를 분리하도록 설계되었습니다. 라이브러리 코드는 빌드 간에 변경될 가능성이 적기 때문에 도구가 캐시에서 레이어를 다시 사용할 수 있도록 자체 레이어에 배치됩니다. 응용 프로그램 코드는 빌드 간에 변경될 가능성이 높므로 별도의 계층에서 격리됩니다.
Maven의 경우 포장 계층화된 항아리 섹션을 참조하여 용기에 레이어 인덱스를 추가하는 방법에 대한 자세한 내용을 확인하십시오. Gradle의 경우 Gradle 플러그인 문서의 포장 계층화된 항아리 섹션을 참조하십시오.
4.31.2. 도커파일 작성
레이어 인덱스 파일이 포함된 항아리를 만들면 항아리가 jar에 종속성으로 추가됩니다. 클래스경로에 이 jar을 사용하면 부트스트랩 코드가 레이어를 추출하는 것과 전혀 다른 것을 실행할 수 있는 특수 모드에서 응용 프로그램을 시작할 수 있습니다. 항아리 모드로 항아리를 시작하는 방법은 다음과 같습니다.spring-boot-jarmode-layertools
layertools
$ java -Djarmode=layertools -jar my-app.jar
이렇게 하면 다음과 같은 출력이 제공됩니다.
Usage:
java -Djarmode=layertools -jar my-app.jar
Available commands:
list List layers from the jar that can be extracted
extract Extracts layers from the jar for image creation
help Help about any command
이 명령을 사용하여 응용 프로그램을 도커파일에 추가할 레이어로 쉽게 분할할 수 있습니다. 다음은 .를 사용하는 Dockerfile의 예입니다.extract
jarmode
FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
위의 디렉터리에 있다고 가정하면 다음 예제와 같이 Docker 이미지를 빌드하거나 응용 프로그램 jar에 대한 경로를 선택적으로 지정할 수 있습니다.Dockerfile
docker build .
docker build --build-arg JAR_FILE=path/to/myapp.jar .
이것은 다단계 도커파일입니다. 빌더 스테이지는 나중에 필요한 디렉토리를 추출합니다. 각 명령은 jarmode에서 추출한 레이어와 관련이 있습니다.COPY
물론, Dockerfile는 jarmode를 사용하지 않고 작성할 수 있습니다. 일부 조합을 사용하고 사물을 올바른 레이어로 이동할 수 있지만 jarmode는 이를 단순화합니다.unzip
mv
4.31.3. 빌드팩
Dockerfiles는 Docker 이미지를 빌드하는 한 가지 방법입니다. Docker 이미지를 빌드하는 또 다른 방법은 빌드팩을 사용하여 메이븐 또는 그라드 플러그인에서 직접 사용하는 것입니다. 클라우드 파운드리 나 헤로쿠와 같은 응용 프로그램 플랫폼을 사용한 적이 있다면 빌드팩을 사용했을 것입니다. Buildpacks는 응용 프로그램을 가져와 플랫폼이 실제로 실행할 수 있는 플랫폼으로 변환하는 플랫폼의 일부입니다. 예를 들어 Cloud 주조리의 Java 빌드팩은 파일을 푸시하고 관련 JRE를 자동으로 추가하는 것을 알 수 있습니다..jar
클라우드 네이티브 빌드팩을 사용하면 어디서나 실행할 수 있는 Docker 호환 이미지를 만들 수 있습니다. 스프링 부트에는 메이븐과 그라드 모두에 대한 빌드팩 지원이 직접 포함되어 있습니다. 즉, 단일 명령을 입력하고 로컬에서 실행되는 Docker 데몬에 합리적인 이미지를 빠르게 얻을 수 있습니다.
4.32. 다음 읽을 거리
이 섹션에서 설명하는 클래스에 대해 자세히 알아보려면 Spring Boot API 설명서를 확인하거나 소스 코드를 직접탐색할 수 있습니다. 구체적인 질문이 있는 경우 방법 섹션을 살펴보십시오.
스프링 부트의 핵심 기능에 익숙한 경우 프로덕션 준비 기능에 대해 계속 읽고 읽을 수 있습니다.
Spring Boot Reference DocumentationPhillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott FrederickLegal2.3.1.RELEASE Copyright © 2012-2020 Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. |
출처 : https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#boot-features-kotlin