Kotlin logo

Kotlin

A concise multiplatform language developed by JetBrains

Java 개발자를 위한 Kotlin 시작하기

Read this post in other languages:

게스트 기사 작성자: Urs Peter, 수석 소프트웨어 엔지니어 겸 JetBrains 인증 Kotlin 트레이너. 더 체계적인 방법으로 Kotlin 역량을 높이고 싶은 독자를 위해 Urs는 Xebia Academy에서 Kotlin 역량 강화 프로그램도 운영합니다.

이 글은 Java 기반 환경에서 Kotlin을 성공적으로 도입하기 위한 완벽 가이드라는 제목의 시리즈 중 첫 번째 글입니다. 이 시리즈는 한 개발자의 호기심에서 시작하여 회사 전체의 변화로 이어지는 과정을 통해 실제 팀 내에서 Kotlin 도입이 어떻게 점진적으로 확대되는지 보여줍니다.


Kotlin으로의 전환은 하룻밤 사이에 이루어질 수 있는 일이 아닙니다.

투자를 두 배로 늘리기 전에 위험을 제거하고,

철저한 평가를 실시하고, 성과를 달성하세요.

이미 Java가 자리 잡은 환경에서 Kotlin을 도입하려면 단순히 기술적인 결정이 아니라 신중한 계획, 전략적 사고, 그리고 가장 중요한 것으로 동료의 지원과 이해를 얻는 과정이 필요합니다.

1,000명이 넘는 개발자를 교육하고 수많은 조직이 Kotlin으로 성공적으로 전환하도록 도운 경험을 통해 어떤 접근 방식이 효과적이고 효과적이지 않은지 알게 되었습니다. 이 가이드에서는 첫 실험적 시도부터 대규모 조직적 전환까지, 오랜 기간에 걸쳐 수집한 Kotlin 도입의 성공 사례를 안내합니다.

여기서는 여러분을 다음과 같은 여정으로 안내합니다.

  • 변화의 시작은 언제나 나로부터!
  • 시험 단계: 소규모 테스트부터 시작
  • 평가 단계: 시험 단계를 벗어나 Kotlin 사용 확장
  • 공감 얻기: 동료 개발자로부터 인정과 지원 받기
  • 경영진 설득: Kotlin의 비즈니스 사례 확립
  • 대규모 Kotlin 도입의 성공 요인
  • Kotlin으로 갈 것인가, 말 것인가 그것이 문제로다: 원하는 회사의 미래는 무엇인가?

변화의 시작은 언제나 나로부터!

변화의 시작은 언제나 나로부터!

굳이 Kotlin으로 전환해야 하나요? Java를 계속 사용하면 되지 않나요? 

대답은 여러 가지 요인에 따라 달라집니다. 데이터에 따르면 Kotlin이 여러 면에서 장점이 있는 것은 분명하지만, 결정은 순전히 기술적인 이유로 내려지지 않습니다. 사람들의 주관적인 선호도(“나는 내 언어를 좋아하기 때문에 좋아한다”)와 새로운 것에 대한 회의적 태도(일반적으로 좋은 현상)가 중요한 역할을 합니다.

하지만 프로그래밍 언어의 진화를 보면 우리의 선호도와 요구 사항도 시간이 지남에 따라 변한다는 것을 알 수 있습니다. 가장 중요한 점은, 새로운 세대의 언어가 나올 때마다 새로운 패러다임(Null 안전성, 간결하고 가벼운 구문, 기본 구성 요소로서의 함수, 풍부한 표준 라이브러리, 비동기 동시성, 멀티플랫폼 지원, 생성형 AI 친화성 등)이 통합되어 개발자와 조직에 결정적인 이점을 제공한다는 것입니다.

이러한 자연스러운 진화가 없었다면 우리는 아직도 COBOL이나 다른 고대 언어로 모든 코드를 작성하고 있었을 것이고, 이는 확실히 오늘날의 요구 사항을 충족하지 못했을 것입니다. 그러므로 진화는 선택이 아니라 업계 역사의 불가피한 부분입니다.

