02-03 커밋 컨벤션과 시맨틱 버저닝

일관된 커밋 메시지가 사람과 도구 모두를 돕는다 — Conventional Commits로 버전·CHANGELOG까지 자동화.


일관된 커밋 메시지가 사람과 도구 모두를 돕는다 — Conventional Commits로 버전·CHANGELOG까지 자동화.

목표: 읽기 좋은 히스토리 + 릴리스 자동화 기반 마련


📝 Conventional Commits

구조

<type>(<scope>): <subject>

<body>

<footer>

예시:

feat(auth): JWT 인증 추가

- 토큰 생성·검증 미들웨어 구현
- 로그인 엔드포인트 수정

Closes #123

타입

타입의미버전 영향
feat새 기능MINOR ↑
fix버그 수정PATCH ↑
docs문서-
style포맷(동작 무관)-
refactor리팩토링-
perf성능 개선PATCH ↑
test테스트-
build빌드 시스템-
ciCI 설정-
chore잡무-

작성 규칙

  • 제목 50자 이내, 명령형 현재 시제(“추가한다”, add)
  • 끝에 마침표 없음
  • 본문은 무엇을·왜 (어떻게는 코드가 설명)
  • BREAKING CHANGE: footer 또는 feat!:는 호환성 깨짐 → MAJOR ↑

🔢 시맨틱 버저닝 (SemVer)

MAJOR.MINOR.PATCH   예: 2.4.1
graph LR
    MAJOR["MAJOR<br/>호환성 깨짐"] --- MINOR["MINOR<br/>기능 추가(호환)"] --- PATCH["PATCH<br/>버그 수정(호환)"]
변경올리는 자리
호환 안 되는 API 변경MAJOR1.4.2 → 2.0.0
하위 호환 기능 추가MINOR1.4.2 → 1.5.0
하위 호환 버그 수정PATCH1.4.2 → 1.4.3
  • 0.x.y는 초기 개발(언제든 바뀔 수 있음)
  • 사전 릴리스: 1.0.0-alpha.1, 1.0.0-rc.1

🤖 자동화: 커밋 → 버전 → CHANGELOG

Conventional Commits를 쓰면 도구가 커밋 타입을 읽어 자동으로:

graph LR
    COMMITS["커밋들<br/>(feat/fix/...)"] --> ANALYZE["타입 분석"]
    ANALYZE --> VER["다음 버전 결정"]
    VER --> TAG["태그 + 릴리스"]
    VER --> LOG["CHANGELOG 생성"]
  • semantic-release / release-please: 버전 결정·태그·릴리스 노트 자동
  • commitlint: 커밋 메시지가 규칙을 따르는지 검사(훅으로)
  • commitizen: 대화형으로 규칙 맞는 커밋 작성
# commitlint + husky 예시 (개념)
# .commitlintrc → @commitlint/config-conventional
# pre-commit/commit-msg 훅에서 검증 → 03-04 참고

✅ 좋은/나쁜 커밋 메시지

- update                          # 무엇을? 왜?
- fix bug                         # 어떤 버그?
- asdf                            # ...

+ fix(cart): 수량 0일 때 결제 차단
+ feat(search): 자동완성 디바운스 추가
+ refactor(auth): 토큰 검증 로직 분리

📋 체크리스트

  • Conventional Commits 구조 숙지
  • 타입과 버전 영향 매핑
  • 명령형·50자 제목 작성
  • BREAKING CHANGE 표기
  • SemVer 자리수 의미
  • commitlint/semantic-release 개념
  • 나쁜 메시지 → 좋은 메시지 교정

🔗 관련 노트

  • 02-02-PR과-코드-리뷰 — 이전
  • 02-04-gitignore와-파일-관리 — 다음
  • 03-04-Git-훅과-자동화 — commitlint 훅 적용
  • Git-상세-가이드 — 커밋 명령 옵션

마지막 업데이트: 2026-06-02