백엔드 개발을 위한 Kotlin 사용: 간략한 개요
게시 됨: 2022-03-112017년 5월 Google에서 Android 개발의 공식 언어가 될 것이라고 발표했기 때문에 기본 Android 개발자에게 Kotlin을 소개할 필요가 없습니다. 그 이후로 새롭고 빛나는 Android 앱을 개발하기 위한 기본 언어 선택으로 많은 관심을 받았습니다. Java의 고충을 많이 해결해 주므로 새 앱은 대부분 그 안에 작성되고 이전 앱은 그 안에 다시 작성됩니다.
애플리케이션의 프론트엔드 측면에서 훌륭하다는 데는 의심의 여지가 없으며, Kotlin을 처음 언급하면 대부분의 사람들이 이를 Android OS와 연관시킵니다. 그러나 이 기사에서는 백엔드 언어로서의 Kotlin에 대해 이야기하고 내 Android 취미 프로젝트를 위해 빠르고 안정적이며 비동기식 Kotlin 백엔드를 만드는 것에 대한 내 이야기를 공유하고 싶습니다. 이 기사의 범위를 벗어나므로 프로젝트가 무엇에 관한 것인지 논의하지 않겠습니다. 그보다는 내가 Kotlin을 선택한 이유와 Kotlin이 서버 측 애플리케이션이나 REST API를 작성하는 데 훌륭한 언어라고 생각하는 이유를 설명하는 데 집중할 것입니다.
왜 코틀린인가?
내 여행의 맨 처음으로 돌아가 보자. 저는 항상 기업가적 야망을 가지고 있었고, 이 길의 첫 번째 단계는 스스로 무언가를 만드는 것이라고 생각했습니다. 거창한 것도, 세상을 바꾸는 것도 없고, 나와 내 가족과 친구들이 사용할 수 있는 작은 것뿐입니다. 합리적인 생각을 하고 나서 바로 실행에 옮겼습니다. 프로젝트를 시작할 때 가장 먼저 하는 일은 도구를 선택하는 것입니다. 결국 올바른 도구 세트는 장기적으로 많은 시간과 비용을 절약할 수 있습니다. 그래서 이것이 내가 한 일입니다.
저는 주로 Java 개발자입니다. Java와 Spring을 사용하여 여러 백엔드 시스템과 REST API를 작성했으며 이 두 가지가 이러한 작업을 수행하기 위한 훌륭한 도구라고 생각합니다. Java 자체는 포괄적인 언어이지만 Spring과 결합하면 구현할 수 없는 것이 없습니다.
그러나 수프에는 작은 머리카락이 하나뿐입니다. 다변. Spring과 최신 버전의 Java가 많은 도움이 되지만 여전히 많은 상용구 코드를 처리해야 합니다. 그리고 한 번 위대한 사람이 나에게 말했듯이 - 가장 안전하고 가장 신뢰할 수 있으며 버그가 없는 코드는 기록되지 않은 코드입니다. 예를 들어 다음과 같은 간단한 Java 클래스를 살펴보십시오.
public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
내 생각에 이것은 단순히 "두 개의 읽기 전용 필드가 있는 클래스를 원합니다."라고 말하는 많은 코드입니다. 최악의 부분은 생성자와 메소드가 자동 생성되었다는 것입니다. 그래도 풀 리퀘스트를 검토할 때 항상 검토하게 됩니다. 왜냐하면 그것이 당신에게 필요한지 아닌지 알 수 없기 때문입니다. 물론, 이것은 Lombok과 같은 타사 라이브러리를 사용하여 단축할 수 있지만 기본적으로 이 작업을 수행할 수 있다면 좋지 않을까요? Kotlin에서 이와 동일한 클래스를 살펴보겠습니다.
class Person( val name: String, val age: Int )
확실히 더 짧고 간단합니다. 변수는 val 키워드를 사용하므로 최종적입니다. 생성자와 getter는 컴파일 타임에 생성됩니다. 변경할 수 없는 person 객체를 원하지 않는 경우 val 을 var 로 변경하면 됩니다. 짜잔, 변경할 수 있는 사람이 있으므로 한 글자만 변경하면 됩니다.
간단한 Java POJO 클래스에서 내가 두 번째로 좋아하는 부분은 재정의된 equals()
및 hashCode()
입니다. 이것들은 대부분 다시 자동 생성되지만 확인하기 위해 항상 검토해야 합니다. 좋은 소식은 Kotlin도 이를 처리할 수 있다는 것입니다. class
를 data class
로 변경하기만 하면 equals()
및 hashCode()
를 즉시 얻을 수 있습니다.
data class Person( val name: String, val age: Int )
요컨대, 나는 Java를 사랑하지만 짧은 시간에 가능한 한 빨리 내 프로젝트를 위한 최소한의 실행 가능한 제품을 만들고 싶었습니다. 그리고 소프트웨어 개발의 경우 이를 달성하는 가장 간단한 방법은 코드를 적게 작성하는 것입니다. 따라서 백엔드 개발을 위한 더 나은 언어에 대한 검색은 계속되었습니다. 이런 생각을 하며 먼저 Node.js로 넘어갔습니다. 몇 가지 중요한 이점이 있습니다. 몇 줄만 있으면 Express 서버가 작동하여 실행되고 포트 8080에서 수신 대기하고 Hello World로 응답합니다! get 요청을 보낼 때마다.
let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);
쉽고 간단하며 빠릅니다. 가장 인기 있는 프로그래밍 언어 중 하나에서 기대할 수 있는 것입니다. 저는 JavaScript로 작업하는 것을 즐깁니다. 잠시 동안 올바른 도구를 찾았다고 생각했지만 JavaScript가 동적으로 입력된다는 사실에 마음이 아팠습니다. 오해하지 마세요. 저는 동적 타이핑이 프런트 엔드에서 훌륭하다고 생각하지만 제 경험상 정적으로 타이핑된 백엔드를 사용하면 유형 불일치로 인해 런타임에 서버가 충돌할 가능성이 적다는 추가 확신을 얻을 수 있습니다. . 그리고 솔직히 말해서 백엔드가 수십만 명의 사용자에게 서비스를 제공할 때 실제로 그런 일이 발생하기를 원하지 않습니다. 그러나 Node.js는 비동기 코드와 서비스를 쉽게 작성할 수 있는 한 가지 훌륭한 기능을 제공했습니다.
이러한 요구 사항을 염두에 두고 Kotlin에서도 Kotlin Android 백엔드를 작성하기로 결정했습니다.
Kotlin: 빠른 개요
Kotlin에 대해 들어 본 적이 없는 분들을 위해 Kotlin은 객체 지향 프로그래밍과 함수형 프로그래밍을 모두 지원하는 정적 형식의 오픈 소스 프로그래밍 언어입니다. C#, Java 또는 Scala와 유사한 구문 및 개념을 제공하며 주로 JVM을 대상으로 하지만 JavaScript 또는 기본 코드를 대상으로 하는 변형도 있습니다. Kotlin/JVM이 Java 바이트코드로 컴파일된다는 점에서 Java와 매우 유사하므로 JVM 배경 지식이 있는 백엔드 엔지니어는 Kotlin을 쉽게 이해할 수 있습니다.

