관리 메뉴

피터의 개발이야기

[Kotlin] Spring Boot Kotlin 프로젝트에 ktlint 설정하기 본문

Programming/Kotlin

[Kotlin] Spring Boot Kotlin 프로젝트에 ktlint 설정하기

기록하는 백앤드개발자 2024. 8. 5. 00:57
반응형

ㅁ 들어가며

ㅇ ktlint는 Kotlin 코드의 스타일을 체크하고 포맷팅하는 도구다.

ㅇ 이 글에서는 Spring Boot와 Kotlin을 사용하는 프로젝트에 ktlint를 설정하는 방법을 설명한다.

 

ㅁ build.gradle.kts 파일 수정

plugins {
    id("org.jlleitschuh.gradle.ktlint") version "12.1.0"
}

ktlint {
    verbose.set(true)
    outputToConsole.set(true)
    coloredOutput.set(true)
    reporters {
        reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.CHECKSTYLE)
        reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.JSON)
        reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.HTML)
    }
    filter {
        exclude("**/generated/**")
        include("**/kotlin/**")
    }
}

ㅇ build.gradle.kts에 파일에 위 내용을 추가한다.

ㅇ ktlint 부분을 생략하여도 기본적인 점검은 가능하다.

ㅇ 리포트의 형식은 JSON, HTML, txt, xml이 있다.

 

ㅁ ktlint 실행

ㅇ gradle task에 ktlintFormat를 생겨난다.

ㅇ ktlintFormat을 클릭하여 ktlin를 실행한다.

./gradlew ktlintCheck

 

ㅇ gradle 명령어를 사용하여 실행할 수도 있다.

 

ㅁ 수행 결과

ㅇ build.gradle.kts에 설정한 html , JSON

 

> Task :ktlintMainSourceSetCheck FAILED
/Users/peterseo/git/spring-projects/kotlin-querydsl/src/main/kotlin/com/peterica/kotlinquerydsl/controller/ProductController.kt:7:1 Wildcard import (cannot be auto-corrected) (standard:no-wildcard-imports)
/Users/peterseo/git/spring-projects/kotlin-querydsl/src/main/kotlin/com/peterica/kotlinquerydsl/entity/ProductRepository.kt:3:1 Wildcard import (cannot be auto-corrected) (standard:no-wildcard-imports)
/Users/peterseo/git/spring-projects/kotlin-querydsl/src/main/kotlin/com/peterica/kotlinquerydsl/entity/ProductRepositoryImpl.kt:4:1 Wildcard import (cannot be auto-corrected) (standard:no-wildcard-imports)

Execution failed for task ':ktlintMainSourceSetCheck'.
> A failure occurred while executing org.jlleitschuh.gradle.ktlint.worker.ConsoleReportWorkAction
   > KtLint found code style violations. Please see the following reports:
     - /Users/peterseo/git/spring-projects/kotlin-querydsl/build/reports/ktlint/ktlintMainSourceSetCheck/ktlintMainSourceSetCheck.xml
     - /Users/peterseo/git/spring-projects/kotlin-querydsl/build/reports/ktlint/ktlintMainSourceSetCheck/ktlintMainSourceSetCheck.json
     - /Users/peterseo/git/spring-projects/kotlin-querydsl/build/reports/ktlint/ktlintMainSourceSetCheck/ktlintMainSourceSetCheck.html

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
BUILD FAILED in 9s
6 actionable tasks: 5 executed, 1 up-to-date

ㅇ 콘솔에 출력된 내용이다.

 

ㅁ 특정 규칙 비활성화

ㅇ 특정 ktlint 규칙을 비활성화하려면 프로젝트 루트에 .editorconfig 파일을 생성하고 다음과 같이 설정한다

root = true

[*]
insert_final_newline = true

[*.{kt,kts}]
ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL

#  Disable wildcard imports entirely
ij_kotlin_name_count_to_use_star_import = 2147483647
ij_kotlin_name_count_to_use_star_import_for_members = 2147483647
# ij_kotlin_packages_to_use_import_on_demand = unset

# 패키지 네이밍 비활성화
ktlint_standard_package-name = disabled

# wild card import 비활성화
ktlint_no-wildcard-imports = disabled

# mutliline-expresion-wrapping 비활성화
# ktlint_standard_string-template-indent = disabled
# ktlint_standard_multiline-expression-wrapping = disabled

# Ko-test 에서 indent 스타일 체크 비활성화
[src/test/kotlin/**.{kt,kts}]
# ktlint_standard_indent = disabled
# ktlint_standard_string-template-indent = disabled

 

참조: SpringBoot - Kotlin 프로젝트에 Klint 적용 및 disable 설정

 

 

 kotlin dsl에서 정의하는 방법은 0.48 버전 이후로 deprecated 되었다.

[*.{kt,kts}]
disabled_rules = import-ordering,no-wildcard-imports

 

ㅁ Git Hooks 설정 (선택사항)

ㅇ 커밋 전에 자동으로 ktlint를 실행하려면 다음 명령어를 사용한다

./gradlew addKtlintCheckGitPreCommitHook

자세한 건 이곳을 참조하면 된다. 

 

ㅁ Ktlint는 왜 wild card import를 권장하지 않을까?

ㅇ 위의 콘솔에서 FAILED한 내용 중 와일드카드가 문제가 되었지만, 이를 예외를 해도 무방하다.

  ㄴ 참고로, annotation이 5개이상 중복되면, 인텔리제이가 자동으로 wild카드로 바뀌게 된다. 

 

Ktlint가 와일드카드 임포트(wildcard import)를 권장하지 않는 이유

  ㄴ 와일드카드 임포트는 코드의 가독성을 떨어뜨린다.
  ㄴ 이름 충돌 문제가 발생할 수 있다. 여러 패키지에서 같은 이름의 클래스나 함수를 가져올 때 혼란이 생길 수 있다.
  ㄴ 컴파일 시간이 늘어날 수 있다. 컴파일러가 더 많은 클래스를 로드해야 하기 때문이다.
  ㄴ IDE의 자동 완성 기능이 제대로 작동하지 않을 수 있다.
  ㄴ 불필요한 의존성이 생길 수 있다. 실제로 사용하지 않는 클래스도 임포트될 수 있어 코드의 의존성이 불필요하게 증가할 수 있다.

  참조: Ktlint는 왜 wild card import를 권장하지 않을까?

           Ktlint - Standard rules - No wildcard imports

 

ㅁ 함께 보면 좋은 사이트

ktlint 공식페이지 

SpringBoot - Kotlin 프로젝트에 Klint 적용 및 disable 설정

반응형
Comments