이끌든지 따르든지 비키든지

Software Development/Utility

[Spotless] 클릭 한 번으로 코드 정리하기

SeongHo5 2024. 5. 29. 14:04

Spotless란?


코드 스타일 규칙을 자동으로 적용하여 코드베이스의 일관성 유지를 도와주는 오픈 소스 도구입니다.

Gradle 플러그인으로 쉽게 통합할 수 있으며, Java, Kotlin, Groovy, Scala, Python, C, C++, Markdown, JSON, XML 등을 지원합니다.

 

 

Spotless를 의존성에 추가하기

// build.gradle
plugins {
    id 'java'
    id 'com.diffplug.spotless' version '6.25.0'
}

repositories {
    mavenCentral()
    gradlePluginPortal()
}

 

 

Spotless를 사용하려면, Gradle 플러그인 포털에 대한 정보를 추가해주어야 합니다.

gradlePluginPortal()을 잊지 말고 추가해주세요!

 

 

Spotless 설정 구성하기

// build.gradle
spotless {
    java {
        importOrder(
                'java|javax|jakarta',
                'org.springframework',
                'lombok',
                '',
                'org.junit|org.mockito',
                '\\#',
                '\\#org.junit'
        )
        
        googleJavaFormat()

        formatAnnotations()
        removeUnusedImports()
        trimTrailingWhitespace()
        endWithNewline()
    }
}

 

 

  • importOrder - import문이 정렬될 순서를 설정할 수 있습니다.
    • 작성된 순서대로 정렬되고, 그룹 간 줄 바꿈으로 구분됩니다.
    • | - 파이프라인을 사용해, 줄 바꿈 없이 그룹
    • ' ' - 순서를 정의하지 않은 그 외 나머지를 표현할 때 사용합니다.
    • \\# - static import문에 대한 정렬 순서를 설정할 때 사용합니다.
  • googleJavaFormat() - Google Java Style을 따르도록 포맷을 적용합니다. 버전을 명시할 수 있습니다.
 

Google Java Style Guide

1 Introduction This document serves as the complete definition of Google's coding standards for source code in the Java™ Programming Language. A Java source file is described as being in Google Style if and only if it adheres to the rules herein. Like ot

google.github.io

  • removeUnusedImports() - 불필요한 import 문을 제거합니다.
  • trimTrailingWhitespace() - 각 줄의 끝에 있는 불필요한 공백을 제거합니다.
  • endWithNewline() - 파일 끝에 항상 새로운 줄을 추가합니다.
  • formatAnnotations() - 어노테이션을 정렬합니다.

 

Spotless 관련 Gradle 명령어

  • 코드 베이스가 Spotless에 정의된 규칙을 지키고 있는지 검사
./gradlew spotlessCheck

 

 

  • 코드 베이스를 Spotless에 정의된 규칙에 맞게 포맷팅
./gradlew spotlessApply

 

 

포맷을 항상 일관되게 유지하려면, build 전에 spotlessApply를 실행하도록 아래와 같이 구성할 수 있습니다.

 

tasks.named('build') {
    dependsOn 'spotlessApply'
}