ktlint로 코틀린 코딩 컨벤션 검토하기

이번 포스트에서는 작성된 코드의 교열을 보는 방법에 대해 알아보도록 하겠습니다.

# 들어가기

우리가 작성하는 코드는 기본적으로는 컴퓨터에게 명령을 내리기 위한 것이고 그 명령은 각 언어의 문법에 따라 작성되어져야 합니다.

코틀린에서 상수 두 개를 만들고 그 상수를 더하는 명령은 다음과 같이 쓸 수 있습니다.

1
2
3
4
val a = 3
val b = 4
val c = a + b
println(c)

자 그럼 이번엔 코드 안에서 띄어쓰기의 방식을 다르게 해보겠습니다.

1
2
3
4
val a= 3
val b =    4
val c= a+      b
println(c)

각 줄마다 띄어쓰기의 방식이 다르다고 해도 컴퓨터는 코드를 문제없이 컴파일 할 수 있습니다. 그럼 코드를 이렇게 써도 문제없이 작동하니 괜찮은걸까요?

내가 작성한 코드를 내 동료가 검토할 수도 있고, 몇 년후 내가 더 이상 코드를 관리하지 않게 되었을 때 내 후임이 코드를 읽어야 할 일이 생길 수 있습니다. 또 다음주쯤에 내 스스로가 내가 작성한 코드를 다시 읽어야 할 일도 생길 수 있죠.

코드는 나와 컴퓨터의 대화이기도 하지만, 나와 다른 사람과의 대화이기도 합니다. 따라서 컴파일이 되게 문법을 맞추는 것 뿐만 아니라, 사람이 보기 좋도록 코드의 구조도 이쁘게 만드는 것이 좋습니다.

프로그래머들 사이에서는 코드가 이쁘다고 느끼게 하는 어느정도 일반적으로 받아들여지는 정도의 수준이 있고 이걸 정리한 것을 코드 컨벤션이라고 합니다.

# ktlint

코드 컨벤션의 형태는 언어별로 다른데 코틀린의 경우 다음과 같은 규약이 정의되어 있습니다.

이 수많은 규약들을 머리에 넣어두고 잘 지킬 수 있다면 문제가 없겠지만 실제 코딩을 하다보면 이런 것들을 모두 신경쓰면서 코드를 쓸 수가 없습니다. 그래서 각 언어에는 린트 혹은 린터라고 불리는 도구가 있습니다.

린트는 과거에 C언어의 소스코드를 검사하기 위해 만들어진 유틸리티의 이름인데요. 현재는 동일한 작업을 하는 도구들을 모두 린트라고 부르고 있습니다.

코틀린의 대표적인 린트 툴로는 ktlint, detekt 등이 있는데요, 이번 영상에서는 복잡한 설정을 하지 않고 편하게 사용할 수 있는 ktlint의 사용법에 대해 설명하도록 하겠습니다.

ktlint는 다음과 같은 컨벤션 오류를 체크하고 자동으로 컨벤션에 맞게 코드를 수정해주는 기능이 있습니다

실제로는 이것뿐만 아니라 체크되는 더 많은 룰이 있습니다.

# ktlint 사용법

ktlint는 그 자체를 프로젝트에 삽입해서 사용해도 되지만 래퍼 라이브러리를 사용하면 더 간편하게 사용할 수 있습니다. ktlint의 래퍼는 여러가지가 있는데 여기서는 커밋이 활발하게 이루어지는 ktlint-gradle을 사용하겠습니다.

우선 라이브러리를 project 레벨의 gradle에 플러그인으로 추가합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
buildscript {...}

plugins {
    id "org.jlleitschuh.gradle.ktlint" version "10.0.0"
}

allProjects {...}

subprojects {
    apply plugin: "org.jlleitschuh.gradle.ktlint"
}

이렇게 설정하면 모든 프로젝트의 task에 다음과 같은 작업이 추가됩니다. 추가된 task들은 오른쪽 메뉴의 gradle에서 확인가능하며 그 외 모든 task의 리스트는 링크에서 확인 가능합니다.

  • loadKtlintReporters - preloads KtLint Reporters
  • runKtlintCheckOverKotlinScripts - runs actual lint check over project Kotlin script files
  • ktlintKotlinScriptCheck - generates reports and prints issues into Gradle console based on lint check found errors. This task execution depends on loadKtlintReporters and runKtlintCheckOverKotlinScripts tasks execution outputs
  • runKtlintFormatOverKotlinScripts - tries to format according to the code style project Kotlin script files
  • ktlintKotlinScriptFormat - generate reports and prints issues into Gradle console based on found non-formattable errors. This task execution depends on loadKtlintReporters and runKtlintFormatOverKotlinScripts tasks execution outputs
  • ktlintCheck - checks all SourceSets and project Kotlin script files
  • ktlintFormat - tries to format according to the code style all SourceSets Kotlin files and project Kotlin script files

task가 추가되었으면 터미널에서 실행합니다.

1
2
./gradlew ktlintCheck  // 로 틀린부분을 체크받고
./gradlew ktlintFormat  // 로 자동수정을 할 수 있습니다.

ktlintcheck를 수동으로 수행하는 것이 귀찮다면 다음 명령으로 커밋할때마다 ktlintcheck가 실행되게 할 수 있습니다.

1
./gradlew addKtlintCheckGitPreCommitHook

ktlint를 이용해서 코드 컨벤션에 맞는 코드를 생산하는 법에 대해 알아보았습니다. 중요한 것은 코드 컨벤션을 지키지 않아도 컴파일은 정상적으로 수행되지만, 이 코드를 언젠가 다시 읽게 될 나와 다른 사람을 위해 코드 컨벤션을 지켜야 한다는 점입니다.

Built with Hugo
Theme Stack designed by Jimmy