하지만 기술적 이점만으로는 그러한 변화가 회사에 뿌리를 내리기에 충분하지 않습니다. 이를 위해서는 추진자, 즉 새로운 패러다임을 실제로 탐구하고, 지지하고, 그 가치를 입증하려는 사람이 필요합니다. 제 경험에 따르면 Kotlin 도입을 촉진하는 엔지니어는 일반적으로 세 가지 유형이 있습니다.

  1. 실용적이고 생산성 지향적인 Java 엔지니어: Java를 종교가 아닌 도구로 보는 숙련된 개발자입니다. 이들은 끊임없이 작업을 더 빨리 완료할 수 있는 더 나은 방법을 찾습니다.
  2. 품질을 중시하는 최신 언어 애호가: 코드 가독성, 간결성, 유지 관리를 우선시하는 엔지니어입니다. 이들은 이전에 Scala로 전환한 경우가 많습니다.
  3. 초보 개발자: “Kotlin을 사용할 수 있는데 왜 Java를 사용해야 하나요?”와 같이 단순하지만 강렬한 질문을 던지는 초보자입니다. 수년간의 Java 경험이라는 부담이 없기 때문에, Kotlin은 이들에게 고민할 필요도 없는 선택지인 경우가 많습니다.

여러분은 어느 그룹에 속하나요?

이러한 초기 도입자들은 변화의 첫 시작을 밝힙니다. 하지만 어떻게 시작해야 할까요? 계속 읽어보세요. ;-)

시험 단계: 소규모 테스트부터 시작

Kotlin에 대해 들어보았고, 본격적으로 채택하기 전에 시험적으로 사용해 보고 싶을 수 있습니다.

가장 먼저 필요한 것은 여러분의 첫 번째 Kotlin 씨앗을 심을 수 있는 개발자 도구입니다. 다음과 같은 몇 가지 선택지가 있습니다.

  • https://play.kotlinlang.org/는 Kotlin 코드를 간단히 입력하고 실행할 수 있는 훌륭한 온라인 워크숍으로, JVM뿐만 아니라 다른 다양한 플랫폼(JS, WASM 등)에서도 실행할 수 있습니다.Kotlin 플레이그라운드
  • Kotlin Notebook은 IntelliJ IDEA의 강력한 기능으로, 종속성을 쉽게 가져오고, 코드를 실행하고, 데이터를 처리하고 차트를 만드는 작업까지 수행할 수 있습니다. 다음 예시는 Spring의 RestClient를 사용하여 REST 호출을 수행하기가 얼마나 쉬운지 보여줍니다.Kotlin Notebook
  • IntelliJ IDEA는 Kotlin에 대한 최고 수준의 지원을 제공합니다. 이는 놀라운 일이 아닙니다. JetBrains가 Kotlin의 제작자이고 IntelliJ IDEA의 많은 부분이 Kotlin으로 작성되었기 때문입니다. 따라서 IntelliJ IDEA에서 Kotlin을 사용하기가 아주 간단하고, 기존 Java 프로젝트에서도 마찬가지입니다.
    • Maven의 경우, 간단히 kotlin-maven-plugin과 Kotlin 표준 라이브러리인 kotlin-stdlib만 구성하면 됩니다.
    • Gradle의 경우 Kotlin 플러그인을 구성해야 합니다.

…그러면 이제 시작할 수 있습니다!

  • 여기서 끝이 아닙니다! JetBrains는 최근 Kotlin 언어 서버를 출시하여 VS Code와 같은 IntelliJ IDEA 이외의 IDE에서도 완벽한 기능을 갖춘 Kotlin 개발 환경을 제공했습니다. 관련 웹사이트: https://github.com/Kotlin/kotlin-lsp

