협업 프로젝트를 하다 보면 서로 다른 코드 스타일로 누가 어떤 코드를 작성했는지 볼 수 있을 정도로 다양한 스타일이 존재한다. 물론 이렇게 하면 코드 가독성이 떨어지고 일관된 코드 스타일이 보장되지 않는다. 그래서 코드 퀄리티를 높히고 생산성을 높일 수 있는 관련 도구가 분명있을 것 같아 소개하고 적용해보고자 한다!
lint
란 코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 구조적 문제점을 확인해주는 도구이다. 즉, 코딩 컨벤션에 따라 코드를 작성했는지 확인해준다.
kotlin
개발 환경에서 쓰이는 lint
가 바로 ktlint
이다. 공식 코틀린 코딩 컨벤션과 안드로이드 코틀린 스타일 가이드에 따라 만들어져서 개발 시에 유용하다. 공식 문서를 살펴보며 안드로이드 프로젝트에 어떻게 적용할 수 있는지 알아보자.
configurations {
ktlint
}
dependencies {
ktlint("com.pinterest:ktlint:0.47.1") {
attributes {
attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL))
}
}
// additional 3rd party ruleset(s) can be specified here
// just add them to the classpath (e.g. ktlint 'groupId:artifactId:version') and
// ktlint will pick them up
}
// 코드 분석
task ktlint(type: JavaExec, group: "verification") {
description = "Check Kotlin code style."
classpath = configurations.ktlint
mainClass.set("com.pinterest.ktlint.Main")
args "src/**/*.kt"
// see https://pinterest.github.io/ktlint/install/cli/#command-line-usage for more information
}
check.dependsOn ktlint
// 코드 수정
task ktlintFormat(type: JavaExec, group: "formatting") {
description = "Fix Kotlin code style deviations."
classpath = configurations.ktlint
mainClass.set("com.pinterest.ktlint.Main")
args "-F", "src/**/*.kt"
// see https://pinterest.github.io/ktlint/install/cli/#command-line-usage for more information
}
위 코드를 build.gradle(Module:app)
파일에 적용하면 아래 화면 처럼 실행 시킬 수 있는 버튼이 나온다. 먼저 task ktlint..
해당 버튼을 누르게 되면 ktlint 룰을 잘 지켰는지 앱 전반적인 코드를 분석해서 결과를 아래 Console에 띄어준다.
결과창에 나온 코드를 직접 수정해도 되고, 아래 ktlintFomat...
옆에 실행 버튼을 누르게 되면 직접 수정까지 해준다!! 물론 ktlintFomat
이 수정하지 못하는 부분들은 따로 빼서 보여주기 때문에 해당 부분은 직접 수정해야만 한다.
그 다음으로 또 많이 사용되는 도구이다. 정적 프로그램 분석 도구로, 프로그램을 실행하지 않고 소프트웨어를 분석하는 도구이다.
ktlint
와 다른점은 ktlint
는 코딩 컨벤션을 중점으로 분석하고, detekt
는 코드의 전체적인 퀄리티를 높여주기 위한 도구이다. 예를 들면, 메서드 이름의 길이가 너무 길다던가, 메서드 depth가 길다던가 하는 것들 말이다.
프로젝트 적용 방법과 실행 방법은 ktlint와 거의 동일하다.
...
configurations {
detekt
}
dependencies {
detekt 'io.gitlab.arturbosch.detekt:detekt-cli:1.22.0-RC3'
...
}
...
task detekt(type: JavaExec) {
mainClass.set("io.gitlab.arturbosch.detekt.cli.Main")
classpath = configurations.detekt
def input = "$projectDir"
def exclude = ".*/build/.*,.*/resources/.*"
def config = "$rootDir/detekt.yml" // 직접 만든 규칙
def params = [ '-i', input, '-ex', exclude, '-c', config]
args(params)
}
그렇다면 어떤 규칙으로 문제가 있다고 판단하는지, 우리 팀의 코드 규칙에 맞게 수정할 순 없는가? 하면 그것도 가능하다. default-detekt-config.yml 를 참고하자.
아래와 같이 규칙을 정의할 파일을 만들고 위 기본 설정을 복사한 뒤 직접 수정하는 방법으로 커스텀 할 수 있다. (물론 default 파일을 사용하지 않고 직접 구현해도 무방하다.)
이 커스텀 방법은 ktlinkt
에도 동일하게 적용가능하다!.
이번엔 코드를 더 우아하고 깔끔하게 짤 수 있는 도구 2가지를 소개했다. 이런 도구들이 있었으면 참 좋겠다고 생각했는데 실제로 있었다... 혹시 설명이 부족했다면 공식 문서에 자세히 나와있으므로 직접 읽어보고 만져보는 것을 추천한다.