Git 워크플로우
제가 주로 사용하는 Git 브랜치 전략과 커밋 규칙입니다.
커밋 메시지 규칙 (Conventional Commits)
기본 형식
<type>(<scope>): <subject>
<body>
<footer>필수 요소:
type: 변경 유형 (필수)scope: 변경 범위 (선택)subject: 변경 요약 (필수, 50자 이내)
Type 종류
| Type | 설명 | 예시 |
|---|---|---|
feat | 새로운 기능 | feat(auth): add JWT authentication |
fix | 버그 수정 | fix(user): resolve null pointer exception |
docs | 문서 수정 | docs(readme): update installation guide |
style | 코드 포맷팅 (기능 변경 없음) | style(user): apply ktlint formatting |
refactor | 코드 리팩토링 | refactor(order): extract payment logic |
test | 테스트 코드 추가/수정 | test(user): add UserService unit tests |
chore | 빌드, 설정 파일 수정 | chore(deps): upgrade spring boot to 3.2 |
perf | 성능 개선 | perf(query): optimize database query |
Scope 작성 가이드
Scope는 변경된 모듈/기능을 명시합니다:
| |
Subject 작성 규칙
- 명령형 현재 시제: “add” (O), “added” (X), “adds” (X)
- 소문자 시작: “Add feature” (X), “add feature” (O)
- 마침표 없음: “Add feature.” (X), “Add feature” (O)
- 50자 이내: 간결하게 작성
| |
Body 작성 (선택)
복잡한 변경사항은 Body에 설명합니다:
feat(user): add user profile update API
- Add PUT /api/v1/users/{id} endpoint
- Implement validation for profile data
- Add unit tests for UserService.updateProfile()
Changes were made to support user profile editing feature
requested in issue #123.Footer 작성 (선택)
이슈 번호, Breaking Changes를 명시합니다:
feat(auth): migrate to OAuth2
BREAKING CHANGE: JWT authentication is replaced with OAuth2.
All existing tokens will be invalid.
Closes #456
Fixes #789커밋 단위 규칙
원칙: 원자적 커밋 (Atomic Commits)
하나의 커밋 = 하나의 논리적 변경
| |
커밋 크기 가이드
| 커밋 크기 | 설명 | 예시 |
|---|---|---|
| 너무 작음 | 의미 없는 단위로 분리 | git commit -m "add import" |
| 적당함 | 하나의 논리적 변경 | git commit -m "feat(user): add User entity" |
| 너무 큼 | 여러 기능을 한 번에 | git commit -m "feat: add user and order features" |
WIP (Work In Progress) 커밋
작업 중간 커밋은 나중에 Squash 합니다:
| |
브랜치 전략
브랜치 종류
main # 프로덕션 배포 브랜치
├── develop # 개발 통합 브랜치
├── feature/* # 기능 개발 브랜치
├── bugfix/* # 버그 수정 브랜치
├── hotfix/* # 긴급 수정 브랜치
└── release/* # 릴리즈 준비 브랜치브랜치 네이밍
| |
작업 프로세스
1. Feature 개발
| |
2. Pull Request 생성
PR 템플릿:
| |
3. 코드 리뷰
리뷰어가 확인할 사항:
- 커밋 메시지가 Conventional Commits 형식을 따르는가?
- 원자적 커밋인가? (하나의 커밋 = 하나의 논리적 변경)
- 코딩 컨벤션을 준수했는가?
- 테스트 코드가 작성되었는가?
- Breaking Change가 있다면 명시되었는가?
4. Merge 전략
| |
Git Hooks (자동 검증)
pre-commit (커밋 전 검증)
| |
commit-msg (커밋 메시지 검증)
| |
충돌 해결
| |
보안 (Security)
1. .gitignore 설정
민감정보 커밋 방지를 위한 필수 .gitignore 설정:
| |
2. Credential 관리
| |
3. 이미 커밋된 민감정보 제거
| |
4. Pre-commit Hook으로 민감정보 검증
| |
5. GitHub Secret Scanning 활성화
GitHub에서 자동으로 민감정보를 탐지합니다:
- Settings → Security → Code security and analysis
- Secret scanning 활성화
- Push protection 활성화 (권장)
협업 (Collaboration)
1. Code Review 가이드
리뷰어 역할:
| |
리뷰 받는 사람:
| |
2. Conventional Commits 자동 검증
commitlint 설정:
| |
3. PR 템플릿 개선
.github/pull_request_template.md:
| |
4. Protected Branch 설정
GitHub에서 main/develop 브랜치 보호:
| |
금지 사항
절대 금지
- ❌ main 브랜치에 직접 push: PR을 통해서만 병합
- ❌ force push to shared branches: develop, main 등
- ❌ 의미 없는 커밋 메시지: “수정”, “테스트”, “ㅁㄴㅇㄹ”
- ❌ 대용량 바이너리 파일 커밋: Git LFS 사용
- ❌ 민감한 정보 커밋: 비밀번호, API 키, 토큰
- ❌ 리뷰 없이 병합: 최소 1명 이상의 승인 필수
- ❌ 테스트 실패 시 병합: CI/CD 통과 후에만 병합
주의 사항
- ⚠️ WIP 커밋: PR 전에 반드시 Squash
- ⚠️ Merge 커밋: Squash and Merge 또는 Rebase and Merge 사용
- ⚠️ 커밋 메시지 수정: 이미 푸시한 커밋은 수정하지 않기
- ⚠️ 대용량 PR: 500줄 이상은 리뷰가 어려우므로 분할 고려
체크리스트
커밋 전 확인:
- 커밋 메시지가 Conventional Commits 형식인가?
- 하나의 커밋이 하나의 논리적 변경인가?
- Subject가 50자 이내인가?
- 명령형 현재 시제를 사용했는가?
- 테스트가 통과하는가?
- 민감한 정보가 포함되지 않았는가?
- .gitignore가 적절히 설정되어 있는가?
PR 전 확인:
- 모든 커밋이 Conventional Commits 형식인가?
- WIP 커밋을 Squash 했는가?
- 테스트가 모두 통과하는가?
- 코드 리뷰 준비가 완료되었는가?
- PR 설명이 명확한가? (무엇을, 왜, 어떻게)
- Self-review를 완료했는가?
- 관련 문서를 업데이트했는가?
Code Review 시 확인:
- 기능이 요구사항을 충족하는가?
- 코딩 컨벤션을 준수하는가?
- 보안 취약점이 없는가?
- 테스트 커버리지가 충분한가?
- 성능 저하가 없는가?