본문 바로가기
Framework/SpringBoot

[SpringBoot] Java를 Kotlin으로 변환하기(Convert Java to Kotlin)

by 댓츠굿 2019. 9. 26.

 

기존 Springboot, Java, gradle로 구성된 샘플 프로젝트를 IntelliJ를 이용하여 Kotiln으로 변환한 과정을 정리하였습니다. 이 과정에서 Kotlin을 처음 써보게 되었고, 제가 한 방법이 잘한 방법인지는 모르겠습니다만.. 그래도 제가 했던 방법을 기록하고 공유하고자 글을 씁니다. 혹시 더 좋은 방법 있으면 댓글 달아주시면 감사하겠습니다. (더 좋은 방법 너무나 알고 싶어요.)

 

 

기존 Springboot 프로젝트 스펙은 다음과 같습니다.

  • Java 8+
  • springboot 2.x
  • gradle 4

기존 프로젝트 소스는 제 Github에서 볼 수 있습니다.

 

 

Kotlin은 Jetbrains에서 만들어졌기 때문에 IntelliJ에서 Java를 Kotlin으로 변환해주는 기능이 있습니다. 또한 Kotlin은 기존 JVM 코드와 100% 상호 호환성을 가지기도 합니다. 때문에 Kotlin 코드는 Java와 호환가능하며 역으로 Kotlin 코드를 Java로 변환해 볼 수도 있습니다.

 

 

 

Delombok

Kotlin 관련 세미나를 3번 정도 들으면서 알게된 점은 Lombok으로 생성된 코드는 Kotlin 코드 내에서 접근이 불가하기 때문에 Lombok이 생성한 코드를 사용하려고 하면 컴파일 오류가 발생한다는 것입니다. 그래서 Lombok을 Delombok하여 Lombok을 제거하여 해결한 방법을 들었기에 이를 따라해보았습니다. (이와 관련하여 더 자세한 내용은 NAVER D2 - Kotlin 도입 과정에서 만난 문제와 해결 방법을 참조하세요.)

 

프로젝트 우클릭 - Refactor - Delombok - All lombok annotations

 

 

Delombok한 결과입니다.

 

 

 

 

 

 

Configure Kotlin in Project

Kotlin을 적용시키기 전, [Configure Kotlin in Project]를 클릭하여 Kotlin dependencies를 추가해줍니다. 만약 추가하지 않은 상태에서 변환을 진행하면 IntelliJ 하단에 "Kotlin not configured"라는 문구가 나타납니다. 문구 옆에 configure를 클릭하면 [Configure Kotlin in Project]를 클릭하는 것과 같은 결과를 얻을 수 있습니다.

 

 

디폴트 값을 그대로 두고 [OK]를 클릭합니다.

 

 

설정이 끝나면 build.gradle 파일에 자동으로 Kotlin과 관련된 플러그인이나 라이브러리 등이 추가 될 것입니다.

 

 

 

 

 

 

Convert Java File to Kotlin File

대망의 Kotlin 파일로 변경할 순서입니다.

[Convert Java File to Kotlin File] 을 클릭하여 Java 파일을 Kotlin 파일로 변경하여 봅니다.

 

 

다음은 Java 파일이 Kotiln 파일로 변형된 모습입니다. 왼쪽이 User.Java, 오른쪽이 Kotlin으로 변경된 User.kt 입니다.

 

 

자동으로 변환된 Kotlin 파일은 어딘지 모르게 손을 봐줘야 할 것 같습니다. 이제 이런 파일들을 하나씩 수정해 나갑니다.

아래는 User.kt 파일을 수정한 후의 모습입니다.

 

 

다른 파일 역시 같은 과정으로 수정해나갑니다.

Application.java 에서 Application.kt 로 바뀐 직후의 모습입니다. (왼쪽이 Java, 오른쪽이 Kotlin 파일)

 

 

Application.kt 파일도 아래와 같이 수정해주었습니다.

 

 

 

 

 

 

Convert 'build.gradle' to 'build.gradle.kts'

모든 파일을 수정하였지만.. build.gradle 파일을 build.gradle.kts 파일로 수정해야 된다는 것을 깨달았습니다. 이 과정에서 에러를 잡느라 많은 시간을 할애했던 것 같습니다.

우선 gradle 버전을 5.x대로 올려줍니다.

./gradlew wrapper --gradle-version=5.4

만약 'Permission denied'가 나면 다음과 같이 chmod 명령어로 권한변경 후 다시 위 명령어를 칩니다.

chmod +x gradlew

 

 

build.gradle.kts 파일은 Gradle Kotlin DSL로 작성되며 자동완성을 지원합니다. Gradle 5.0부터 공식적으로 Gradle Kotlin DSL을 지원합니다. 다음은 우아한형제들 기술 블로그에서 가져온 글입니다.

필요한 라이브러리 의존성을 선언하는 방식인데 큰따옴표, 작은따옴표, 괄호를 이용하는 다양한 표현방식이 있다. 여러사람이 함께 작업하는 빌드스크립트에서는 자유로운 표현방식 보다는 약간의 제약을 가하는 표현방식을 사용해야 한다고 생각한다. Kotlin DSL은 적당한 수준의 제약이 걸린 표현방식을 제공하기에 그런 관점에서 봤을 때는 적합하다.

코틀린 DSL 모든 문자열을 큰따옴표(")로 작성하도록 한다. 문자열에서 위치변환자 사용이 자유롭다. 코틀린 DSL을 통해서 얻을 수 있는 이득은 다음과 같다.

 - 코드 자동완성, 오류코드 강조, 빠른 문서보기 가능, 리팩터링

 

Kotlin DSL을 사용하기 위해서는 .gradle.kts 확장자를 사용해야 한다. .gradle 파일명을 변경하고 .gradle.kts로 변경하면 프로젝트를 닫았다가 다시 열거나 Build project 를 통해서 프로젝트를 새롭게 갱신해야 한다.

 

Gradle Groovy DSL 로 생성된 빌드스크립트를 Kotlin DSL로 변경(https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/)할 수 있다.

 

 

 

 

 

 

Run

모든 파일을 Kotlin으로 변경하고 build.gradle 파일도 build.gradle.kts 파일로 변경하였습니다. 그리고 로컬에서 서버를 기동하였고 다음과 같이 잘 올라오는 것을 확인하였습니다.

 

 

Swagger 화면입니다. Kotlin으로 변경된 이후에도 API 호출이 잘 되는 것을 볼 수 있습니다.

 

 

 

Java를 Kotlin으로 변환하는 과정에서 삽질도 많이하며 힘들었지만 그만큼 Kotiln 언어에 대해 공부해 볼 수 있었으며 Gradle Kotlin DSL에 대해서도 알게되었습니다. 또한 단지 언어를 바꿨을 뿐인데 기존 Spring 환경에서 돌아간다는 것이 신기했습니다.

Kotlin으로 변환된 소스는 여기에서 볼 수 있습니다. 아직 Kotlin을 알아가는 중이라 코드를 보여주기가 부끄러운 단계이지만, 더 좋은 의견 있으시면 Issue나 댓글 달아주시면 감사하겠습니다.

 

 

반응형