[TIL] 커밋 메시지 컨벤션 (Angular Style)

📌 들어가며

프리코스 과제에 앞서, README.md에 정의된 기능 단위별로 커밋하고 AngularJS Commit Message Conventions를 참고해 메시지를 작성하라는 요구사항이 있었다.
평소에는 단순히 <type>: <subject> 형태로 커밋을 작성했지만, 이번 기회를 통해 좀 더 의미 있는 커밋 메시지 구조를 정립하고자 문서를 자세히 살펴보며 정리해보았다.


📌 커밋 컨벤션의 목적

  1. CHANGELOG.md 자동 생성
    → feat, fix, breaking change를 기반으로 자동화 가능
  2. 불필요한 커밋 구분
    → 단순 포매팅이나 주석 수정 등은 style, chore로 분리
  3. 히스토리 가독성 향상
    → 어떤 기능이 어디에서 수정되었는지 명확히 남김

📌 커밋 메시지 구조

<type>(<scope>): <subject> 
<공백> 
<body> 
<공백> 
<footer>
→ 각 줄은 100자 이내로 유지

 

1️⃣ <type> 종류

  1. feat - 새로운 기능 추가
  2. fix - 버그 수정
  3. docs - 문서 변경
  4. style - 포매팅, 세미콜론 등 코드 포맷 수정
  5. refactor - 리팩토링 (기능 변화 X)
  6. test - 테스트 코드 추가/수정
  7. chore - 빌드,설정,배포 등 유지보수 관련

2️⃣ <scope> — 영향 범위

  • 수정된 코드 영역이나 모듈을 지정
    ex) auth, api, $compile, router, ui, test 등

3️⃣ <subject> — 한 줄 요약

  • 명령형 현재 시제 사용
  • 소문자로 시작, 마침표 생략
  • "무엇을 추가했는가?" 에 초점이 맞춰져 있음
  • ex)
    - fix(router): 잘못된 경로 파라미터 처리
    - refactor(api): API 호출 함수를 추상화
    - feat(auth): JWT 토큰 자동 갱신 기능 추가
    - style(ui): 버튼 여백 수정

4️⃣ Body

  • 변경 이유와 기존 동작의 차이 설명
  • 명령형 현재 시제 유지
  • "왜 추가했는가? 어떤 문제가 있었고, 어떻게 해결했는가?" 에 초점이 맞춰져 있음
  • ex)
    - 회원가입 시 동일한 사용자명이 중복 등록되는 문제를 방지하도록 검증 로직 수정
    - 비동기 요청 에러 발생 시 사용자에게 알림 표시 추가
    - API 호출 중복을 줄이기 위해 fetch 함수를 공통 유틸로 분리

5️⃣ Footer

  • Breaking Change
    - 하위 호환이 깨지는 변경은 BREAKING CHANGE:로 명시
    - 변경 내용, 이유, 이전/이후 코드 예시 포함
  • Issue 참조
    - Closes #123 Closes #45, #67
 

🔥 예시

fix(api): 사용자 정보 요청 시 500 에러 발생 문제 수정

일부 사용자 계정에서 잘못된 ID 값이 전달되어 서버 오류가 발생했음.  
요청 전 ID 유효성 검사를 추가하여 잘못된 요청을 사전에 차단하도록 수정함.

BREAKING CHANGE: ID 필드 형식이 변경되어 기존 클라이언트에서 요청 시 유효성 검사를 통과하지 못할 수 있음.
feat(auth): JWT 토큰 자동 갱신 기능 추가

기존에는 로그인 후 토큰 만료 시 재로그인이 필요했음.
~~ 방식을 도입해 만료 직전에 자동으로 토큰을 갱신하도록 개선.

Closes: #123

📚 오늘의 배움

  • 커밋 메시지는 type, scope, subject, body, footer로 구성되며,
    이 구조를 잘 활용하면 변경 의도와 맥락이 명확하게 전달되는 커밋을 남길 수 있다.
  • 특히 changelog 자동화를 통해 버전 업데이트 시 변경 이력을 자동으로 관리할 수 있다는 점이 가장 인상 깊었다.
  • 프리코스 과제에서는 버전 관리까지는 다루지 않지만, 시간이 된다면 직접 changelog 구성을 시도해보며 커밋 컨벤션의 전체 흐름을 경험해보고 싶다.