[Git] 효과적인 커밋 메시지를 작성하는 7가지 방법

klmin·2024년 10월 17일

좋은 커밋 메세지를 남겨야 하는 이유

커밋 메시지를 제대로 작성하는 것은 단순히 관습이 아니라 코드의 유지보수성을 높이고 협업을 원활하게 만드는 핵심 요소이다.

프로젝트 규모가 커지면 커질수록 일관성 있는 커밋 메시지는 더 큰 가치를 발휘하게 된다.

커밋 메시지의 7가지 규칙

1. 제목과 본문을 빈 행으로 구분한다.
2. 제목을 50글자 내로 제한한다.
3. 제목 첫 글자는 대문자로 작성한다.
4. 제목 끝에 마침표 넣지 않는다.
5. 제목은 명령문으로 사용하며 과거형을 사용하지 않는다.
6. 본문의 각 행은 72글자 내로 제한한다.
7. 어떻게 보다는 무엇과 왜를 설명한다.

타입

  • feat: 새로운 기능 추가
  • fix: 버그 수정
  • docs: 문서 수정
  • style: 코드 형식 수정 (포맷팅, 세미콜론 추가 등. 코드의 동작에는 영향을 주지 않음)
  • design : 사용자 UI 디자인 변경 등
  • refactor: 코드 리팩토링 (기능 변경 없이 코드 구조 개선)
  • test: 테스트 코드 추가 또는 수정
  • build: 빌드 파일 수정
  • ci: CI 설정 파일 수정
  • chore: 빌드 과정이나 기타 잡다한 변경 사항
  • perf: 성능 개선
  • rename: 파일 혹은 폴더명 수정
  • remove : 파일 삭제

* 예시)

  1. 새로운 기능 추가 (feat)
    - JWT 기반 인증 시스템을 추가하여, API 접근 시 보안을 강화하는
      기능을 도입한 경우.
feat(auth): Add JWT authentication for secure API access
  1. 버그 수정 (fix)
    - 사용자 서비스에서 발생한 널 포인터 예외를 해결한 경우.
fix(user): Resolve null pointer exception in user service
  1. 코드 리팩토링 (refactor)
    - 기능의 변화 없이 코드 구조를 개선하거나 리팩토링한 경우.
refactor(controller): Restructure user controller logic
  1. 성능 개선 (perf)
    - 캐싱 메커니즘을 최적화하여 API 응답 속도를 개선한 경우.
perf(cache): Optimize caching mechanism to reduce API latency

Conventional Commits 기본 형식

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

<body> (optional)

<footer> (optional)

type : 커밋의 목적을 설명하는 키워드. 예를 들어 기능 추가는 feat, 버그 수정은 fix를 사용.
scope : 변경된 파일 또는 기능의 범위. 선택 사항이지만 구체적인 범위를 명시하면 좋다.
subject : 변경 사항에 대한 간단한 설명. 첫 글자는 대문자로 작성하고 50자 이내로 작성하며 마침표를 붙이지 않습니다.
body : 커밋 제목에서 다 설명할 수 없는 세부적인 내용을 설명.
무엇을 했는지뿐만 아니라 왜 그 작업을 했는지 어떤 문제를 해결했는지 그리고 어떻게 수정했는지를 설명하는 데 유용하다

커밋의 변경 사항이 복잡하거나 팀원들이 변경 사항의 맥락을 이해해야 할 경우 사용한다.
footer : 추가적인 메타 정보를 제공하는 곳. 주로 이슈 번호나 브레이킹 체인지(호환성 깨짐)와 관련된 정보가 여기에 들어간다.
이슈 트래커와 연동할 때 자동으로 이슈를 닫거나, 중요한 변경 사항을 명시할 때 유용하다.
키워드 + 이슈 번호 또는 브레이킹 체인지에 대한 설명을 포함.
ex) Closes #123


- bodyfooter를 언제 사용하는가?

