개발 노트/개발 삽질

Commit Message 자동화하기, 근데 AI를 곁들인

j4ko 2025. 4. 24. 17:34
728x90
반응형

 

개요 

최근 회사의 Git Commit Message를 살펴보다 문득 “Commit Type에 대한 특성을 잘 드러내는 Emoji네!”라는 생각이 들었다. 명시적인 것을 좋아하는 나로서는 흥미로웠던 부분인데 그럼에도 불구하고 작업을 마치고 커밋 메시지 작성 시 해당 특성의 Emoji를 매번 수동으로 입력해야 하는 귀찮음이 생겼다.

 

“회사에서 정립한 특정 Commit Message의 성격에 해당하는 Emoji를 수기로 작성”해야 하는 불편함을 해소하기 위해 이것저것 알아보던 중 “AI와 Git Commit Message Template”를 활용해서 해결할 수 있었다. 하지만 Git Commit Message Template를 작성하면서 추가적인 부분을 또 고민하게 됐는데 Commit Message 특성에 맞는 Emoji는 AI가 자동으로 선별한다 쳐도 AI에게" 좋은 Commit Message를 어떻게 작성하게 만들 수 있을까”인 부분이었다.

 

즉, 이 글에서는 이러한 과정에서 했던 고민과 해법을 기록해 놓으려고 한다.


좋은 Git Commit Message란 무엇인가?

좋은 Commit Message란 무엇일까를 고민하고 또 검색의 시간을 거친 뒤 이 블로그에서 나와 생각이 어느 정도 일치하는 글을 발견할 수 있었고 해당 내용을 인용해 보고자 한다.

 

해당 블로그에서는 좋은 Commit Message란, 다음 3가지에 대한 답변을 할 수 있어야 한다고 말한다.

A good commit message should answer three questions about a patch:

  • Why is it necessary? It may fix a bug, it may add a feature, it may improve performance, reliabilty, stability, or just be a change for the sake of correctness.
    • 왜 필요한가? 버그를 수정하거나, 기능을 추가하거나, 성능, 신뢰성, 안정성을 개선하거나, 정확성을 위한 변경일 수 있습니다.
  • How does it address the issue? For short obvious patches this part can be omitted, but it should be a high level description of what the approach was.
    • 문제를 어떻게 해결하나요? 짧고 명백한 패치의 경우 이 부분은 생략할 수 있지만, 접근 방식이 무엇인지에 대한 개략적인 설명이 있어야 합니다.
  • What effects does the patch have? (In addition to the obvious ones, this may include benchmarks, side effects, etc.)
    • 패치에는 어떤 효과가 있나요? (명백한 것 외에도 벤치마크, 부작용 등이 포함될 수 있습니다.)

 

즉, 좋은 Commit Message 란 변경사항이 왜 필요하며, 무슨 문제를 해결하고, 부수작용이 뭔지를 드러내는 것이라고 할 수 있다.


 

그래서 그 “좋은 Commit Message” 어떻게 작성하나?

하지만 여기까지 해서 그 “좋은 Commit Message”를 어떻게 작성해야 되는지 감이 오진 않는다.

 

앞서 언급된 사항들은 “질문”들이기에 Commit Message를 작성해야 하는 사람 입장에서는 구체적인 지침이 없기 때문이다. 따라서 “좋은 Commit Message”를 작성하기 위해 필요한 구체적인 사항들을 추가적으로 조사할 필요가 있었다.

“좋은 Commit Message”에 대한 구체적 사항들은 nhncloud에서 작성된 글에서 참고할 수 있다. 이 내용에 따르면 “좋은 Commit Message를 작성하기 위한 보편적인 기준”에 대해서 이야기하고 있다.

