ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ktlint를 사용해보자!
    Android📱 2022. 7. 28. 10:05

    안드로이드 개발을 하다보면

    이런 노란 표시가 떠서 오른쪽 클릭을 해보면

    @SuppressLint("NewApi")

    이런 어노테이션이 함수 위에 뜨면서 경고가 사라지는 경험을 해볼수있다.

    나도 처음에 신경 안쓰고 개발을 하다가 없애보라는 리뷰를 받아서 ㅎㅎ
    이게 무엇인가에 대해서 고민을 해본적이 있었다.

    이거슨 바로 안드로이드 Lint라는 것과 연관이 있다.

    Lint란

    안드로이드 코드에 구조적 문제가 없는지 확인을 해주는 기능이다.

    왜 Lint가 있는 것일까?

    일단 공식 문서에는 "Android Studio는 앱을 실행하거나 테스트 사례를 작성할 필요 없이 코드의 구조적 품질 문제를 식별하고 수정하는 데 도움이 되는 lint라는 코드 스캔 도구를 제공합니다. 도구에서 감지한 각 문제는 설명 메시지 및 심각도 수준과 함께 보고되므로 중요한 개선 사항의 우선 순위를 빠르게 지정할 수 있습니다. 또한 문제의 심각도 수준을 낮추어 프로젝트와 관련이 없는 문제를 무시하거나 심각도 수준을 높여 특정 문제를 강조할 수 있습니다." 라고 나와있다.

    결국 코드의 품질을 높히기 위한 기능이라고 생각이 든다.

    그렇다면 ktlint란 무엇일까?

    ktlint는 Kotlin의 공식 가이드를 기반으로 코드 스타일을 검사해주는 기능이다.

    왜 ktlint를?

    코드를 작성할때 코딩 컨벤션은 중요하다고 생각한다.
    개인 프로젝트가 아닌 이상 혼자 코딩을 하는 일은 거의 드물고...
    유지보수를 하던 개발을 하던 누군가와 코드를 공유해야하는 상황이 오게 된다.
    그때 내가 쓰고 싶은대로 코드를 쓴다면 누가 알아볼 것 인가...
    일주일 전에 내가 쓴 코드도 못알아 보겠는데
    남이 내 코드를 한번에 알아보는 일은 거의 없을 것이고, 거기에 내맘대로 썼다?
    어쩌면 읽는것도 싫어하는 사람도 있을 수도 있을 것이다.

    또 취준생 입장에서도 기본도 모르네? 라는 인상은....

    그렇게 때문에 컨벤션이 존재하고, Kotlin에서도 공식 가이드를 제공하는 것이 아닐까 하는 개인적인 생각이다.

    그래서 그거 어떻게 하는건데?

    여튼! 그래서 ktlint를 사용하는 법을 뿌셔보자

    생각보다 어렵지 않음

    나는 공식적인게 좋다! 니설명 필요없다! 하신분들은 여기로 가시면 될듯하다.
    이 글을 다 보셔도 한번가서 보시면 좋을듯~
    (android studio에서 Gradle, groovy로 진행합니다.)

    gradle

    project 단위의 build.gradle에 id "org.jlleitschuh.gradle.ktlint" version "10.3.0"를 추가한다.
    위에 처럼 apply false 를 쓰게 되면 ktlintCheck만 사용할 수 있게 되니 apply false는 빼주자

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

    그리고 plugins 밑에

    subprojects {
        apply plugin: "org.jlleitschuh.gradle.ktlint" // Version should be inherited from parent
    
        // Optionally configure plugin
        ktlint {
            debug = true
        }
    }

    이 코드를 작성한다.
    아니면 app 수준의 gradle에서

    plugins {
        ...
        id "org.jlleitschuh.gradle.ktlint"
    }
    
    ...
    
    android {
        ...
        ktlint {
            debug = true
        }
    
    }

    이렇게 작성해 줘도 된다.
    전체 서브 모듈에 적용할건지 하나의 앱에 사용할건지에 따라 다른거 같은데 (아니면 알려주세요)
    (덕분에 gradle 공부함...)

    끝이다....

    버전은 맞춰서 사용하면되고 만약에 세팅 gradle에 mavenCentral()가 없다면 추가해주고 gradle 버전이 낮다면

    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "org.jlleitschuh.gradle:ktlint-gradle:<current_version>"
      }
    }
    
    repositories {
      // Required to download KtLint
      mavenCentral()
    }
    
    apply plugin: "org.jlleitschuh.gradle.ktlint"

    이 친구들을 추가해 주면 된다.

    수동 검사

    터미널에 ./gradlew ktlintCheck 라고 쳐주면 검사를 해준다.

    그러면

    이렇게 에러가 뜨는데 고치라고 알려주는 것이다.
    당황하지 말자 성공한 것이니

    File must end with a newline (\n)는 파일 마지막에 엔터를 넣어주라는 소리이고
    Imports must be ordered in lexicographic order without any empty lines in-between with "java", "javax", "kotlin" and aliases in the end는 import 사이에 빈칸을 주지말라는 소리 같다...
    Wildcard import (cannot be auto-corrected)는 와일드카드 import에 *을 지우라는 소리다.

    또 다른 메세지가 있다면 보고 수정해주면

    짜란 성공 메시지가 뜨게 된다.

    추가 기능

    추가적으로 깃헙에 올릴때 강제하는 방법과 안드로이드 스튜디오에서 감지하고 자동으로 고쳐주는 기능도 있다.

    ./gradlew ktlintFormat 를 쓰면 고쳐야하는 부분을 자동으로 고쳐준다.

    ./gradlew addKtlintCheckGitPreCommitHook 이 친구는 커밋을 할때 자동으로 검사를 하게 되는 기능이고, 만약에 컨벤션이 틀린게 발견된다면 커밋이 불가능하게 된다.

    마무리

    컨벤션은 정말 중요하다고 생각한다.
    결국 협업아닌가
    내 코드를 아무도 알아 볼 수 없다면 협업도 불가능해 지고 유지 보수도 힘들어지는 코드가 될 것이다.
    그렇게 되지 않기 위한 기본이라고 생각하니 맨날 깜빡깜빡하는 나에게는 아주 좋은 라리브러리 같다.

Designed by Tistory.