[Git Hook] Git Hook 사용하여 Java 코딩 컨벤션 지키기

Belluga·2021년 9월 1일
2

코딩 컨벤션

코딩 컨벤션은 일종의 개발자들 사이의 규칙입니다.
코딩 컨벤션을 지켜 전체적으로 일관성있는 코드를 작성함으로써 유지보수성을 높일 수 있습니다.

아래 링크에서 Google과 Naver의 Java 코딩 컨벤션을 살펴볼수 있습니다.

Google Java Style Guide
https://google.github.io/styleguide/javaguide.html#s3.4.1-one-top-level-class

캠퍼스 핵데이 Java 코딩 컨벤션
https://naver.github.io/hackday-conventions-java/#class-noun

Git Hook

Git Hook을 통해 push 후, commit 완료 후 등 특정 이벤트가 생겼을 때 자동으로 특정 스크립트를 실행하도록 할 수 있습니다.

Git Hook은 클라이언트 훅과 서버 훅으로 나눌 수 있습니다. 클라이언트 훅은 commit 이나 merge 할 때 실행되고 서버 훅은 push 할 때 서버에서 실행됩니다.

클라이언트 훅을 사용하여 commit시 Java 코딩 컨벤션을 체크하고 컨벤션을 지키는 코드만 commit 되도록 설정해봅시다.

규칙 파일 다운로드

https://github.com/naver/hackday-conventions-java/blob/master/rule-config/naver-checkstyle-rules.xml
먼저 저희는 Naver의 코딩 컨벤션을 사용하기로 하였습니다.
위 링크에서 규칙을 다운로드 받을 수 있습니다.

<root>
└── config
    └── checkstyle           
        └── checkstyle.xml 

다운받은 규칙 파일을 프로젝트 루트 하위 경로에 두었습니다.

<module name="SuppressionFilter">
    <property name="file" value="${suppressionFile}"/>
    <property name="optional" value="false"/>
</module

참고로 저는 굳이 예외로 지정할 파일이 없었기 때문에 naver-checkstyle-rules.xml에서 위의 선언은 삭제하고 사용하였습니다.

IntelliJ CheckStyle 설정

Git Hook을 설정하기 전,
IDE 설정을 통해 코딩 컨벤션을 체크할 수 있는 환경을 구성하도록 하겠습니다.

먼저 CheckStyle-IDEA 플러그인을 다운로드 받아줍니다.

설정 > 도구 > Checkstyle에서 미리 다운로드 받은 Naver CheckStyle Configuration file을 등록해주고 활성화해줍니다.

CheckStyle 설정을 통해 한 라인 안에서 여러 변수가 선언될 수 없다는 경고를 안내하고있습니다.

하단 CheckStyle 탭을 통해 프로젝트 전반적으로 코딩 컨벤션을 어긴 부분을 확인할 수 있습니다.

Git Hook pre-commit 설정

그러나 현재 규칙을 어긋나는 코드가 존재하더라도 commit, push가 모두 가능한 상황입니다.
따라서 commit 직전 규칙 검사를 통해 규칙을 어긋나는 코드가 있다면 commit되지 않도록 설정해보도록 하겠습니다.

프로젝트 경로/.git/hooks에는 Git에서 지원하는 Hook들의 목록을 살펴볼 수 있습니다.
.sample 확장자를 지우면 별도의 설정 없이 각 상황에 샘플이 바로 적용됩니다.
pre-commit은 commit 직전에 스크립트를 실행하기 때문에 테스트가 실행되는지 확인하거나, 코드에서 검사해야 하는 항목을 검사하는 데 사용하기 적합합니다.

직접 스크립트를 작성할 수 있지만 이미 CheckStyle을 검사하는 스크립트가 다수 존재하기 때문에 이를 이용하도록 하겠습니다.

아래 링크에서 스크립트를 다운받아 pre-commit 파일을 스크립트 내용으로 교체합니다.
https://gist.github.com/davetron5000/37350

그리고 CheckStyle을 실행할 수 있는 jar파일을 아래 링크에서 다운로드 받아줍니다.
https://github.com/checkstyle/checkstyle/releases/

To use this you need:
  1. checkstyle's jar file somewhere
  2. a checkstyle XML check file somewhere
  3. To configure git:
    * git config --add checkstyle.jar <location of jar>
    * git config --add checkstyle.checkfile <location of checkfile>
    * git config --add java.command <path to java executale> [optional
      defaults to assuming it's in your path]
  4. Put this in your .git/hooks directory as pre-commit

스크립트에 작성된 TODO List를 확인해보면 [1], [2], [4]는 완료하였으니
아래 git 명령어를 통해 git 설정만 추가해면 됩니다.

git config --add checkstyle.jar c:/Users/.../.git/hooks/checkstyle-8.45.1-all.jar
git config --add checkstyle.checkfile c:/Users/.../config/checkstyle/naver-checkstyle-rules.xml

여기까지 진행했다면 commit 명령어 수행시, 작성한 스크립트가 실행되면서 CheckStyle을 검사하고 규칙을 어긋나는 코드가 있다면 Commit이 되지 않습니다.

만약 Waning만 하고 commit이 된다면?

사용하는 checkstyle.xml 파일을 다시 한번 확인해보시길 바랍니다.

<module name = "Checker">
	<property name="severity" value="warning"/>

위와 같이 위험도가 warning으로 설정되어있다면 다음과 같이 error로 변경하면 됩니다.

<module name = "Checker">
	<property name="severity" value="error"/>

References

https://techblog.woowahan.com/2530/

https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

0개의 댓글