좋은 커밋 메시지를 작성하기 위한 7가지 규칙

  1. 제목과 본문을 한 줄 띄워 분리하기
  2. 제목은 영문 기준 50자 이내로
  3. 제목 첫 글자를 대문자로
  4. 제목 끝에. 금지
  5. 제목은 명령조로
  6. 본문은 영문 기준 72자마다 줄 바꾸기
  7. 본문은 어떻게보다 무엇을, 왜에 맞춰 작성하기


여기에 더해 Commit Message가 어떤 작업의 성격인지 제목에 드러내기 위한 Type도 존재해야 한다. 예를 들어 다음과 같다.

Conventional Commit의 Commit Type

  • feat: 새로운 기능 추가
  • fix: 버그 수정
  • docs: 문서 변경 (코드 변경 없음)
  • style: 코드 포맷팅, 세미콜론 누락 등
  • refactor: 코드 리팩토링 (기능 변경 없음)
  • test: 테스트 코드 추가 및 수정
  • chore: 빌드/도구 설정 변경 등 기타 작업

 

각각의 내용이 궁금하다면 해당 사이트에서 더 자세한 내용을 읽어보도록 하자.

 


좋긴 한데, 이걸 매번 어떻게 신경 쓰나?

이러나저러나 현실적인 문제가 있다.

 

매 작업마다 이런 부분을 신경 써서 Commit Message를 작성하기 어렵다는 점이다. 좋은 환경이라면 Commit Message를 작성에 힘도 쓰고 리뷰도 하겠지만 갑작스럽게 요구사항이 생기고 급하게 결과물을 내야 하는 곳이라면 이를 챙기기 어려운 일이다.

 

그렇다면 개발 도구의 힘을 빌려 “좋은 Commit Message”를 만들게끔 해볼 순 없을까?

 

Git Commit Message Template를 활용하여 Commit Message 가이드라인을 작성하고 AI가 이를 읽어 들어 “좋은 Commit Message”를 생산해내도록 한다면 어느 정도 좋은 Commit Message를 뽑아낼 수 있지 않을까 싶다.

 


AI를 통해 Commit Message 자동 생성하기

필자는 Jetbrains 계열의 Python IDE인 PyCharm에서 AI + Commit Message를 생성하도록 만들어봤다. Commit Message를 자동으로 생성하기 위해서는 다음과 같은 Plugin이 필요하다.

  • Commit Message Template Plugin 설치
  • AI Commit Plugin 설치

 

1. Commit Message Template Plugin

PyCharm에서는 Commit Message Template을 지정할 수 있는 Plugin이 존재한다. 필자가 쓰는 Plugin은 아래와 같다.

 

https://plugins.jetbrains.com/plugin/9364-commit-message-template

이 Plugin을 설치하면 Commit Message 작성 시점에 해당 아이콘을 클릭하면 따라야 하는 Commit Message Template이 무엇인지 확인할 수 있다.

해당 아이콘은 미리 설정된 Commit Message Template 참조하는데 이 설정은 “ Settings > Tools > Commit Messate Template” 에서 설정할 수 있다.



2. AI Commit Plugin

최근 AI의 부상으로 인해 여러 AI와 연계된 여러 Plugin들이 나오고 있는데 그중 AI Commit이라는 Plugin은 코드의 변경 내역을 보고 AI가 Commit Messgae을 자동으로 작성해 주는 편리한 Plugin이다.

 

이 Plugin을 설치하면 Commit Message 작성 시점에 해당 아이콘을 확인할 수 있으며, 클릭하게 되면 코드 변경내역을 AI가 확인하고 Commit Message를 자동으로 작성한다.

Google의 Gemini는 월 사용량 제한이 있긴 하지만 무료이다. 그리고 제한량이 있다는 게 체감이 되지 않을 정도로 높다.

 

 

 

3. Commit Message Template

이제 Plugin을 설정했으니 제일 중요한 Commit Messate Template의 내용을 구성할 차례다. 필자의 경우 이러한 부분은 ChatGpt로 좋은 Commit Message에 대해 다루는 링크를 첨부한 뒤 yaml 파일로 작성해 달라고 요청했다.

