[Kotlin] 우아한 코드를 위한 도구 - ktlint 와 detekt

JuYong-Kim·2023년 6월 16일
0

Kotlin 정복

목록 보기
3/3
post-thumbnail

시작

협업 프로젝트를 하다 보면 서로 다른 코드 스타일로 누가 어떤 코드를 작성했는지 볼 수 있을 정도로 다양한 스타일이 존재한다. 물론 이렇게 하면 코드 가독성이 떨어지고 일관된 코드 스타일이 보장되지 않는다. 그래서 코드 퀄리티를 높히고 생산성을 높일 수 있는 관련 도구가 분명있을 것 같아 소개하고 적용해보고자 한다!

ktlint

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이 수정하지 못하는 부분들은 따로 빼서 보여주기 때문에 해당 부분은 직접 수정해야만 한다.

detekt

그 다음으로 또 많이 사용되는 도구이다. 정적 프로그램 분석 도구로, 프로그램을 실행하지 않고 소프트웨어를 분석하는 도구이다.

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가지를 소개했다. 이런 도구들이 있었으면 참 좋겠다고 생각했는데 실제로 있었다... 혹시 설명이 부족했다면 공식 문서에 자세히 나와있으므로 직접 읽어보고 만져보는 것을 추천한다.

profile
Hello World!

0개의 댓글