Skip to content

[CHORE] 린팅 및 포매팅 도입#8

Merged
i-meant-to-be merged 8 commits into
developfrom
chore/#6
Jun 26, 2026
Merged

[CHORE] 린팅 및 포매팅 도입#8
i-meant-to-be merged 8 commits into
developfrom
chore/#6

Conversation

@i-meant-to-be

@i-meant-to-be i-meant-to-be commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator

🚩 연관 이슈

closed #6

📝 작업 내용

린팅 및 포매팅을 프로젝트에 적용합니다. 주요 변경 사항은 다음과 같습니다:

  • 린팅 및 포매팅을 위한 의존성 추가
  • 린팅 및 포매팅을 위한 컨벤션 플러그인 추가
  • 기타 관련 스크립트, 파일 등 추가

📖 의존성 추가

다음의 3건 의존성을 추가합니다:

이름 용도
Spotless 포매팅
detekt Kotlin 린팅
Slack Compose Lint Jetpack Compose 린팅

🛠️ 컨벤션 플러그인 추가

린팅 및 포매팅을 적용할 수 있는 컨벤션 플러그인을 추가했습니다.

린팅 및 포매팅 컨벤션 플러그인

이 컨벤션 플러그인은 다른 모듈에 사용할 수 있습니다. 크게 2가지로 나뉩니다:

Kotlin 린팅 및 포매팅

순수 Kotlin 코드에 대해 적용할 수 있는 컨벤션 플러그인입니다. 순수 Kotlin이라는 말은 즉 Android Native 기능과는 전혀 관련이 없는 모듈이어야 한다는 의미입니다.

Android 린팅 및 포매팅

Android 의존 코드에 대해 적용할 수 있는 컨벤션 플러그인입니다. 그렇기 때문에 Kotlin 린팅 및 포매팅 플러그인에는 없는 Slack Compose Lints가 적용되어 있습니다. 이 플러그인은 Spotlessdetekt 설정을 포함하며, Android 모듈에는 Slack Compose Lint도 추가로 적용합니다.

베이스 컨벤션 플러그인

이 컨벤션 플러그인들은 직접 사용하지 않습니다. 위에서 소개한 Kotlin 및 Android 린팅 및 포매팅 컨벤션 플러그인이 내부적으로 사용하는 플러그인으로서 외부에서 직접 사용할 일은 없습니다.

  • Detekt 플러그인 | build-logic/src/main/kotlin/com/dminus14/app/convention/DetektConventionPlugin.kt
  • Spotless 플러그인 | build-logic/src/main/kotlin/com/dminus14/app/convention/SpotlessConventionPlugin.kt

버전 카탈로그에 새 컨벤션 플러그인 추가

gradle/libs.versions.toml 파일에 새로 정의한 컨벤션 플러그인들을 등록했습니다:

dminus14-kotlin-lint = { id = "dminus14.kotlin.lint" }
dminus14-android-lint = { id = "dminus14.android.lint" }

아래와 같이 버전 카탈로그 별칭(alias)으로 불러오면 됩니다:

  • alias(libs.plugins.dminus14.android.lint)
  • alias(libs.plugins.dminus14.kotlin.lint)

📝 기타 파일 추가

여러 파일을 추가했습니다. 각 파일의 목적은 다음과 같습니다:

파일 목적
.editorconfig 프로젝트 전반의 코드 스타일 가이드 정의
config/detekt.yml detekt 린팅 규칙 및 활성화 여부 설정
script/pre-commit 커밋 전 포매팅을 확인하는 훅
.gitattributes Windows 환경에서 pre-commit의 줄바꿈 문자로 인한 문제를 방지하기 위해 추가

🤔 사용법

그래서 어떻게 쓰냐고요? 크게 순수 Kotlin과 Android 모듈로 나누어 사용하면 됩니다.

순수 Kotlin 모듈

모듈의 plugin 블록에 아래 코드를 추가합니다:

plugins {
    alias(libs.plugins.dminus14.kotlin.lint)
}

Android 모듈

모듈의 plugin 블록에 아래 코드를 추가합니다:

plugins {
    alias(libs.plugins.dminus14.android.lint)
}

추가로, Android 모듈에 대해서는 dminus14.kotlin.lint 플러그인을 추가로 적용 안 해줘도 됩니다. dminus14.android.lint 플러그인이 dminus14.spotlessdminus14.detekt를 포함하고 있어, Android에 더해 Kotlin 린팅도 함께 진행하기 때문입니다.

