Kotlin
A concise multiplatform language developed by JetBrains
Kotlin을 사용한 생산적인 서버측 개발: 업계 사례
Kotlin은 Java의 대안으로 만들어졌습니다. 즉, JVM 에코시스템 내에서의 애플리케이션 영역은 Java와 동일합니다. 여기에는 서버측 개발이 당연히 포함됩니다.
저희는 사용자가 서버측 애플리케이션 개발에 Kotlin을 이용했던 경험을 듣고 이 경험을 커뮤니티와 공유하려고 합니다!
Kotlin은 최근 몇 년 동안 Android 에코시스템에서 엄청난 성장을 이뤘습니다. 서버측 개발에 Kotlin을 채택하는 추세도 꾸준히 늘고 있습니다. 그러나 서버측 개발에 Kotlin의 채택을 고려 중인 회사로부터 종종 듣는 질문은 “이런 작업에 Kotlin을 이용하는 곳이 또 어디있나요?”입니다.
회사는 기술을 선택할 때 올바른 결정을 내리기를 원합니다. 그들은 다른 회사들도 동일한 목적으로 이러한 기술을 채택하고 성공을 거두고 있음을 확인하고 싶어합니다.
이 게시글에서는 서버측 개발에 Kotlin을 채택한 몇몇 회사들을 간략하게 소개합니다. 동일한 목적으로 Kotlin 채택을 고려 중이라면 이 글이 결정을 내리는 데 도움이 되기를 바랍니다.
이 블로그 게시글은 Kotlin 1.4 온라인 이벤트의 발표 내용을 바탕으로 합니다. YouTube 채널에서 전체 동영상을 볼 수 있습니다.
Kotlin이어야 하는 이유는?
우리는 Kotlin을 사용하는 개발자들과 끊임없이 이야기하면서 서버측 개발에 Kotlin을 사용하는 크고 작은 회사에 대해 알게 되었습니다. 우리는 기업들이 Kotlin을 선택하는 이유는 무엇이고 그들이 Kotlin을 통해 얻는 이점은 무엇인지 알아보는 데 늘 관심을 가지고 있습니다.
Kotlin에는 멋진 기능들이 많지만 저희와 대화를 나눈 사용자들이 가장 마음에 들어했던 기능을 집중 조명하겠습니다.
- 간결한 구문. 언어의 표현력이 높으면 코드가 간결해집니다. 작성할 코드가 적을수록 최종 애플리케이션에 슬그머니 자리를 잡는 버그가 줄어들고, 최종 코드의 유지 관리가 쉬워집니다.
- Null-안전성. 이것은 개발자들이 가장 좋아하는 Kotlin 기능입니다. Kotlin의 유형 체계는 The Billion Dollar Mistake(10억 달러짜리 실수)라고도 알려진 null 참조가 코드에서 발생할 위험을 제거하는 것을 목적으로 하고 있습니다. 이 추가적인 안전 기능은 Kotlin의 컴파일러에 내장되어 있으므로 null 값을 역참조하는 문제가 줄어듭니다.
- Jave 상호 운용성. 호스트 플랫폼과의 상호 운용성은 생산성을 크게 높여줍니다! Kotlin을 사용하면 모든 프레임워크 및 라이브러리와 함께 Java 에코시스템을 활용할 수 있습니다. 또한 모든 Java 코드를 Kotlin으로 변환하지 않고도 기존 Java 프로젝트에 Kotlin을 점진적으로 도입할 수도 있습니다.
- Kotlin 코루틴. 명령형 프로그래밍 모델을 사용하여 비동기 코드를 쉽게 마스터할 수 있는 방법을 제공합니다. 코루틴은 많은 시스템 리소스를 절약하기 때문에 IO 작업이 많은 고부하 서버측 애플리케이션을 개발하는 데 특히 유용합니다. 코루틴 지원이 Spring Framework에 추가되면서 서버측 개발자가 이 기능을 이용하기가 더 쉬워졌습니다.
- Kotlin Multiplatform. Kotlin을 사용하는 개발자는 JVM, JavaScript, Android, iOS, 심지어 네이티브 애플리케이션과 같은 다양한 플랫폼을 개발 대상으로 삼을 수 있습니다. 서로 다른 플랫폼에서 실행되는 서로 다른 애플리케이션 사이에 코드를 공유하면 장점이 많은 것으로 나타났습니다.
이제 Kotlin 채택으로 개발을 한 단계 더 진전시킨 몇 가지 예를 살펴 보겠습니다.
JetBrains Space: 코드를 최대한 많이 재사용
JetBrains에서 Kotlin을 사용한다는 사실이 그리 놀랍지는 않을 것입니다. Kotlin은 도구뿐만 아니라 서비스에도 사용됩니다. KotlinConf 2019에서 발표된 팀 협업 플랫폼인 JetBrains Space는 Kotlin 및 Ktor 프레임워크로 구축되었습니다. Space는 JVM에서 실행되는 서버측 서비스, Android 애플리케이션, iOS 애플리케이션, 웹 애플리케이션, IDE 플러그인 등 모든 부분에 Kotlin을 사용합니다.
Kotlin Multiplatform 덕분에 코드의 상당 부분이 이러한 모든 애플리케이션 사이에서 공유됩니다. UI 및 서버측 코드에서 데이터 모델을 공유하는 것 외에도 Space는 뷰 모델, 유효성 검사 논리 및 공통 라이브러리도 공유합니다. 그러나 UI 구성 요소는 플랫폼별로 다르기 때문에 Kotlin 코드가 대상으로 하는 각 플랫폼의 상호 운용성도 중요합니다.
Kotlin Multiplatform
Kotlin이 여러 플랫폼에 대한 개발을 어떻게 지원하는지 쉽게 이해할 수 있게 다음 예를 살펴 보겠습니다. 여러 플랫폼(JVM, JavaScript, iOS)에 사용하려는 데이터 클래스가 있다고 가정해 보겠습니다.
String 클래스는 Kotlin의 표준 라이브러리에 속하지만 LocalDate에는 속하지 않습니다. 애플리케이션이 대상으로 하는 각 플랫폼에 대해 LocalDate로 사용할 클래스를 지정할 수 있습니다. 이를 위해, 서로 다른 모듈이 실제 구현을 제공한다고 가정하고 여러 플랫폼 사이에서 공유되는 공통 모듈에서 expect 키워드를 사용하여 LocalDate 클래스를 선언합니다. actual 키워드는 플랫폼별 코드에서 사용해야 하는 유형을 나타냅니다.
플랫폼을 특정하지 않은 코드는 프로젝트의 공통 모듈에서 한 번만 작성할 수 있습니다. 그러면 특정 플랫폼을 대상으로 하는 다른 모듈에서 공통 코드를 재사용합니다.
멀티플랫폼 개발을 위한 Kotlin 지원은, Android와 iOS 애플리케이션 사이에서 코드를 공유하는 데 이를 사용하는 모바일 개발자에게 특히 인기가 있습니다. 이에 대한 자세한 내용은 Kotlin Multiplatform Mobile 웹 사이트에서 확인할 수 있으며 다른 회사에서 이 기술을 사용한 사례를 읽어볼 수 있습니다.
Jira 소프트웨어: Kotlin 및 Spring Boot를 사용하는 마이크로서비스
또 다른 흥미로운 예는 Atlassian의 Jira입니다. Kotlin은 Atlassian에서 Jira Software 클라우드 제품 개발에 사용됩니다.
Jira는 사용자가 서버에 설치하던 독립실행형 모놀리식 Java 애플리케이션이었습니다. 그러나 Jira 클라우드가 도입됨에 따라 확장성을 높이기 위해 애플리케이션을 여러 서비스로 분해해야 할 필요성이 대두되었습니다.
클라우드로의 이동은 기술 스택을 업데이트할 수 있는 기회를 만들었으며 이것이 Kotlin이 등장하게 된 배경입니다. 개발자들은 이 언어 채택에 매우 만족했고, 만족감과 함께 생산성이 향상되었습니다! 이제 개발자들은 Spring Boot와 함께 Kotlin을 사용하여 중요한 사용자 경험을 강화하는 마이크로서비스를 구현하고 있습니다. Kotlin 및 Spring은 Jira Software, Jira Service Desk 및 Jira Core 등 전체 Jira 클라우드 제품군에서 사용됩니다.
Adobe: Kotlin 코루틴으로 고부하 서비스의 제약으로부터 해제
Adobe Experience Platform 팀이 서버측 개발에 Kotlin을 선호하는 이유에 대한 생각을 공유했습니다.
이 팀은 애플리케이션 백엔드가 모놀리식 Web 컨테이너에서 데이터 기반 애플리케이션의 분산 메시 구조로 진화했다고 말합니다. 이러한 애플리케이션은 많은 데이터를 처리하고 메세지를 수신 및 전송해야 하기 때문에, 지연 시간이 무엇보다 중요합니다.
그들은 서버측 개발에 Kotlin을 사용할 때의 주요 이점을 게시글에 남겼습니다. 또한 비동기 프로그래밍에 대한 지원이 가장 유익한 Kotlin 기능이라고 했습니다. Kotlin 코루틴은 결과 코드가 간단하고 유지 관리가 쉬워 “배우기 쉬운”이라는 표현으로 잘 설명됩니다.
“Kotlin을 사용하면 블로킹, 명령형 코드와 거의 유사하게 읽히는 ‘직접적 스타일’로 코드를 작성할 수 있습니다.”
애플리케이션은 상당히 I/O 집중적이어서 대기열, 다양한 데이터베이스 및 기타 서비스 등 외부 서비스에 의존해야 합니다. 그리고 이러한 네트워크 호출은 애플리케이션 처리량을 쉽게 저하시킬 수 있습니다. 따라서 Kotlin 코루틴은 이러한 사용 사례에 즉시 매력적으로 느껴졌습니다. 비동기식으로 전환하면 전체 처리량이 향상되고 결과적으로 하드웨어 리소스가 절약됩니다.
다른 이점들은 데이터 클래스, 안정적인 유형 체계, null 안전성 및 함수형 프로그래밍 지원 등 Kotlin이 가진 주요 언어적 기능들입니다. Kotlin의 유연한 구문을 사용하면 내부 DSL을 쉽게 만들 수 있습니다. 이것도 Adobe 엔지니어에게 매우 유용했던 부분인 것으로 보입니다. 이 팀은 Kotlin으로 DSL을 구축한 경험을 소개한 글도 작성했습니다.
Expedia Group: Kotlin을 이용한 GraphQL API 빌드
Expedia는 null-안전성이 보장된 컴파일러, 언어의 간결함 및 완전한 Java 상호 운용성을 이유로 Kotlin을 채택했습니다. Java와의 상호 운용성 덕분에 애플리케이션을 완전히 다시 작성하지 않고도 점진적으로 Kotlin을 통합할 수 있었습니다. Java 상호 운용성은 또한 Expedia가 Kotlin 애플리케이션을 Java 라이브러리와 쉽게 통합하고 기존 JVM 에코시스템을 완전히 활용할 수 있는 토대가 되었습니다.
Kotlin 코루틴은 이 언어가 광범위하게 채택되는 데 중요한 기여를 했습니다. 이를 통해 개발자는 명령형 방식으로 완전히 비동기식 코드를 작성할 수 있으므로 더 읽기 쉽고 유지 관리하기 쉬운 코드가 생성됩니다. Spring Framework는 Expedia에서 광범위하게 사용되며, 버전 5.2부터는 WebFlux와 코루틴 간의 상호 운용성도 확보되어 있습니다. Expedia 엔지니어들에게 이것은 Spring과 Reactive 스택을 보다 명령적으로 활용할 수 있게 해준 획기적인 전환점이었습니다.
최근, Expedia는 GraphQL로 전환하고 모든 프런트엔드 애플리케이션을 지원하는 단일 API 게이트웨이를 구축하기로 결정했습니다. 이를 위해 Kotlin의 강력한 리플렉션 라이브러리를 적용하여 소스 코드에서 직접 GraphQL 스키마를 생성했습니다. 이렇게 만들어진 라이브러리 세트인 graphql-kotlin은 매우 유용한 것으로 평가 받고 있습니다. 이러한 라이브러리는 오픈 소스였으며 이제 GitHub에서 호스팅됩니다.
KotlinConf 2019에서 Dariusz Kuc와 Guillaume Scheibel은 graphql-kotlin과 함께 Spring Boot의 기능을 활용하는 방안에 대해 발표 했습니다. 여기에서 그 발표를 다시 시청할 수 있습니다.
요약
이 게시글에서는 서버측 개발을 위한 Kotlin 채택의 몇 가지 예를 살펴보았습니다. JetBrains, Adobe, Expedia 및 Atlassian에서 Kotlin은 성능 지표에 매우 민감한 비즈니스에 중요한 애플리케이션을 지원합니다. 이는 Kotlin이 웹 애플리케이션 및 서비스 개발에 적합한 성숙한 프로그래밍 언어임을 보여줍니다.
이 게시물은 Anton Arhipov가 작성한 Productive Server-Side Development With Kotlin: Stories From The Industry를 번역한 글입니다.