이번 글에서는 코드 컨벤션을 유지해 주는 린트를 도입한 경험을 정리해 보려고 합니다.
코드 컨벤션이 문서로만 되어 있으면 과연 잘 지켜질까요?
아마 잘 지켜지지 않을 것입니다.
빼먹는 경우도 많을 것이고, 무심코 사용하다 규칙을 알고도 잘 못 사용하는 상황이 생길 것입니다.
이때 코드 컨벤션, 코드의 오류나 버그를 지속해서 확인해 주고 미리 알려주는 도구가 Lint
입니다.
코틀린에서 가장 흔히 쓰이는 린트에는
ktlint, detekt 두 가지가 있습니다.
ktlint는 Kotlin의 공식 가이드의 규칙을 포함하여 코드 스타일을 검사하고, 맞춰주는 도구입니다.
detekt는 코드포멧팅 보다는, 코드 복잡성, code smell 탐색과 같은 코드 분석에 초점을 둔 도구입니다.
코드 컨벤션 유지와 코틀린 공식 코드 컨벤션에 초점을 맞춘 ktlint가 저희 프로젝트에 적합하다고 생각했기 때문에 ktlint를 도입하게 되었습니다!
두 린트는 서로 보완적인 역할을 하므로 두 린트의 기능이 다 필요하다면 둘 다 도입하여 코드 품질을 향상할 수 있습니다.
ktlint를 직접 설치하는 방법도 있지만 협업하는 프로젝트이기 때문에 다른 개발자분과 환경을 맞추기 위해 gradle 의존성을 추가하는 방법을 선택했습니다.
plugins {
id("org.jlleitschuh.gradle.ktlint") version "<current_version>"
}
최신 버전인 11.6.0을 사용했습니다.
editorconfig
은 IDE의 관계없이 일정한 코드 스타일을 유지하기 위해 도와주는 설정 파일입니다.
ktlint는 기본적으로 코틀린 공식 코드 컨벤션을 따릅니다.
그런데도 editorconfig를 만든 이유는 다음과 같습니다.
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
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자로 제한합니다.
./gradlew ktlintCheck
코드의 스타일을 검사하고 규칙에 어긋난 코드가 있으면 오류가 발생합니다.
./gradlew ktlintFormat
코드의 스타일을 검사하고 규칙에 어긋난 코드가 있으면 수정합니다.
git hook을 사용해 커밋하기 전에 ktlintCheck를 통해 오류를 검출할 수 있습니다.
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