코틀린 코드의 품질검사(1) 코드 컨벤션 -ktlint

안상철·2022년 8월 9일
1

이모저모개발

목록 보기
1/8
post-thumbnail

ktlint는 프론트에서 사용하는 eslint 플러그인처럼 코틀린의 코드에 대해 lint규칙을 설정할 수 있는 모듈입니다.

코틀린은 공식 사이트에서 코딩 컨벤션 가이드를 제공하는데, ktlint는 공식 코딩 컨벤션 가이드와 일치하는 프로그래밍을 할 수 있도록 해 줍니다.

1. Gradle 빌드 설정

ktlint는 jar 파일로 제공되고, https://jcenter.bintray.com/ 에도 배포되어 있습니다.

따라서 별도의 Gradle plugin이 없어도 Gradle에서 task를 정의해서도 쓸 수 있습니다.

(그런데 ktlint의 공식 사이트에서는 Gradle plugin을 더 권장한다고 나와 있습니다)

1. editorconfig 설정

ktlint는 .editorconfig 파일에 선언된 규칙을 포함하여 코드 스타일을 검사합니다.

.editorconfig 는 다양한 에디터와 IDE에서 공통적으로 지원하는 코드 스타일에 대한 설정 파일입니다.

기본으로 생선되는 파일이 아니니 root위치에 직접 만들어 사용합니다.

아래와 같이 .editorconfig 설정을 추가하면 됩니다.

.editorconfig 예시

root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120
tab_width = 4

[*.{kt,kts}]
disabled_rules=import-ordering
# java.* 패키지를 의존하는 경우  IntelliJ의 Orgarnize Import 기능으로는 알파벳 순서대로 import 구문을 정렬할 수 없다.
# 이는 ktlint의 import-ordering 규칙과 맞지 않는다.

사실 ktlint는 .editorconfig 파일이 없어도 디폴트 규칙으로 실행할 수 있지만 아래와 같은 이유로 edit파일을 만드는 것이 추천됩니다.

  • 의도하지 않게 상위 디렉토리의 .editorconfig 가 참조되는 경우를 막아줍니다.

.editorconfig 파일의 규약에 따르면, 이 파일을 지원하는 도구들은 root = true 라는 선언이 된 .editorconfig 파일을 찾기 전까지는 모든 상위 디렉토리를 탐색합니다.

ktlint에서도 이 규약을 준수합니다. 따라서 특정 컴퓨터에만 소스를 복제한 디렉토리의 상위 디렉토리에 .editorconfig 가 있다면 그 장비에서는 스타일 체크 결과가 다르게 나오게 됩니다.

  • ktlint가 버전이 올라가면서 규칙의 디폴트 값이 변경될 경우를 대비합니다.

예를 들면 ktlint 0.34.0 버전부터 insert_final_newline = true 가 디폴트 값이 되었습니다.

  • 다양한 IDE와 Editor등의 도구에서 이 설정을 참조합니다.

IntelliJ, VSCode, GitHub등에서 뷰어,포멧터의 설정으로 자동 반영됩니다.

max_line_length , insert_final_newline 과 같은 규칙을 Kotlin 공식 코딩 컨벤션에는 명시되어 있지는 않습니다. 그러나 같은 소스를 고치면서 협업하는 개발자들이 이를 통일하지 않을 경우 불필요한 diff 가 발생하여 코드 변경분을 파악할 때 불편해집니다.

  • disabled_rules 속성으로 검사하지 않을 규칙을 지정할 수 있습니다.

특히 현시점에서는 import-ordering 규칙은 쓰지 않는 것이 좋다고 합니다.

jlleitschuh/ktlint-gradle는 Gradle 버전 5.4.1이상에서만 사용할 수 있습니다. 그 이하 버전에서는 아래와 같은 에러가 나옵니다.

* What went wrong:
Could not determine the dependencies of task ':ktlintCheck'.
> Could not create task ':ktlintTestSourceSetCheck'.
   > Could not create task of type 'KtlintCheckTask'.
      > Could not generate a decorated class for class org.jlleitschuh.gradle.ktlint.KtlintCheckTask.
         > org/gradle/work/InputChanges
         
이럴 경우에는 Gradle의 버전을 업그레이드해야합니다. 

gradle.properites 파일에도 공식 코딩 컨벤션을 사용한다는 정책을 아래와 같이 명시합니다.

2. gradle.properites 설정

kotlin.code.style=official

3. 스타일 검사

./gradlew ktlintCheck

를 실행하거나 인텔리제이 우측 Gradle 탭에서 직접 실행합니다.

4. 스타일 일괄 변환

./gradlew ktlintFormat

를 실행하거나 인텔리제이 우측 Gradle 탭에서 직접 실행합니다.

주의 사항

1. 위 두 가지의 스타일 검사 중 빌드가 실패할 때 가 있는데 그냥 에러 로그를 보고 처리하면 됩니다.

2. 스타일 일괄 변환을 사용하다가 의도하지 않게 파일이 삭제되는 경우도 있다고 합니다. 따라서 3번의 스타일 검사만 실시하거나, 변환된 코드를 다시 살펴 볼 필요가 있습니다

3. Save Action Plugin 설치하기

Save Action Plugin을 사용하면 파일을 저장할 때 자동으로 포멧터를 실행할 수 있습니다.

  1. File > Settings ( Ctrl + Alt + S ) > Plugins 메뉴로 이동합니다.

  2. Marketplace 탭에서 'Save Actions' 로 검색합니다.

  3. Save Actions' plugin의 상세 설명 화면에서 [Install] 버튼을 누릅니다.

  4. IntelliJ를 재시작합니다.

  5. File > Settings > Other Settions > Save Actions 메뉴로 이동합니다.

  6. 아래 항목(권장) 혹은 그 이외의 원하는 옵션을 체크합니다.

  • Activate save actions on save
  • Optimize imoprts
  • Refomat file (전체 프로젝트의 스타일이 통일된 경우)
  • Refomat only changed code (프로젝트의 스타일이 통일되어 있지 않아서 스타일이 맞지 않는 코드를 함께 고치면 변경 부분을 알아보기가 더 어려운 경우)

참고

https://blog.benelog.net/ktlint.html
https://nesoy.github.io/articles/2018-09/Intellij-Auto-Convention
https://sungjk.github.io/2021/12/17/ktlint.html
https://blog.leocat.kr/notes/2020/12/14/intellij-avoid-wildcard-imports-in-kotlin-with-intellij
profile
웹 개발자(FE / BE) anna입니다.

0개의 댓글