이제 원하는 개발 환경에서 Kotlin 코드를 작성할 수 있습니다. 최소한의 영향으로 최대의 인사이트를 얻으면서 실제 환경에서 언어를 평가하려면 어떻게 해야 할까요? 기존 Java 프로젝트의 테스트 기능을 이용하면 됩니다!

Kotlin을 안전하고 현실적으로 시험해볼 수 있는 이 방법에는 몇 가지 장점이 있습니다.

  • 낮은 위험: 테스트로 인해 프로덕션 코드에 영향을 미치지 않습니다.
  • 학습 기회: 익숙한 환경에서 언어의 특징을 살펴볼 수 있습니다.
  • 점진적인 도입: 팀원들이 압박감 없이 Kotlin 구문에 익숙해질 수 있습니다.

  1. Kotest + MockK 사용하기: Kotlin의 테스트 DSL(도메인 특정 언어)이 가진 표현력을 즉시 경험할 수 있습니다. 여기에는 기능이 풍부한 어설션(shouldHaveSize(...)), infix(value shouldBe 1) 등이 포함됩니다.
  2. Java 스트림 대신 간결하면서도 강력한 Kotlin 컬렉션을 사용하세요.
  3. Null 가능 타입, 구조 분해, 불변성(val, data classes), 표현식 구문(when, try-catch, if else) 등 다양한 언어 기능을 경험해 보세요.

다음과 같은 결과를 얻게 됩니다.

Java

@Test
void shouldGetAverageRating() {
   when(productRepository.findAll()).thenReturn(products);

   Map ratings = productService.averageRatings();

   assertAll(
           () -> assertThat(ratings).hasSize(4),
           () -> assertEquals(ratings, products
                   .stream()
                   .collect(Collectors.groupingBy(
                           Product::getName,
                           Collectors.flatMapping(
                                   p -> p.getRatings()
                                    .stream()
                                    .mapToDouble(Integer::doubleValue)
                                    .boxed(),   
                              Collectors.averagingDouble(Double::doubleValue)
                           )))
           )
   );
   verify(productRepository).findAll();

}

Kotlin

@Test
fun `should get average rating`() { //descriptive tests using ``
   every { productRepository.findAll() } returns products

   val ratings = productService.averageRatings()

   assertSoftly(ratings) { 		//powerful testing DSLs (Kotest)
       shouldHaveSize(4)
       this shouldBe productRepository.findAll()
           .groupBy { it.name }   			//concise collections
           .mapValues { (_, products) -> 		//destructuring
                  products.flatMap { it.ratings }.average() }
   }
    verify { productRepository.findAll() }
}

시리즈의 다음 게시물

Kotlin 도입은 보통 한 사람이 사용해 보고 몇 가지 테스트가 유용한 것으로 입증되면서 시작됩니다. 이러한 초기 탐색 과정은 자연스럽게 더욱 대담한 목표로 이어집니다. 즉, 실제 프로젝트에서 Kotlin을 평가하는 것입니다.

이 시리즈의 다음 게시물에서는 이 단계를 다루고 프로덕션 환경에서 Kotlin을 테스트하는 방법을 설명합니다.

Urs Peter

Urs는 20년 이상에 걸쳐 Kotlin과 Scala를 주로 사용하여 복원력 있고 확장 가능하며 임무 수행에 필수적인 시스템을 구축한 풍부한 경험을 가진 소프트웨어 엔지니어이자 솔루션 아키텍트, 콘퍼런스 연사, 트레이너입니다.

컨설턴트로 활동하는 외에도 열정적인 트레이너로서 Kotlin 및 Scala 언어 과정부터 마이크로서비스 및 이벤트 기반 아키텍처에 대한 아키텍처 교육까지 광범위한 주제를 다루는 다양한 교육 과정을 저술했습니다.

천성적으로 사교적인 사람으로, 모임과 콘퍼런스에서 지식을 공유하고 동료들과 영감을 나누는 것을 좋아합니다. Urs는 JetBrains 인증 Kotlin 트레이너입니다.

image description

Discover more