맥에서 Git 커밋 전에 코드 스타일 자동으로 검사하는 방법

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
  1. Git 훅 설정

    pre-commit install
    
  2. 전체 파일 검사 (선택사항)

    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의 가장 큰 장점은 커밋 시점에 문제를 발견하고 수정할 수 있다는 점이에요. 코드 리뷰에서 스타일 문제로 시간을 낭비하지 않고, 더 중요한 로직과 구조에 집중할 수 있게 되죠. 특히 여러 명이 협업하는 프로젝트에서는 코드 품질과 일관성을 유지하는 데 필수적인 도구라고 할 수 있어요.


macOS에서 git 로그를 Markdown으로 자동 변환하는 완벽 가이드