수동 실행

다음의 3가지 명령어로 린팅 및 포매팅을 수동 실행할 수 있습니다:

  • ./gradlew lintDebug | 린팅 상태 확인
  • ./gradlew spotlessCheck | 포매팅 상태 확인
  • ./gradlew spotlessApply | 포매팅 적용

✅ 로직 변경 없는 파일

아래 파일들은 린팅 및 포매팅 도입 후, 포매팅에 의해 발생한 변경 사항으로서 로직 변경은 없습니다.

  • app/src/main/java/com/dminus14/app/DMinus14App.kt
  • app/src/main/java/com/dminus14/app/ui/theme/Color.kt
  • app/src/main/java/com/dminus14/app/ui/theme/Theme.kt
  • app/src/main/java/com/dminus14/app/ui/theme/Type.kt
  • app/src/androidTest/java/com/dminus14/app/ExampleInstrumentedTest.kt
  • app/src/test/java/com/dminus14/app/ExampleUnitTest.kt

🏞️ 스크린샷 (선택)

없음

🗣️ 리뷰 요구사항 (선택)

  • 멀티 모듈이 도입([CHORE] 공통 빌드 로직 관리 모듈 추가 #4)되기 전에 제가 먼저 사전 작업을 조금 해 뒀는데, 고려하고 계신 내용과 틀린 부분이 있다면 말씀 남겨주세요.
  • 이 PR 병합 이후에는 매번 커밋할 때마다 시간이 한 5초 정도 걸릴 거예요. 그 시간 동안 린팅이랑 포매팅에 문제 없는지 확인하고 올린다고 생각하시면 돼요.
  • 아마 CI PR이 병합된 이후에 해당 스크립트에 린팅 여부를 검사하는 옵션을 한 줄 추가할 겁니다. 이 부분만 인지해주시면 좋을 것 같아요!

@i-meant-to-be i-meant-to-be requested a review from lyh5427 June 25, 2026 14:54
@i-meant-to-be i-meant-to-be self-assigned this Jun 25, 2026
@i-meant-to-be i-meant-to-be added the chore 파일 경로 변경, 의존성 등 비 개발 작업 label Jun 25, 2026

@lyh5427 lyh5427 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 👍
로컬 브런치로 테스트해봤는데 엄청 편리하네요 ㅎ

구조는 제가 고려하던 방향과 동일합니다! 깔끔하게 잘 되어있는 것 같아요

아마 CI PR이 병합된 이후에 해당 스크립트에 린팅 여부를 검사하는 옵션을 한 줄 추가할 겁니다. 이 부분만 인지해주시면 좋을 것 같아요!

Q1. 위 내용은 pre-commit에 detekt만 추가인가요, lintDebug인가요? 어느 방향이든 병합 전에 추가하고 병합해주셔도 될 것 같습니다!

@lyh5427 lyh5427 mentioned this pull request Jun 26, 2026
@i-meant-to-be

Copy link
Copy Markdown
Collaborator Author

/noti

Q1. 위 내용은 pre-commit에 detekt만 추가인가요, lintDebug인가요? 어느 방향이든 병합 전에 추가하고 병합해주셔도 될 것 같습니다!

둘 다입니다.

  • detekt는 방금 커밋으로 추가했어요.
  • lintDebug는 CI 스크립트에 원래 포함되어 있었어요.

추가로 spotlessCheck도 같이 달아두었어요. 이로서 현재 CI 스크립트에서 gradlew에 맡기는 작업은 아래와 같습니다:

  • spotlessCheck | 띄어쓰기, 줄바꿈 등 간단한 문법 검사
  • detekt | Kotlin 측 정적 문법 검사
  • testDebugUnitTest | 테스트 진행
  • lintDebug | Android 측 정적 문법 검사
  • assembleDebug | 빌드

혹시나 하여 첨언하자면 코드를 직접 수정하는 spotlessApply는 CI에 적용하지 않습니다. CI는 단순히 코드 품질을 검증하는 절차이기 때문에 코드 수정이 여기서 같이 이루어지면 책임이 모호해져요.

@i-meant-to-be i-meant-to-be merged commit 2bb9d2a into develop Jun 26, 2026
1 check passed
@i-meant-to-be i-meant-to-be deleted the chore/#6 branch June 26, 2026 13:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore 파일 경로 변경, 의존성 등 비 개발 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[CHORE] 린팅 설정

2 participants