body: 커밋이 복잡한 변경 사항을 포함할 때.
팀원이나 향후 유지보수자들이 왜 이 변경이 필요했는지를 알아야 할 때.
커밋이 단순하지 않고 맥락을 설명해야 할 때.

footer: 특정 이슈 번호를 해결하는 커밋일 때.
커밋이 기존 기능에 호환성 문제를 일으킬 수 있을 때 (브레이킹 체인지).
이슈 트래커와 연동하여 자동으로 이슈를 닫거나 연결하고자 할 때.

# 전체커밋 메시지 예시

feat(auth): add JWT authentication for secure API access

Added JWT-based authentication to improve security for API requests.
This replaces the previous session-based authentication system, which
was prone to session hijacking. The new system generates a token on login
that must be included in all API requests.

Closes #42
BREAKING CHANGE: The session-based authentication endpoints have been removed.

1. 제목 (Subject)

feat(auth): Add JWT authentication for secure API access

feat : 커밋의 타입을 나타낸다.
여기서 feat는 새로운 기능 추가를 의미한다.

(auth) : 커밋의 범위(Scope)를 나타낸다.
이 부분은 어떤 기능이나 모듈에 영향을 주는지를 설명하는 선택적 요소이다.
이 경우 auth는 인증 관련 모듈이나 기능을 의미한다.

add JWT authentication for secure API access : 제목의 주된 내용이다.
JWT 기반 인증을 추가하여 API 접근의 보안을 강화한 것임을 나타낸다.
이 제목은 커밋의 목적을 50자 이내로 간결하게 설명하고 있고 대문자로 시작하고 마침표가 없도록 작성되어있다.

2. 본문 (Body):

Added JWT-based authentication to improve security for API requests.
This replaces the previous session-based authentication system, which
was prone to session hijacking. The new system generates a token on login
that must be included in all API requests.

body : 본문에서는 무엇이 변경되었는지와 왜 그 변경이 이루어졌는지를 설명한다.

첫 번째 문장은 JWT 기반 인증을 추가하여 API 요청의 보안을 향상시킨다는 것을 설명한다.

두 번째 문장은 기존의 세션 기반 인증 시스템을 대체했으며 그 이유는 기존 시스템이 세션 하이재킹(세션 탈취) 공격에 취약했기 때문이라는 설명이 이어진다.

마지막 문장은 새로운 시스템이 로그인 시 JWT 토큰을 생성하며 이 토큰이 모든 API 요청에 포함되어야 한다는 기술적인 세부 사항을 설명한다.

왜 이 작업을 했는지와 어떤 문제를 해결했는지를 명확하게 설명함으로써 다른 개발자들이 변경 사항을 쉽게 이해할 수 있다.

3. 푸터 (Footer)

Closes #42
BREAKING CHANGE: The session-based authentication endpoints have been removed.

Closes #42 : 이 부분은 이슈 트래커와 연동된 정보를 나타낸다.

이 커밋이 GitHub, Jira와 같은 이슈 관리 시스템에서 42번 이슈를 해결함을 의미하며 해당 커밋이 머지되면 이 이슈가 자동으로 닫히게 된다.

이는 이슈 트래커와 커밋 메시지를 연동해 효율적으로 관리하는 좋은 방식이다.

BREAKING CHANGE : 호환성을 깨는 중요한 변경 사항을 나타낸다.

여기서는 기존의 세션 기반 인증 엔드포인트가 제거되었음을 설명한다.

이 변경으로 인해 기존 API 사용자들은 더 이상 세션 기반 인증을 사용할 수 없으며 JWT 기반으로 전환해야 한다는 것을 의미한다.

이런 중요한 변경 사항은 시스템 사용자들이 미리 알 수 있도록 명시적으로 표시하는 것이 중요하다.

참고 : https://www.freecodecamp.org/korean/news/writing-good-commit-messages-a-practical-guide/

https://blog.munilive.com/posts/my-git-commit-guide.html#google_vignette

https://beomseok95.tistory.com/328

profile
웹 개발자

0개의 댓글