인천의 한 일요일, 지인과 함께 인증 서비스 개발을 하기로 하였다.
프로젝트 세팅 중에 코드 스타일 적용 방식에 대하여 이야기 하였다.
지인분의 회사에서는 pre-commit을 활용하여 commit 이전에 코드 스타일이 자동으로 적용되도록 하고 있다고 한다.
이를 활용하면 commit시에 pre-commit git hook을 통해서 코드 스타일에 위배되는 코드를 자동으로 수정해준다.
결국 commit에 코드 스타일에 위배되는 내용이 들어가는 것을 방지할 수 있다.
이번 프로젝트에 pre-commit hook을 사용하여 코드 스타일 적용을 자동화 하기로 하였다.
Java 의 코딩 스타일 적용에 사용할 플러그인을 조사하였다.
pre-commit git hook에 등록하여 사용하는 것은 주로 2가지로 보인다.
CheckStyle은 코드 스타일 체크는 가능하지만 코드 스타일 적용 기능은 제공하지 않는다.
반면 Spotless 는 코드 스타일을 체크하고 적용 기능까지 제공한다.
따라서 Spotless 를 사용하기로 하였다.
plugins {
id "com.diffplug.spotless" version "6.25.0"
}
spotless {
java {
googleJavaFormat('1.21.0')
}
}
build.gradle 에서 spotless 플러그인을 추가해주고
사용할 스타일과 버전을 적용해준다.
#!/bin/sh
# Apply google style using Spotless
./gradlew spotlessApply
# Format staged Java files using google-java-format
java -jar tools/google-java-format-1.21.0-all-deps.jar -i $(git diff --cached --name-only --diff-filter=ACM -- '*.java' | xargs)
# Add formatted files back to the index
git add $(git diff --cached --name-only --diff-filter=ACM -- '*.java' | xargs)
.git/hooks/pre-commit 파일을 생성하고 실행할 내용을 설정해준다.
여기서는 google-java-format-1.21.0-all-deps.jar 파일을 실행시켜서 사용되지 않은 import 까지도 제거하도록 해주었다.
#!/bin/sh
# Copy the pre-commit sample to the .git/hooks directory
cp hooks/pre-commit.sample .git/hooks/pre-commit
# Make the pre-commit hook executable
chmod +x .git/hooks/pre-commit
.git 하위의 파일들은 git에 올라가지 않는다.
해당 프로젝트를 사용하는 인원 모두가 git hook을 적용할 수 있도록 git hook을 적용하는 스크립트를 추가해주었다.
마지막으로 readme 에 git hook 설정 스크립트를 실행해야한다는 내용을 추가하여 모두가 동일한 코드 스타일을 공유할 수 있도록 하였다.