Git 커밋할 때마다 코드 스타일을 수동으로 점검하는 게 번거로우신가요? macOS에서 pre-commit 훅을 설정하면 커밋 전에 자동으로 코드 포맷팅과 린팅이 실행돼요. 팀 프로젝트에서 일관된 코드 스타일을 유지하고 싶다면 pre-commit이 최고의 선택이에요.
pre-commit 설치하기
Mac에서는 Homebrew로 간단하게 설치할 수 있어요:
brew install pre-commit
Python을 사용하신다면 pip로도 설치 가능해요:
pip install pre-commit
설치가 완료되면 버전을 확인해보세요:
pre-commit --version
프로젝트 설정 파일 만들기
프로젝트 루트 디렉토리에 .pre-commit-config.yaml 파일을 생성해요. 이 파일에서 어떤 검사 도구를 사용할지 정의하게 돼요.
Python 프로젝트 예시:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/psf/black
rev: 24.2.0
hooks:
- id: black
args: [--line-length=88]
- repo: https://github.com/PyCQA/flake8
rev: 7.0.0
hooks:
- id: flake8
args: [--max-line-length=88]
- repo: https://github.com/PyCQA/isort
rev: 5.13.2
hooks:
- id: isort
args: [--profile=black]
JavaScript/TypeScript 프로젝트라면 이렇게 설정해요:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.49.0
hooks:
- id: eslint
files: \.(js|jsx|ts|tsx)$
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v3.0.0
hooks:
- id: prettier
files: \.(js|jsx|ts|tsx|css|scss|json|md)$
Git 훅 활성화하기
설정 파일을 만들었다면 pre-commit을 Git 훅에 연결해요:
pre-commit install
이제 git commit을 실행할 때마다 설정한 검사가 자동으로 실행돼요. 만약 코드 스타일에 문제가 있으면 커밋이 중단되고, 일부 도구는 자동으로 문제를 수정해줘요.
전체 파일 검사하기
기존 프로젝트에 pre-commit을 도입했다면 모든 파일을 한 번에 검사해볼 수 있어요:
pre-commit run --all-files
특정 훅만 실행하고 싶다면:
pre-commit run black --all-files
다양한 언어별 설정 예시
Java/Kotlin 프로젝트:
repos:
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
rev: v2.11.0
hooks:
- id: pretty-format-kotlin
args: [--autofix]
- repo: local
hooks:
- id: ktlint
name: ktlint
entry: ./gradlew ktlint
language: system
files: \.kt$
Go 프로젝트:
repos:
- repo: https://github.com/dnephin/pre-commit-golang
rev: v0.5.1
hooks:
- id: go-fmt
- id: go-vet
- id: go-imports
- id: go-cyclo
args: [-over=15]
- id: golangci-lint
Ruby 프로젝트:
repos:
- repo: https://github.com/mattbrictson/bundle-audit-pre-commit
rev: v0.1.0
hooks:
- id: bundle-audit
- repo: https://github.com/mattlqx/pre-commit-ruby
rev: v1.3.5
hooks:
- id: rubocop
args: [--auto-correct]
유용한 공통 훅들
언어에 상관없이 사용할 수 있는 유용한 훅들이 있어요:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: check-merge-conflict # 머지 충돌 마커 검사
- id: check-json # JSON 파일 문법 검사
- id: check-toml # TOML 파일 문법 검사
- id: check-xml # XML 파일 문법 검사
- id: detect-private-key # 개인 키 유출 방지
- id: mixed-line-ending # 줄바꿈 문자 일관성
- id: no-commit-to-branch # main/master 직접 커밋 방지
args: [--branch, main, --branch, master]
커스텀 훅 만들기
특별한 검사가 필요하다면 직접 훅을 만들 수도 있어요:
repos:
- repo: local
hooks:
- id: check-copyright
name: Check copyright headers
entry: ./scripts/check-copyright.sh
language: script
files: \.(py|js|java)$
- id: run-tests
name: Run unit tests
entry: npm test
language: system
pass_filenames: false
always_run: true
훅 건너뛰기와 문제 해결
급하게 커밋해야 할 때는 --no-verify 옵션을 사용해요:
git commit -m "긴급 수정" --no-verify
특정 파일을 검사에서 제외하려면 .pre-commit-config.yaml에서 exclude 옵션을 사용해요:
repos:
- repo: https://github.com/psf/black
rev: 24.2.0
hooks:
- id: black
exclude: ^(migrations/|vendor/)
팀 프로젝트에서 활용하기
팀원들이 pre-commit을 쉽게 설정할 수 있도록 README에 안내를 추가해요:
## 개발 환경 설정
1. pre-commit 설치
```bash
brew install pre-commit
-
Git 훅 설정
pre-commit install
-
전체 파일 검사 (선택사항)
pre-commit run --all-files
### CI/CD 파이프라인 연동
GitHub Actions에서도 pre-commit을 실행할 수 있어요:
```yaml
name: pre-commit
on:
pull_request:
push:
branches: [main]
jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
- uses: pre-commit/action@v3.0.0
성능 최적화 팁
대규모 프로젝트에서는 staged 파일만 검사하도록 설정해요:
repos:
- repo: https://github.com/psf/black
rev: 24.2.0
hooks:
- id: black
stages: [commit] # commit 단계에서만 실행
병렬 실행으로 속도를 높일 수도 있어요:
pre-commit install --install-hooks
pre-commit run --all-files --hook-stage manual --jobs 4
자주 사용되는 린터/포맷터 조합
Python 풀스택:
- Black (포맷터)
- isort (import 정렬)
- flake8 또는 Ruff (린터)
- mypy (타입 체크)
- bandit (보안 검사)
JavaScript/TypeScript 풀스택:
- ESLint (린터)
- Prettier (포맷터)
- stylelint (CSS 린터)
- commitlint (커밋 메시지 검사)
멀티 언어 프로젝트:
- pre-commit-hooks (공통 검사)
- detect-secrets (비밀 정보 탐지)
- codespell (오타 검사)
- yamllint (YAML 린터)
pre-commit의 가장 큰 장점은 커밋 시점에 문제를 발견하고 수정할 수 있다는 점이에요. 코드 리뷰에서 스타일 문제로 시간을 낭비하지 않고, 더 중요한 로직과 구조에 집중할 수 있게 되죠. 특히 여러 명이 협업하는 프로젝트에서는 코드 품질과 일관성을 유지하는 데 필수적인 도구라고 할 수 있어요.