코프링 프로젝트에 ktlint 도입하기

alsdl0629·2023년 10월 3일
0

기술 적용

목록 보기
3/6
post-thumbnail

이번 글에서는 코드 컨벤션을 유지해 주는 린트를 도입한 경험을 정리해 보려고 합니다.


Lint란?

코드 컨벤션이 문서로만 되어 있으면 과연 잘 지켜질까요?
아마 잘 지켜지지 않을 것입니다.

빼먹는 경우도 많을 것이고, 무심코 사용하다 규칙을 알고도 잘 못 사용하는 상황이 생길 것입니다.

이때 코드 컨벤션, 코드의 오류나 버그를 지속해서 확인해 주고 미리 알려주는 도구Lint입니다.


ktlint vs detekt

코틀린에서 가장 흔히 쓰이는 린트에는
ktlint, detekt 두 가지가 있습니다.

ktlint는 Kotlin의 공식 가이드의 규칙을 포함하여 코드 스타일을 검사하고, 맞춰주는 도구입니다.

detekt는 코드포멧팅 보다는, 코드 복잡성, code smell 탐색과 같은 코드 분석에 초점을 둔 도구입니다.


ktlint는 선택한 이유

코드 컨벤션 유지와 코틀린 공식 코드 컨벤션에 초점을 맞춘 ktlint가 저희 프로젝트에 적합하다고 생각했기 때문에 ktlint를 도입하게 되었습니다!

두 린트는 서로 보완적인 역할을 하므로 두 린트의 기능이 다 필요하다면 둘 다 도입하여 코드 품질을 향상할 수 있습니다.


ktlint 도입

ktlint를 직접 설치하는 방법도 있지만 협업하는 프로젝트이기 때문에 다른 개발자분과 환경을 맞추기 위해 gradle 의존성을 추가하는 방법을 선택했습니다.

gradle 추가

plugins {
  	id("org.jlleitschuh.gradle.ktlint") version "<current_version>"
}

최신 버전인 11.6.0을 사용했습니다.


editorconfig 파일 추가

editorconfigIDE의 관계없이 일정한 코드 스타일을 유지하기 위해 도와주는 설정 파일입니다.

ktlint는 기본적으로 코틀린 공식 코드 컨벤션을 따릅니다.
그런데도 editorconfig를 만든 이유는 다음과 같습니다.

  1. ktlint 버전에 따라 코드 컨벤션 룰이 달라질 수 있기 때문입니다.
  2. 파일로 정의를 했기 때문에 코드 컨벤션에 대한 문서 역할을 합니다.
root = true

[*]
end_of_line = lf
indent_size = 4
indent_style = space
trim_trailing_whitespace = true

[*.{kt,kts}]
max_line_length = 120
ktlint_disabled_rules=trailing-comma
insert_final_newline = true

editorconfig 상세 설명

root = true
editorconfig 파일의 위치가 .editorconfig 존재하는 최상위 디렉터리임을 의미합니다. editorconfig 파일이 위치한 디렉터리와 그 하위 디렉터리에서는 다른 editorconfig 파일을 찾지 않고 이 파일의 설정을 사용합니다.

end_of_line = lf
운영체제마다 줄바꿈문자가 다른데 이것들을 통일시켜 줍니다.

indent_size = 4, indent_style = space
들여쓰기에 공백 4개를 사용하도록 지정합니다.

trim_trailing_whitespace = true
각 줄 끝의 공백문자(스페이스 및 탭)를 제거해 줍니다.

ktlint_disabled_rules=trailing-comma
trailing-comma를 강제하지 않습니다.

insert_final_newline = true
파일 끝에 줄을 추가합니다.

max_line_length = 120
한 줄의 최대 길이를 120자로 제한합니다.


ktlint 실행

./gradlew ktlintCheck 코드의 스타일을 검사하고 규칙에 어긋난 코드가 있으면 오류가 발생합니다.

./gradlew ktlintFormat 코드의 스타일을 검사하고 규칙에 어긋난 코드가 있으면 수정합니다.

git hook을 사용해 커밋하기 전에 ktlintCheck를 통해 오류를 검출할 수 있습니다.


Ktlint, Github Action 연동

Github Action과 연동해 push, pull request와 같은 이벤트 발생 시 Ktlint를 실행해 코드를 검사할 수 있습니다.

name: Lint

on: [push, pull_request]

jobs:
    ktlint: # job 이름
        runs-on: ubuntu-latest # 실행환경을 우분투로 설정

        steps:
        - uses: actions/checkout@v3 # 내가 커밋한 브랜치로 체크아웃

        - name: ktlint
          uses: ScaCap/action-ktlint@master # ktlint 실행
          with:
              github_token: ${{ secrets.github_token }}
              reporter: github-pr-check # github-pr-check,  github-pr-review 두 가지 방식이 존재

github repository -> setting -> Branches에서 job 이름을 명시해 주면

ktlint 오류 발생 시 merge를 막을 수 있습니다.


결과물

github-pr-check 방식을 사용했기 때문에 ktlint 오류 발생 시 이미지처럼 친절하게 알려줍니다.


발생한 문제

코틀린 1.4 버전 이후부터는 마지막 파라미터에 ,를 붙일 수 있는 trailing-comma를 지원합니다.

ktlint도 기본적으로 trailing-comma를 사용하지 않으면 오류를 발생시켰습니다.

저희는 trailing-comma를 사용하지 않기로 했습니다.

그래서 editorconfig 파일에 ktlint_disabled_rules=trailing-comma를 명시해
trailing-comma를 사용하지 않더라도 오류를 발생시키지 않도록 했습니다.


느낀점

협업을 할 때는 코드의 일관성과 품질 유지가 중요하다고 생각했습니다.

코드 컨벤션을 지키면, 코드의 이해도를 높이고 가독성이 향상되어 유지보수에 드는 비용을 줄일 수 있습니다.

앞으로는 린트를 사용해 코드의 일관성과 품질을 유지할 수 있을 것 같습니다.

이 글을 읽고 계신 다른 개발자분들도 개발 언어에 맞는 린트를 도입해 좋은 품질의 코드를 작성해 보시면 좋을 것 같습니다! 🎉🎉🎉


도움받은 글 🙇🙇🙇

https://pinterest.github.io/ktlint/1.0.0/rules/configuration-ktlint/
https://melonicedlatte.com/2022/06/11/235800.html
https://blog.benelog.net/ktlint.html
https://sungbin.land/ktlint-detekt-%EC%9C%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%ED%80%84%EB%A6%AC%ED%8B%B0-%ED%96%A5%EC%83%81%EC%8B%9C%ED%82%A4%EA%B8%B0-a085c7eba2cd
https://msyu1207.tistory.com/entry/%EA%B9%94%EB%81%94%ED%95%9C-%ED%8F%AC%EB%A7%B7%ED%8C%85%EC%9D%84-%EC%9C%84%ED%95%9C-ktlint-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0-feat-kotlin#toc-%F0%9F%9A%80%20ktlint%20with%20gitAction

profile
인풋보다 아웃풋

0개의 댓글