공식 페이지에서 알 수 있듯이 Kotlin의 목표는 고유한 것이 아니라 수십 년간의 언어 개발에서 영감과 모범 사례를 이끌어내는 것입니다. 모든 Java IDE 또는 명령줄에서 사용할 수 있지만 개인적으로 IntelliJ와 함께 사용하는 것을 선호하고 권장합니다. JetBrains 팀에서 적극적으로 유지 관리하고 업그레이드하므로 유료 버전 구입에 대해 걱정하지 마십시오. Kotlin을 막 시작했다면 IntelliJ의 커뮤니티 버전이 모든 요구 사항을 충족할 것입니다. 내가 지적하고 싶은 Kotlin의 가장 중요한 세 가지 측면은 다음과 같습니다. a) 간결함(보일러플레이트 코드를 크게 줄임), b) 안전함(한 가지, null 포인터 예외를 피하기 위해 구축됨), c ) 상호 운용 가능(JVM, Android 또는 브라우저용 기존 라이브러리를 활용할 수 있음).
코틀린 코루틴
모든 사람은 사용자에게 빠르게 서비스를 제공하는 서비스를 원합니다. 서버의 최대 용량에 도달하기 위해 가장 먼저 할 수 있는 일은 다중 스레드 응용 프로그램을 사용하는 것입니다. Java는 그 점에서 상당히 복잡합니다. Java를 배울 때 먼저 다중 스레드 응용 프로그램을 원하면 Thread 클래스를 확장하거나 Runnable 인터페이스를 구현해야 한다는 것을 배웁니다. 초보자는 차이점이 무엇인지 전혀 이해하지 못하지만(있는 경우) 혼란을 더하기 위해 항상 start 메서드를 사용하지 않고 run 메서드로 스레드를 시작하라는 지시를 받습니다. 아니면 잠깐, 반대였나요? 어쨌든 스레드를 수동으로 시작해서는 안 됩니다. 비용이 너무 많이 들고 스레드 풀을 사용하는 것도 중요하지 않습니다. 그렇지 않다는 점을 제외하고는 간단합니다.
다행히 Kotlin에는 코루틴이라는 훨씬 더 간단한 솔루션이 있습니다. 간단히 말해서 코루틴을 사용하면 매우 유창한 방식으로 비동기식 비차단 코드를 작성할 수 있습니다. 핵심 아이디어는 일시 중단될 수 있는 기능을 갖는 것입니다. 즉, 계산은 어느 시점에서 일시 중단되고 나중에 다시 시작될 수 있습니다. 가장 좋은 점은 비차단 코드를 작성할 때 프로그래밍 모델이 실제로 변경되지 않으므로 비차단 코드를 작성하는 것이 본질적으로 차단 코드를 작성하는 것과 동일하다는 것입니다. 두 가지 예를 살펴보겠습니다.
fun sendRequest(): Int { /* do some heavy work */ return 1; }
이 예는 차단 기능을 보여줍니다. 이 코드 조각을 실행하는 스레드는 함수가 반환될 때까지 다른 작업을 수행하지 않습니다. API 또는 데이터베이스 호출의 경우 몇 초가 소요될 수 있습니다. 다른 서비스를 기다리는 동안 스레드를 차단하고 싶지 않으므로 이 기능을 비차단 기능으로 바꾸겠습니다.
suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }
이 예제는 방법을 일시 중단할 수 있는 비차단 기능으로 바꾸는 방법을 보여줍니다. 즉, 단순함을 위해 무거운 작업이 10 초의 간단한 delay()
함수 호출인 경우 실행 중인 스레드는 해당 시간 동안 다른 작업을 계속 수행하고 10초가 지나면 함수 실행을 재개합니다. 하나의 키워드로 멋진 비차단 코드를 얻을 수 있습니다.
Ktor와 비동기식 서비스
REST API 작성과 관련하여 임베디드 서버 시작 또는 요청 구문 분석과 같이 수행해야 하는 몇 가지 추가 단계가 있으며 물론 아무도 수동으로 수행하기를 원하지 않습니다. Java에는 Spring Boot가 있어 정말 쉽게 작업할 수 있고, 다행히 Kotlin에는 Ktor라는 프레임워크가 있습니다. Ktor는 비동기식 서버 구축을 위한 웹 프레임워크입니다. 웹사이트에서 알 수 있듯이 Ktor는 "사용하기 쉽고 재미있고 비동기적"입니다. 이제 재미는 주관적이므로 이를 증명하고 싶지는 않지만 사용하기 쉽고 비동기식임을 증명하는 스니펫을 살펴보겠습니다.
fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }
위의 예는 내장된 Tomcat 서버에서 실행되고 포트 8080에서 수신 대기하며 "Hello world!"로 비동기적으로 응답하는 완전한 기능을 갖춘 Kotlin Ktor 서버를 보여줍니다. 요청을 받기 위해. 이 모든 것이 10줄 미만의 코드로 이루어집니다.
Ktor는 분명히 이것보다 훨씬 더 많은 일을 할 수 있습니다. Ktor의 모든 기능을 소개하려면 자체 기사가 필요하지만 무엇보다 로그인과 인증이 파이처럼 쉽습니다. 서버 측에서 Ktor가 수행할 수 있는 작업과 구성 방법에 대한 자세한 내용은 여기를 참조하십시오.
백엔드에서 Kotlin의 다른 이점
내가 지적하고 싶은 첫 번째 이점은 Kotlin에서 Java 라이브러리를 사용할 수 있다는 것입니다. 저를 믿으십시오. Java를 위한 놀라운 타사 라이브러리가 많이 있어 삶을 더 쉽게 만들 수 있습니다. 작업을 완벽하게 수행하는 즉시 사용할 수 있는 오픈 소스 라이브러리가 있는데 왜 자신만의 구현을 작성하겠습니까? 이것들을 Kotlin과 함께 사용하면 완벽하게 작동합니다.
Kotlin과 Ktor의 또 다른 주요 장점은 사용할 수 있는 광범위한 테스트 라이브러리와 프레임워크입니다. Junit 프레임워크는 Kotlin의 매력처럼 작동하며 Ktor는 여기에 자체 테스트 라이브러리를 추가하여 종단 간 테스트 및 통합 테스트를 즉시 작성할 수 있습니다. 전체 애플리케이션을 실행하고 라이브 애플리케이션과 마찬가지로 요청을 처리할 수 있는 사용자 지정 테스트 엔진을 사용할 수 있습니다.
결론
앞서 언급했듯이 저는 주로 여러 서버 측 애플리케이션과 REST API를 보유한 Java 백엔드 개발자입니다. 저는 Java 프로그래밍을 좋아하지만 어떤 작업에도 완벽하고 모든 문제를 해결할 수 있는 최고의 언어나 프레임워크는 없다고 생각합니다. 내 접근 방식은 가능한 한 많은 도구에 익숙해지고 문제가 발생하면 해당 특정 문제를 완벽하게 해결할 수 있는 최상의 도구를 선택하는 것입니다.
Kotlin 사이트에서 알 수 있듯이 Kotlin의 목표는 고유한 것이 아닙니다. 대신 수십 년간의 언어 개발에서 영감과 모범 사례를 이끌어 내고 백엔드 개발과 관련하여 Kotlin, Coroutines 및 Ktor가 작업을 수행하는 놀라운 트리오를 만들 수 있다고 믿습니다. 여기에서 Kotlin과 프로그래밍 언어로서의 유용성에 대해 자세히 알아볼 수 있습니다.