Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Kotlin Script 활용하기

Kotlin Script 활용하기

Lee Sun-Hyoup

June 29, 2024
Tweet

More Decks by Lee Sun-Hyoup

Other Decks in Programming

Transcript

  1. Kotlin Script 활용하기 Kotlin을 스크립트 언어처럼! Kotlin scripting is the

    technology that enables executing Kotlin code as scripts without prior compilation or packaging into executables.
  2. Kotlin Script 활용하기 다른 스크립트 언어처럼 빌드 없이 실행가능! Code

    빌드하거나 패키징할 필요가 전혀 없다! Shell // hello.kts fun say() { println("Hello, Kotlin!") } say() $ kotlinc -script hello.kts Hello, Kotlin!
  3. Kotlin Script 활용하기 써야할 이유가 있나요? 베타도 아니고 실험 단계

    현재 JVM 환경에서만 가능 솔직히 대안이 많다 그럼에도 불구하고 이 발표를 하는 이유? 재밌어 보이니까! 그래도 없어질 것 같지는 않다 이럴 때 아니면 언제 써보겠습니까
  4. Kotlin Script 활용하기 일단 어디에 쓸 수 있는지 알아보자! 사용

    사례는 총 세 가지 빌드를 위한 스크립트 이미 Gradle Kotlin DSL에서 잘 사용되고 있음 CLI 환경에서 스크립트 실행 Kotlin 프로그램 런타임에서 스크립트 실행
  5. Kotlin Script 활용하기 Shell Script 대체 Shell Script 대신 Kotlin

    Script를 사용할 수 있다. Kotlin Script가 가지는 이점은? Shell Script 보다는 쉬움 Type 안정성 외부 라이브러리 사용 가능 다른 스크립트 언어로도 가능하지만 Kotlin을 사용하면 더 좋은점? Kotlin 언어만 익숙한 경우에도 사용 가능 JVM 생태계와의 호환성 솔직히 성능은 살짝 애매하다 많은 연산 처리는 빠르겠지만 JVM 워밍업 시간이 필요하므로 워밍업 시간이 0에 가까운 Python이나 Node.js에 비해 느릴 수 있다.
  6. Kotlin Script 활용하기 사용 방법 SDKMAN으로 kotlin 설치 Kotlin Script

    작성 Kotlin Script 실행 # Install sdkman $ curl -s https://get.sdkman.io | bash $ source "$HOME/.sdkman/bin/sdkman-init.sh" # Install kotlin $ sdk install kotlin // hello.kts println("Hello, Kotlin!") # Run script $ kotlinc -script hello.kts Hello, Kotlin!
  7. Kotlin Script 활용하기 shebang 사용 Code Shell !/usr/bin/env kotlinc -script

    println("Hello, Kotlin!") $ chmod +x hello.kts $ ./hello.kts Hello, Kotlin!
  8. Kotlin Script 활용하기 KScript https://github.com/kscripting/kscript kotlinc 는 기본 기능만 있기

    때문에 다른 언어를 대체하기는 역부족 kscript 는 kotlinc 에 비해 다양한 기능을 추가로 제공 스크립트 캐싱 의존성 관리 바이너리 패키징 설치 # Install kscript using sdkman $ sdk install kscript
  9. Kotlin Script 활용하기 외부 라이브러리 사용하기 Code Shell @file:DependsOn("com.github.kittinunf.fuel:fuel:2.3.1") import

    com.github.kittinunf.fuel.httpGet // main.kts val (request, response, result) = "https://httpbin.org/get" .httpGet() .responseString() println(result.get()) [kscript] Resolving com.github.kittinunf.fuel:fuel:2.3.1... $ kscript main.kts { "args": {}, "headers": { "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2", "Host": "httpbin.org", ...
  10. Kotlin Script 활용하기 바이너리 패키징 Gradle이 필요하며 바이너리는 Java가 설치된

    환경에서만 실행 가능 Shell $ kscript --package main.kts # Need Gradle [kscript] Packaging script 'main' into standalone executable... [kscript] Packaged script 'main' available at path: [kscript] /Users/kciter/Library/Caches/kscript/package_07f1f85044b41284dee18d4f8c159650/build/libs/main $ /Users/kciter/Library/Caches/kscript/package_07f1f85044b41284dee18d4f8c159650/build/libs $ ./main # Need Java { "args": {}, "headers": { "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2", "Host": "httpbin.org", "User-Agent": "Java/17.0.3", "X-Amzn-Trace-Id": "Root=1-6676a491-5935eb22586d7aa550e76b8d" }, "origin": "1.225.3.207", "url": "https://httpbin.org/get" }
  11. Kotlin Script 활용하기 IntelliJ와 함께 사용하기 kscript --idea 를 사용하면

    자동으로 IntelliJ에서 편집할 수 있게 구성해준다.
  12. Kotlin Script 활용하기 args 사용 kscript를 이용하면 자동으로 args를 받아올

    수 있다 Code Shell println(args.joinToString(", ")) $ kotlinc --script args.kts hi hello bye $ kscript args.kts hi hello bye hi, hello, bye
  13. Kotlin Script 활용하기 Clikt CLI 입력을 쉽게 처리할 수 있다

    // ... class Hello : CliktCommand() { val count: Int by option(help="Number of greetings").int().default(1) val name: String by option(help="The person to greet").prompt("Your name") override fun run() { repeat(count) { echo("Hello $name!") } } } Hello().main(args) $ kscript clikt.kts --count 3 Your name: kciter Hello kciter! Hello kciter! Hello kciter!
  14. Kotlin Script 활용하기 Mordant Terminal UI를 그릴 수 있게 도와준다

    val table = table { tableBorders = NONE borderType = SQUARE_DOUBLE_SECTION_SEPARATOR align = RIGHT column(0) { align = LEFT style = magenta } column(3) { style = magenta } header { style = magenta row("", "Projected Cost", "Actual Cost", "Difference") } . $ kscript ./table.kts │ Projected Cost │ Actual Cost │ Difference ══════════╪════════════════╧═════════════╪════════════ Food │ $400 $200 │ $200 ──────────┼──────────────────────────────┼──────────── Data │ $100 $150 │ $-50 ──────────┼──────────────────────────────┼──────────── Rent │ $800 $800 │ $0 ──────────┼──────────────────────────────┼──────────── Candles │ $0 $3,600 │ $-3,600 ──────────┼──────────────────────────────┼──────────── Utility │ $154 $150 │ $-5 ══════════╪══════════════════════════════╧════════════ Subtotal │ $-3,455
  15. Kotlin Script 활용하기 해볼 수 있는건 많다! 배포 자동화 온보딩

    툴 데이터 전처리 시드 데이터 추가 … 더 많은 예제는 https://github.com/kciter/kotlin-script-examples
  16. Kotlin Script 활용하기 실험 단계라 그런지 문서가 빈약… Example 저장소가

    그나마 유용하다 https://kotlinlang.org/docs/custom-script-deps-tutorial.html https://github.com/Kotlin/kotlin-script-examples
  17. Kotlin Script 활용하기 Java Scripting API (JSR-223) 스크립트 코드를 JVM

    위에 동작하는 프로그램에서 실행할 수 있게 해준다 JavaScript나 Groovy를 실행 할 수 있다. 물론 Kotlin Script도 실행 가능!
  18. Kotlin Script 활용하기 Java Scripting API (JSR-223) org.jetbrains.kotlin:kotlin-scripting-jsr223 의존성 필수

    라이브러리 이용이나 다른 스크립트 불러오기는 직접 구현해야함 kotlin-main-kts 를 사용하는 경우 extension을 main.kts 로 지정하면 알아서 다 해준다 org.jetbrains.kotlin:kotlin-main-kts 추가 필요 의존성 관리, 다른 스크립트 불러오기 등 필요한 것들을 미리 다 구현해둠 import javax.script.ScriptEngineManager fun main() { val engine = ScriptEngineManager().getEngineByExtension("main.kts")!! engine.eval( """ val a = 2 val b = 3 println("a + b = ${'$'}{a + b}") """.trimIndent() // Output: a + b = 5 ) }
  19. Kotlin Script 활용하기 Java Scripting API (JSR-223) 스크립트 시작 전

    미리 값을 넣어두는 것도 가능하다. engine.put("a", 2) engine.put("b", 3) println("a + b = ${'$'}{a + b}") import javax.script.ScriptEngineManager fun main() { val engine = ScriptEngineManager().getEngineByExtension("main.kts")!! engine.eval( """ """.trimIndent() ) }
  20. Kotlin Script 활용하기 Embeddable Host 내장형 컴파일러를 사용하는 방식 kotlin-scripting-jsr223

    도 내부적으로 사용하고 있다. 분리한 이유는 훗날 멀티플랫폼에서 사용하기 위함이 아닐까 추측 중 (자료가 너무 없다…) Script Definition과 Scripting Host를 만들어야 한다 공식 홈페이지는 이 방식만 설명하고 있다 https://kotlinlang.org/docs/custom-script-deps-tutorial.html 코드가 너무 길어지므로 여기선 생략
  21. Kotlin Script 활용하기 뭘 할 수 있을까? 실험 단계기 때문에

    실제 제품에 반영하는건 절대 안됨 어떤 문제가 있을지 알 수 없다 그래도 뭔가 해볼 수 없을까? 🤔
  22. Kotlin Script 활용하기 HTML Template kotlinx.html 을 이용하여 HTML을 Kotlin

    DSL로 작성 가능 스크립트 파일을 외부로 뺀다면 컴파일 타임 없이 템플릿 작성 가능 <html> <body> <h1>Hello, Kotlin!</h1> </body> </html> import javax.script.ScriptEngineManager data class Params(val name: String) fun main() { val engine = ScriptEngineManager().getEngineByExtension("main.kts")!! engine.put("params", Params("Kotlin")) engine.eval(""" @file:DependsOn("org.jetbrains.kotlinx:kotlinx-html-jvm:0.8.0") import kotlinx.html.*; import kotlinx.html.stream.*; import kotlinx.html.attributes.* print(createHTML().html { body { h1 { +"Hello, ${"$"}{params.name}!" } } })""".trimIndent() ) }
  23. Kotlin Script 활용하기 코딩 테스트 사용자가 작성한 코드를 실행, 채점

    import javax.script.ScriptEngineManager fun main() { val engine = ScriptEngineManager().getEngineByExtension("main.kts")!! val solutionCode = "fun solution(a: Int, b: Int) = a + b" engine.put("args", arrayOf(1, 5)) engine.put("answer", 6) engine.eval(""" $solutionCode println(solution(args[0] as Int, args[1] as Int) == answer) """.trimIndent() ) }
  24. Kotlin Script 활용하기 Toy Project: Ruby Warrior Ruby를 이용하여 퍼즐을

    푸는 게임 적절한 스크립트를 작성하여 문제를 해결할 수 있다. WarriorJS, Python Warrior 등 파생 프로젝트로 존재 사용자가 입력한 코드를 실행할 수 있어야함
  25. Kotlin Script 활용하기 실험 단계지만 쓰려면 잘 쓸 수 있을

    것 같다! 다른 스크립트 언어를 대체할 수 있는가? 아직 많이 부족하다 팀 내부에서 협의하고 쓰는건 괜찮을지도? 팀이 코틀린을 주력으로 사용한다면… ex) Spring 서버팀, Android 팀 등 그렇지만 Embedded Scripting은 아직 쓰기엔 많이 애매하다 Stable 단계가 아니라는 점이 가장 크다 Usecase가 애매하다 빌드 타임을 줄이는 용도로 UI나 설정 등에는 쓸 수 있을지도? 게임 개발에서 Lua 같은 사례