최근 많은 프로젝트들이 SpringBoot + Kotlin
으로 구축되고 있습니다.
이전에 SpringBoot + Java
구조를 점차 대체해 나가고 있습니다.
대규모 서비스를 Kotlin으로 개발하는 이유가 뭘까요?
오늘은 Kotlin의 배경과 특징을 알아보겠습니다.
코틀린은 JetBrains에서 2011년에 공개한 오픈 소스 프로그래밍 언어
입니다.
JVM을 기반으로 Java 보다 간결한 문법과 다양한 기능을 제공합니다.
특히 2017년에 안드로이드 공식 언어로 채택 되면서 주목 받고 있습니다.
또한 오라클 자바의 저작권 이슈도 코틀린의 활성화에 한 몫을 하고 있습니다.
이제는 서버 사이드 개발에서 코틀린이 우선 채택되고 있습니다.
생산성 향상과 코드량 감소
를 무기로 서서히 자바 시장을 잠식해 가고 있습니다.
물론 자바의 아성이 쉽게 무너지지는 않을 겁니다.
그 동안 수 많은 언어들이 자바에게 도전했지만, 결국엔 무릎을 꿇었기 때문입니다.
그래도 현재까지 코틀린이 보여준 생산성과 편의성은 자바를 위협하기에 충분합니다.
결국 코틀린과 자바의 싸움은 결국 업데이트 싸움입니다.
자바의 다음 업데이트에 어떤 무기가 있을지 궁금하군요.
코틀린 공식 사이트에서는 코틀린을 써야 하는 이유를 간단하게 설명합니다.
현대적이고 간결하며 안전한 프로그래밍 언어라고 합니다.
Modern, concise and safe programming language
Easy to pick up, so you can create powerful applications immediately.
클래스에 변수를 선언하면 자동으로 부가 정보가 생성됩니다.
그리고 싱클톤과 함수 지정도 간단하게 가능합니다.
또한 new 키워드도 필요 없습니다.
data class Employee( val name: String, val email: String, val company: String ) // + automatically generated equals(), hashCode(), toString(), and copy() object MyCompany { // A singleton const val name: String = "MyCompany" } fun main() { // Function at the top level val employee = Employee("Alice", // No `new` keyword "alice@mycompany.com", MyCompany.name) println(employee) }
자바에서 가장 자주 접하며 피곤한 오류가 바로 NPE(Null Point Exception)입니다.
코틀린은 Null을 허용하며 타입까지 지원해서 NPE로 부터 자유롭습니다.
fun reply(condition: Boolean): String? = // Nullability is part of Kotlin’s type system if (condition) "I'm fine" else null fun error(): Nothing = // Always throw an exception throw IllegalStateException("Shouldn't be here") fun main() { val condition = true // Try replacing `true` with `false` and run the sample! val message = reply(condition) // The result is nullable // println(message.uppercase()) // This line doesn't compile println(message?.replace("fine", "okay")) // Access a nullable value in a safe manner if (message != null) { // If you check that the type is right, println(message.uppercase()) // the compiler will smart-cast it for you } val nonNull: String = // If the null-case throws an error, reply(condition = true) ?: error() // Kotlin can infer that the result is non-null println(nonNull) }
개발에 필요한 다양한 표현식을 간결하고 편리하게 사용할 수 있습니다.
val map = mapOf(1 to "one", 2 to "two") for ((k, v) in map) { // Traverse a map or a list of pairs println("$k -> $v") } fun obtainKnowledge() = Pair("The Answer", 42) // Single-expression functions val (description, answer) = obtainKnowledge() // Destructure into a pair of two variables println("$description: $answer") getText()?.let { // Apply an action to a nullable expression sendEmailTo("alice@example.com", it) // if it’s not null } createEmptyWindow() .apply { // Configure properties of an object width = 300 height = 200 isVisible = true }.also { w -> // Perform an additional operation on a call chain showWindow(w) } val fixedIssue = issueById["13456"] ?.takeIf { it.status == Status.FIXED } // Use the value only if the condition is true println(fixedIssue)
JVM을 사용하는 라이브러리나 프레임워크와 호환이 가능합니다.
그래서 자바와 함께 사용할 수 있습니다.
// Use any existing JVM library or framework // Call Kotlin code from Java without an issue @SpringBootApplication class DemoApplication fun main(args: Array<String>) { runApplication<DemoApplication>(*args) } @RestController class MessageResource { @GetMapping fun index(): List<Message> = listOf( Message("1", "Hello!"), Message("2", "Bonjour!"), Message("3", "Privet!"), ) } data class Message(val id: String?, val text: String)
다양한 플랫폼을 지원합니다.
아래 그림을 보면 이해가 쉬워집니다.