Lint
유지보수성, 결합도, 응집도 등의 특성들이 소프트웨어의 품질을 향상시키기 위한 전략이라고 한다면, 코드 품질을 개선하기 위한 전략으로는 코드 리뷰, 정적 분석, 코딩 컨벤션 등이 있다. 이 중에서도 정적 분석과 코딩 컨벤션을 도와주는 도구가 바로 Lint다.
Lint는 Linter라고도 부르는데 위키피디아에서는 다음과 같이 정의하고 있다.
Lint, or a linter, is a static code analysis tool used to flag programming errors, bugs, stylistic errors and suspicious constructs. The term originates from a Unix utility that examined C language source code.
Linting이 코드에서 발생할 수 있는 에러를 줄여줄 수도 있지만, 코드의 전반적인 품질을 향상시키기 위한 목적이 가장 크다. 어떤 포맷에 맞춰서 개발해야 할지 고민이 될 때, Lint는 그 가이드를 제공해주고 이에 맞춰서 개발을 더 가속화하고 비용을 절감할 수 있는 효과도 누릴 수 있다. 다만 처음엔 Lint가 제안하는 코드 스타일에 적응하느라 더 많은 시간이 필요할 수도 있다.
Ktlint
Ktlint는 Pinterest에서 만든 코틀린 전용 Linter이다. 주요 특징으로는 따로 설정이 필요 없어서 적용하기 쉽고, 코틀린 공식 코드 스타일을 따르고 있으며, 내장된 포맷터(Built-in formatter)가 있어서 코드 스타일을 손으로 직접 고칠 필요가 없다.
Scala 개발할 때에는 주로 scalastyle이나 scalafix를 사용했었고, Java로 개발할 때에는 Checkstyle만 써봤었는데, 이것들에 비하면 ktlint는 적용하기가 너무 쉽고 포맷터도 제공하고 있어서 만족도가 너무 좋았다. 사실 코틀린의 공식 컨벤션이 내가 주로 작성하는 코드 스타일과 비슷해서, 코틀린 공식 코드 스타일을 따르는 ktlint가 나랑 더 잘맞는 느낌이 들기도 했다.
Ktlint 적용하기
Official Code Style
Intellij IDEA를 사용하고 있다면, 프로젝트의 루트 디렉터리에 gradle.properties 파일 안에 아래 설정값을 입력하면 코드 스타일을 코틀린 공식 컨벤션을 따르겠다고 설정할 수 있다. 자세한 내용은 여기에서 확인할 수 있다.
kotlin.code.style=official
ktlint-gradle
Gradle 설정 파일(build.gradle.kts) 안에 아래 플러그인을 추가한다. Gradle 팀 사람이 개인적으로 만든것 같은데, ktlint-gradle 플러그인을 추가하면 gradle에서 ktlint를 쉽게 적용할 수 있다.
plugins {
...
id("org.jlleitschuh.gradle.ktlint") version "10.2.0"
id("org.jlleitschuh.gradle.ktlint-idea") version "10.2.0"
}
subprojects {
...
apply(plugin = "org.jlleitschuh.gradle.ktlint")
apply(plugin = "org.jlleitschuh.gradle.ktlint-idea")
...
}
EditorConfig
다음으로는 프로젝트 루트 디렉터리에 .editorconfig
파일 생성하고, 아래 설정값 입력한다. EditorConfig는 어떤 규칙에 따라서 Linting을 할건지 ktlint에게 알려주는 속성값이라고 생각하면 된다. 디폴트값은 README를 참고하면 잘 소개되어 있는데, 나는 yaml 설정과 trailing 설정도 추가할 수 있어서 몇가지 더 추가해서 사용하고 있다.
root = true
[*]
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
[*.{kt,kts}]
indent_size = 4
[*.{yml,yaml}]
indent_size = 2
실행해보기
아래 명령어를 실행하면 해당 프로젝트에 작성된 코드를 기반으로 스타일을 검사하고, 코드를 스타일에 맞게 리포맷팅할 수 있다.
# 스타일 검사
$ ./gradlew ktlintCheck
# 스타일 포맷팅
$ ./gradlew ktlintFormat
적용 후기
코틀린으로 작성하는 새로운 프로젝트에는 항상 ktlint를 적용하고 있다. 여러 사람이 함께 개발을 하다 보면 서로의 코드 스타일이 달라서 리뷰에서도 많은 이야기가 오고 갈 때가 많은데, lint를 적용하고 나면 모두가 하나의 가이드에 맞춰서 개발하다 보니 리뷰에서 코드 스타일에 대한 이야기를 많이 줄일 수 있다. 마찬가지로 새로운 사람이 프로젝트에 합류하더라도 잘 적용된 lint가 있다면 어렵지 않게 스타일을 따라갈 수 있는 장점이 있다. 조금 전에 ktlint를 적용하지 않았던 코드에 ktlint를 적용하고 포맷팅을 하고 왔는데, 팀에 새로운 분이 합류하시면 스타일 가이드에 맞게 빠르게 적응할 수 있도록 도움이 되었으면 좋겠다.