# commit-message-template.yaml

# 커밋 메시지 형식을 정의합니다.
template: |
  <type>[optional scope]: <description>

  [optional body]

  [optional footer(s)]

rules:
  - 제목과 본문을 한 줄 띄워 분리하기
  - 제목은 영문 기준 50자 이내로
  - 제목 첫글자를 대문자로
  - 제목 끝에 `.`금지
  - 제목은 `명령조`로
  - 본문은 영문 기준 72자마다 줄 바꾸기
  - 본문은`어떻게`보다 무엇을`,`왜`에 맞춰 작성하기

# type 목록입니다. 작업의 목적에 따라 적절한 type을 선택하세요.
types:
  - feat        # 새로운 기능 추가
  - fix         # 버그 수정
  - docs        # 문서 수정
  - style       # 코드 포맷팅, 세미콜론 누락 등 기능에 영향을 주지 않는 수정
  - refactor    # 코드 리팩토링 (기능 변경 없음)
  - perf        # 성능 개선
  - test        # 테스트 코드 추가/수정
  - build       # 빌드 관련 파일 수정 (예: gradle, npm)
  - ci          # CI 설정 수정
  - chore       # 기타 변경사항 (예: 프로젝트 구성, 패키지 매니저 등)
  - revert      # 이전 커밋 되돌리기

# scope는 선택 항목이며, 수정한 파일이나 모듈 등을 명시합니다.
# 예: user, auth, api, header 등

# description은 한 줄로 요약된 변경 내용을 작성합니다.
description_guideline: >
  - 현재 시제로 작성합니다. 예: "Add login feature" (o), "Added login feature" (x)
  - 50자 이내로 작성합니다.
  - 문장의 끝에 마침표를 붙이지 않습니다.

# optional body는 변경사항에 대한 상세 설명입니다.
body_guideline: >
  - 무엇을, 왜 변경했는지 설명합니다.
  - 어떻게 변경했는지는 코드에서 확인할 수 있으므로 꼭 필요한 경우만 작성합니다.

# optional footer는 다음과 같은 내용을 포함할 수 있습니다.
footers:
  - BREAKING CHANGE: 주요 변경 사항 설명
  - Closes: 관련 이슈 번호 예) Closes #123

examples:
  - "feat(auth): add JWT token authentication"
  - "fix(login): prevent null pointer exception on login failure"
  - |
    docs(readme): update installation instructions

    Added steps to install dependencies on Windows.

    Closes: #42

 

그래서 결과는?

이제 Commit Message는 AI가 대신 작성해 준다. 하기 내용은 이러한 설정을 통해 작성된 Commit Message다.

fix(settings): 데이터베이스 설정 수정 (master)

기존의 환경변수를 통해 데이터베이스 설정을 가져오는 로직을
주석 처리하고,  하드코딩된 데이터베이스 설정을 사용하도록
변경했습니다.  배포 환경에서 발생하는 데이터베이스 연결
오류를 해결하기 위한 수정입니다.

마치며

사내 Commit Message Emoji를 자동 선별하기 위해 이것저것 알아보다 많은 내용을 다루게 됐다. “좋은 Commit Message”가 무엇인지 잊고 살았는데 상기할 수 있는 기회도 있었고 AI의 힘을 빌려 이를 자동화까지 할 수 있었다.

 

물론 개선의 여지는 존재한다. “좋은 Commit Message”를 작성하기 위한 자료의 기준이 “영어”에 맞춰져 있다. 그러다 보니 AI가 만들어내는 한글 Commit Message를 읽다보면 뭔가 어색한 느낌이 든다.(줄 바꿈이 이상한 곳에서 되어있다던가 , 일관된 톤이 아니라던가 하는 부분)

 

이러한 부분은 작성된 commit message template을 하나의 Prompt라 생각하고 수정을 거치면서 해결해 나가야 하는 부분이라 본다.


 

 

 

 

 

 

 

 

728x90
반응형