본문 바로가기
카테고리 없음

spotless 적용하기

by 위시우 2024. 11. 24.
  1. build.gradle 의 최상단에 존재하는 plugins 에 코드를 추가합니다.
    plugins {
     id 'java'
     id 'org.springframework.boot' version '3.3.5'
     id 'io.spring.dependency-management' version '1.1.6'
     id 'com.diffplug.spotless' version '6.21.0'
    }
  1. 공식문서의 Java 코드 부분을 build.gradle 에 추가합니다.

    spotless {
    java {
     // Use the default importOrder configuration
     importOrder()
     // optional: you can specify import groups directly
     // note: you can use an empty string for all the imports you didn't specify explicitly, '|' to join group without blank line, and '\\#` prefix for static imports
     importOrder('java|javax', 'com.acme', '', '\\#com.acme', '\\#')
     // optional: instead of specifying import groups directly you can specify a config file
     // export config file: https://github.com/diffplug/spotless/blob/main/ECLIPSE_SCREENSHOTS.md#creating-spotlessimportorder
     importOrderFile('eclipse-import-order.txt') // import order file as exported from eclipse
    
     removeUnusedImports()
    
     // Cleanthat will refactor your code, but it may break your style: apply it before your formatter
     cleanthat()          // has its own section below
    
     // Choose one of these formatters.
     googleJavaFormat()   // has its own section below
     eclipse()            // has its own section below
     prettier()           // has its own section below
     clangFormat()        // has its own section below
    
     formatAnnotations()  // fixes formatting of type annotations, see below
    
     licenseHeader '/* (C) $YEAR */' // or licenseHeaderFile
    }
    }

spotless 공식문서 링크

  1. 그 중 필요한 부분만 적용합니다.

    spotless {
    
     java {
    
         target("**/*.java")
    
         importOrder()
    
         // google java format
    
         googleJavaFormat().aosp()
    
         // annotation formatting
         formatAnnotations()
    
     }
    

}


### removeUnusedImports 
```gradle
spotless {
  java {
  removeUnusedImports()
  // optional: you may switch for `google-java-format` as underlying engine to `cleanthat-javaparser-unnecessaryimport`
  // which enables processing any language level source file with a JDK8+ Runtime
  removeUnusedImports('cleanthat-javaparser-unnecessaryimport')

removeUnusedImports 추가 안함

Spotless 명령어 사용을 잊은채, commit 을 진행하게 될 수 있습니다. 나중에 spotless 를 적용하게 되면 다른 내용과 커밋이 섞일 수 있습니다.

이를 위해 pre-commit 을 사용합니다 .

Pre-commit

Pre-commit 이란 커밋을 진행하기 전, 개발자가 정해놓은 설정을 수행하도록 하는 것입니다 .

위의 Spotless 뿐 아니라 원하는 행동을 스크립트로 작성하면 해당 내용을 커밋 수행전 실행하게 됩니다.

Scripts/pre-commit


#!/bin/sh

targetFiles=$(git diff --staged --name-only)

echo "Apply Spotless.."
./gradlew spotlessApply

# Add files to stage spotless applied
for file in $targetFiles; do
  if test -f "$file"; then
    git add $file
  fi
done

현재 스테이징 된 파일만 확인합니다.
그리고 spotlessApply 를 진행합니다.

Commit 하기 전에 pre-commit 에서 spotlessApply 를 한다 .

현재 스테이징 된 변경 사항 중 spotlessApply 를 하는 것이 필요하다.
Staging 된 파일을 순회하면서 spotlessApply 한다.

Scripts/prepare-commit-msg

#!/bin/sh
BRANCH_NAME=$(git symbolic-ref --short HEAD)
echo BRANCH_NAME : "$BRANCH_NAME"

# 브랜치 이름에서 cmc-숫자 에 해당하는 문자열을 추출하여 Jira id 에 저장
ISSUE_ID=$(echo "${BRANCH_NAME}" | grep -o '^cmc-[0-9]*')
echo Issue id : "$ISSUE_ID"

# 추출한 문자열 반영
BRANCH_IN_COMMIT=$(grep -c "$ISSUE_ID" $1)

if [[ -n $ISSUE_ID ]] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then
  sed -i.bak -e "1s/^/$ISSUE_ID /" $1
fi

하지만 pre-commit, prepare-commit-msg 는 자동으로 로컬 git 에 적용되지 않는다.

고로 .git/hooks 에 복사하기 위한 gradle task ‘addGitPreCommitHook’ 를 등록한다.
그리고 'addGitPreCommitHook’ 은 compileJava 를 할때 마다 실행되도록 한다.
만약 새로운 팀원이 추가된다면, 반드시 compileJava 를 먼저 실행하여 pre-commit, prepare-commit-msg hook 을 실행하도록 한다.


// git pre-commit hook task 설정

tasks.register("addGitPreCommitHook", Copy) {
    from './scripts/pre-commit', './scripts/prepare-commit-msg'
    into '.git/hooks'
}
compileJava.dependsOn addGitPreCommitHook

댓글