GitLab Flow 이해하기
개요
GitLab Flow는 Git Flow의 체계성과 GitHub Flow의 단순성을 결합한 Git 브랜치 전략입니다. main 브랜치를 중심으로 작업하면서도 환경별 브랜치를 통해 안전한 배포 프로세스를 제공합니다. Issue tracking 시스템과 긴밀하게 통합되어 있어 기능 개발부터 배포까지 전체 개발 라이프사이클을 효율적으로 관리할 수 있습니다.
배경
왜 GitLab Flow가 필요한가?
기존의 Git 워크플로우들은 각각 장단점이 있었습니다. Git Flow는 체계적이지만 너무 복잡했고, GitHub Flow는 단순하지만 다양한 배포 환경을 다루기 어려웠습니다. GitLab Flow는 이러한 문제점들을 해결하기 위해 탄생했습니다.
Git Flow의 문제점:
- develop, release, hotfix 등 너무 많은 브랜치로 인한 복잡성
- 브랜치 간 머지 작업이 빈번하게 발생하여 충돌 가능성 증가
- 릴리스, 태깅, 머징의 오버헤드가 큼
- Continuous Delivery와 잘 맞지 않음
GitHub Flow의 한계:
- main 브랜치가 항상 프로덕션과 동일하다고 가정
- 스테이징, 사전 프로덕션 등 다단계 환경 지원 부족
- 배포 시점을 제어할 수 없는 경우 (예: iOS 앱 스토어 검수) 대응 어려움
- 여러 버전을 동시에 관리하기 어려움
등장 이전의 방식
많은 팀이 Git으로 전환하면서 명확한 컨벤션 없이 작업했습니다. 그 결과 여러 개의 장기 실행 브랜치가 생겨나고, 어떤 브랜치가 최신 코드인지, 어떤 브랜치를 프로덕션에 배포해야 하는지 혼란스러웠습니다. 표준화된 패턴의 필요성이 대두되었고, GitLab Flow가 그 해답으로 제시되었습니다.
동작 원리
핵심 메커니즘
GitLab Flow는 다음과 같은 핵심 원칙으로 작동합니다:
- main 브랜치 중심: 모든 개발은 main 브랜치를 기준으로 진행
- 환경별 브랜치: 배포 환경에 따라 브랜치 생성 (staging, pre-production, production)
- Downstream 흐름: 코드는 항상 main → staging → production 방향으로만 이동
- Issue tracking 통합: 모든 코드 변경은 Issue와 연결
브랜치 구조
main (개발 통합 브랜치)
↓
staging (스테이징 환경)
↓
pre-production (사전 프로덕션 환경, 선택사항)
↓
production (프로덕션 환경)주요 브랜치 설명:
- main: 모든 기능이 최초로 병합되는 기본 브랜치. 항상 배포 가능한 상태를 유지해야 함
- staging: main에서 생성된 환경 브랜치. 내부 테스트 환경에 배포
- pre-production: 프로덕션과 거의 동일한 환경에서 최종 검증
- production: 실제 사용자에게 서비스되는 프로덕션 환경
워크플로우 단계
1. Issue 생성
↓
2. Feature 브랜치 생성 (main에서 분기)
↓
3. 코드 작성 및 커밋
↓
4. Merge Request 생성
↓
5. 코드 리뷰 및 CI 테스트
↓
6. main 브랜치에 병합
↓
7. main → staging 병합 (자동 배포)
↓
8. staging 환경 테스트
↓
9. staging → pre-production 병합 (선택)
↓
10. pre-production → production 병합
↓
11. 태그 생성 및 Feature 브랜치 삭제시각적 예시
Feature Branch Main Branch Staging Branch Production Branch
─────────────────────────────────────────────────────────────────────────────────
feature/user-login
│
├─ commit
│
├─ commit
│
└─ Merge Request
│
└────────> main
│
├─ CI 테스트 통과
│
└───────────> staging
│
├─ QA 테스트
│
└──────────────> production
│
└─ v1.2.0 태그코드로 이해하기
1. Feature 브랜치 생성 및 작업
# main에서 새 feature 브랜치 생성
git checkout main
git pull origin main
git checkout -b feature/user-authentication
# 작업 수행
git add .
git commit -m "feat: 사용자 인증 기능 추가"
# 원격 저장소에 푸시
git push origin feature/user-authentication2. Merge Request 생성 및 병합
# GitLab UI에서 Merge Request 생성
# 코드 리뷰 및 승인 후 main으로 병합
# main 브랜치 업데이트
git checkout main
git pull origin main3. 환경별 배포
# staging 환경으로 배포
git checkout staging
git merge main
git push origin staging
# 테스트 후 production으로 배포
git checkout production
git merge staging
git push origin production
# 릴리스 태그 생성
git tag -a v1.2.0 -m "Release version 1.2.0"
git push origin v1.2.0주요 특징
특징 1: Upstream-first Policy
GitLab Flow의 가장 중요한 원칙은 “Upstream-first”입니다. 모든 변경 사항은 반드시 main 브랜치에 먼저 병합된 후, downstream으로 흘러가야 합니다.
Hotfix 시나리오:
프로덕션에서 버그가 발견되었을 때:
# ❌ 잘못된 방법: production에서 직접 수정
git checkout production
git checkout -b hotfix/critical-bug
# ... 수정 작업
git checkout production
git merge hotfix/critical-bug
# ✅ 올바른 방법: main에서 수정 후 downstream
git checkout main
git checkout -b hotfix/critical-bug
# ... 수정 작업
# main에 먼저 병합
git checkout main
git merge hotfix/critical-bug
# staging에 병합
git checkout staging
git merge main
# production에 병합
git checkout production
git merge staging이유: Upstream-first를 따르지 않으면 다음 릴리스에서 동일한 버그가 다시 나타날 수 있습니다.
특징 2: 환경별 브랜치 전략
GitLab Flow는 두 가지 주요 환경 전략을 제공합니다:
2-1. 환경별 브랜치 (Environment Branches)
배포 환경마다 브랜치를 생성하는 방식입니다.
main → staging → pre-production → production사용 시기:
- SaaS 애플리케이션
- 웹 애플리케이션
- 지속적 배포(Continuous Deployment)가 필요한 경우
2-2. 릴리스 브랜치 (Release Branches)
특정 버전을 외부에 배포해야 하는 경우 사용합니다.
main
├─ release/v1.0
├─ release/v1.1
└─ release/v2.0사용 시기:
- 모바일 앱 (앱스토어 검수 필요)
- 오픈소스 라이브러리
- 여러 버전을 동시에 지원해야 하는 경우
특징 3: Issue Tracking 통합
모든 코드 변경은 Issue와 연결되어 추적 가능성을 보장합니다.
Issue 기반 개발 프로세스:
1. Issue 생성: "사용자 로그인 기능 추가 (#123)"
2. Feature 브랜치 생성: feature/123-user-login
3. 커밋 메시지에 Issue 번호 포함:
git commit -m "feat: 로그인 폼 UI 추가 (#123)"
4. Merge Request 생성 시 자동으로 Issue와 연결
5. main에 병합되면 Issue 자동 종료장점:
- 코드 변경 이유를 명확히 추적
- 팀 커뮤니케이션 향상
- 프로젝트 진행 상황 가시성 확보
특징 4: Merge Request 중심 워크플로우
GitLab Flow에서는 모든 코드 변경이 Merge Request(MR)를 통해 이루어집니다.
Merge Request 프로세스:
1. 개발자가 feature 브랜치에서 작업
↓
2. MR 생성 및 리뷰어 지정
↓
3. 자동 CI/CD 파이프라인 실행
├─ 빌드
├─ 단위 테스트
├─ 코드 품질 검사
└─ 보안 스캔
↓
4. 코드 리뷰
├─ 피드백 반영
└─ 승인
↓
5. main에 병합 (Squash & Merge 권장)
↓
6. Feature 브랜치 자동 삭제실제 사용 사례
사례 1: SaaS 웹 애플리케이션 배포
시나리오: 3단계 환경을 사용하는 전자상거래 플랫폼
환경 구성:
- main: 개발 완료된 코드
- staging: 내부 QA 테스트 환경
- production: 실제 고객 서비스 환경
워크플로우:
# 1. 결제 기능 개발
git checkout -b feature/payment-integration
# ... 개발 작업
git push origin feature/payment-integration
# 2. Merge Request 생성 및 main 병합
# GitLab UI에서 MR 생성 → 코드 리뷰 → 승인 → 병합
# 3. staging 배포
git checkout staging
git merge main
git push origin staging
# 자동 배포 파이프라인 실행 → https://staging.example.com
# 4. QA 테스트 수행 및 승인
# 5. production 배포
git checkout production
git merge staging
git push origin production
# 자동 배포 파이프라인 실행 → https://example.com
# 6. 릴리스 태그 생성
git tag -a v2.3.0 -m "결제 기능 추가"
git push origin v2.3.0사례 2: 모바일 앱 릴리스 관리
시나리오: iOS/Android 앱 배포 (앱스토어 검수 필요)
브랜치 구성:
- main: 개발 브랜치
- release/1.0: 1.0 버전 릴리스
- release/2.0: 2.0 버전 릴리스
워크플로우:
# 1. 새 기능 개발
git checkout main
git checkout -b feature/dark-mode
# ... 개발 및 main 병합
# 2. 릴리스 준비
git checkout -b release/2.0 main
git push origin release/2.0
# 3. 앱스토어 제출
# release/2.0 브랜치로 빌드 생성 및 제출
# 4. 검수 중 버그 발견
git checkout main
git checkout -b hotfix/crash-fix
# ... 버그 수정
# main에 먼저 병합
git checkout main
git merge hotfix/crash-fix
# release 브랜치에 cherry-pick
git checkout release/2.0
git cherry-pick <commit-hash>
git push origin release/2.0
# 5. 릴리스 태그 생성
git tag -a v2.0.1 -m "크래시 버그 수정"
git push origin v2.0.1사례 3: 다단계 검증이 필요한 금융 시스템
시나리오: 엄격한 규제가 있는 뱅킹 시스템
환경 구성:
- main: 개발 통합
- test: 자동화 테스트 환경
- uat: 사용자 인수 테스트 환경
- pre-production: 프로덕션 동일 환경
- production: 실 서비스 환경
워크플로우:
# 1. 송금 기능 개발
git checkout -b feature/wire-transfer
# ... 개발 및 main 병합
# 2. test 환경 배포 및 자동화 테스트
git checkout test
git merge main
git push origin test
# 자동화된 통합 테스트, E2E 테스트 실행
# 3. uat 환경 배포 및 비즈니스 사용자 테스트
git checkout uat
git merge test
git push origin uat
# 실제 비즈니스 시나리오 검증
# 4. pre-production 최종 검증
git checkout pre-production
git merge uat
git push origin pre-production
# 성능 테스트, 보안 검증
# 5. production 배포 (변경 관리 승인 후)
git checkout production
git merge pre-production
git push origin production
# 6. 릴리스 문서화
git tag -a v1.5.0 -m "송금 기능 추가 - 변경관리 #CHG-2024-001"
git push origin v1.5.0장점과 한계
장점
- ✅ 단순성: Git Flow보다 브랜치 구조가 단순하고 이해하기 쉬움
- ✅ 유연성: 환경의 수와 종류를 프로젝트에 맞게 조정 가능
- ✅ CI/CD 친화적: Continuous Delivery와 자연스럽게 통합됨
- ✅ 추적 가능성: Issue tracking과 통합되어 모든 변경사항 추적 가능
- ✅ 테스트 일관성: Downstream 흐름으로 모든 환경에서 코드가 테스트됨
- ✅ 릴리스 오버헤드 감소: Git Flow에 비해 릴리스 관련 작업이 간소화됨
- ✅ 확장성: 소규모 팀부터 대규모 조직까지 적용 가능
- ✅ 명확한 책임: 각 브랜치의 목적과 역할이 명확함
한계
- ⚠️ 학습 곡선: Git Flow나 GitHub Flow에 익숙한 팀은 새로운 방식 학습 필요
- ⚠️ 규칙 준수 필요: Upstream-first 원칙을 팀 전체가 철저히 지켜야 함
- ⚠️ 환경 브랜치 관리: 여러 환경 브랜치 관리에 따른 추가 작업 발생
- ⚠️ GitHub Flow보다 복잡: 단순성을 원하는 소규모 프로젝트에는 과할 수 있음
- ⚠️ 수동 병합 작업: 환경 간 수동 병합이 필요해 실수 가능성 존재
트레이드오프
GitLab Flow를 사용하면 좋은 경우:
- 여러 배포 환경이 필요한 프로젝트
- 배포 시점을 제어해야 하는 경우
- 코드 변경의 추적성이 중요한 경우
- CI/CD를 적극 활용하는 팀
- 체계적인 릴리스 관리가 필요한 경우
다른 전략을 고려해야 하는 경우:
- 매우 단순한 프로젝트 (GitHub Flow 고려)
- 극도로 빠른 배포가 필요한 경우 (Trunk-based Development 고려)
- 복잡한 릴리스 관리가 필수인 라이브러리 (Git Flow 고려)
- 팀이 Git 워크플로우에 익숙하지 않은 경우
다른 워크플로우와의 비교
GitLab Flow vs Git Flow
| 특성 | Git Flow | GitLab Flow |
|---|---|---|
| 브랜치 수 | 많음 (main, develop, feature, release, hotfix) | 적음 (main, feature, 환경별) |
| 복잡도 | 높음 | 중간 |
| 기본 브랜치 | develop | main |
| 릴리스 방식 | release 브랜치 생성 → 테스트 → main 병합 | main → 환경 브랜치 순차 병합 |
| Hotfix 처리 | hotfix 브랜치 생성 → main/develop 동시 병합 | main에 먼저 병합 → downstream |
| CI/CD 통합 | 어려움 | 쉬움 |
| 적합한 프로젝트 | 정기 릴리스가 있는 복잡한 프로젝트 | 지속적 배포가 필요한 프로젝트 |
| 배포 주기 | 주간/월간 | 일간/수시 |
주요 차이점:
Git Flow:
feature → develop → release → main (production)
↑
hotfix
GitLab Flow:
feature → main → staging → production
↑
모든 수정사항GitLab Flow vs GitHub Flow
| 특성 | GitHub Flow | GitLab Flow |
|---|---|---|
| 브랜치 수 | 최소 (main, feature) | 적음-중간 (main, feature, 환경별) |
| 복잡도 | 매우 낮음 | 중간 |
| 배포 시점 | main 병합 시 즉시 배포 | 환경 브랜치로 제어 가능 |
| 환경 관리 | 없음 (main = production) | 환경별 브랜치 지원 |
| 배포 제어 | 불가능 | 가능 |
| Issue tracking | 선택사항 | 필수 권장 |
| 적합한 프로젝트 | 지속적 배포가 자유로운 프로젝트 | 다단계 검증이 필요한 프로젝트 |
| 유연성 | 낮음 | 높음 |
주요 차이점:
GitHub Flow:
feature → main (= production)
↓
즉시 프로덕션 배포
GitLab Flow:
feature → main → staging → production
↓ ↓ ↓
개발 완료 테스트 실제 배포세 가지 워크플로우 비교 요약
복잡도 스펙트럼:
GitHub Flow (가장 단순) ← GitLab Flow (중간) ← Git Flow (가장 복잡)
유연성 스펙트럼:
Git Flow (낮음) ← GitHub Flow (중간) ← GitLab Flow (높음)
적합한 팀 크기:
GitHub Flow: 소규모 (1-5명)
GitLab Flow: 중소규모 (3-50명)
Git Flow: 대규모 (10명 이상)
릴리스 주기:
GitHub Flow: 수시 배포
GitLab Flow: 일간-주간
Git Flow: 주간-월간GitLab Flow 도입 가이드
1단계: 팀 준비
□ 팀 전체에 GitLab Flow 개념 교육
□ 기존 워크플로우와의 차이점 이해
□ Upstream-first 원칙 공유
□ 브랜치 네이밍 컨벤션 결정2단계: 환경 설계
# 프로젝트에 필요한 환경 결정
- main: 개발 통합 (필수)
- staging: 내부 테스트 (권장)
- production: 실 서비스 (필수)
- pre-production: 최종 검증 (선택)
# 브랜치 생성
git checkout main
git checkout -b staging
git push origin staging
git checkout -b production
git push origin production3단계: CI/CD 파이프라인 설정
.gitlab-ci.yml 예시:
stages:
- test
- deploy-staging
- deploy-production
# 테스트 (모든 MR에서 실행)
test:
stage: test
script:
- npm install
- npm run test
- npm run lint
only:
- merge_requests
# Staging 배포 (staging 브랜치 푸시 시)
deploy-staging:
stage: deploy-staging
script:
- echo "Deploying to staging..."
- npm run build
- npm run deploy:staging
only:
- staging
environment:
name: staging
url: https://staging.example.com
# Production 배포 (production 브랜치 푸시 시)
deploy-production:
stage: deploy-production
script:
- echo "Deploying to production..."
- npm run build
- npm run deploy:production
only:
- production
environment:
name: production
url: https://example.com
when: manual # 수동 승인 필요4단계: 브랜치 보호 규칙 설정
GitLab 설정에서 다음 브랜치 보호:
main 브랜치:
□ 직접 푸시 금지
□ Merge Request 필수
□ 최소 1명의 승인 필요
□ CI 테스트 통과 필수
□ Fast-forward 병합 금지
staging/production 브랜치:
□ 직접 푸시 금지
□ Maintainer만 병합 가능
□ CI 파이프라인 성공 필수5단계: 팀 프로세스 문서화
CONTRIBUTING.md 예시:
# 개발 프로세스
## 1. Issue 생성
모든 작업은 Issue 생성으로 시작합니다.
## 2. Feature 브랜치 생성
```bash
git checkout main
git pull origin main
git checkout -b feature/123-user-login3. 개발 및 커밋
git add .
git commit -m "feat: 로그인 폼 추가 (#123)"4. Merge Request 생성
- 제목: 명확한 변경 내용
- 설명: 변경 이유, 테스트 방법
- 리뷰어 지정
- Issue 연결
5. 코드 리뷰 및 병합
- 리뷰어 승인 후 병합
- Squash and merge 사용
6. 환경별 배포
main → staging → production 순서로 배포
---
## 모범 사례
### 1. 브랜치 네이밍 컨벤션
```bash
# 기능 개발
feature/123-user-authentication
feature/456-payment-integration
# 버그 수정
fix/789-login-error
fix/101-cart-calculation
# Hotfix
hotfix/critical-security-patch
hotfix/payment-failure
# 문서화
docs/api-documentation
docs/readme-update
# 리팩토링
refactor/user-service
refactor/database-queries2. 커밋 메시지 작성
# Conventional Commits 스타일 사용
feat: 새로운 기능 추가
fix: 버그 수정
docs: 문서 수정
style: 코드 포맷팅
refactor: 코드 리팩토링
test: 테스트 코드 추가/수정
chore: 빌드 프로세스 수정
# 예시
git commit -m "feat: 사용자 인증 API 추가 (#123)"
git commit -m "fix: 결제 실패 시 에러 처리 개선 (#456)"
git commit -m "docs: API 문서 업데이트"3. Merge Request 템플릿
## 변경 사항
<!-- 무엇을 변경했는지 -->
## 변경 이유
<!-- 왜 이 변경이 필요한지 -->
## 테스트 방법
<!-- 어떻게 테스트했는지 -->
## 스크린샷 (선택사항)
<!-- UI 변경이 있는 경우 -->
## 체크리스트
- [ ] 테스트 코드 작성
- [ ] 문서 업데이트
- [ ] 코드 리뷰 요청
- [ ] CI 테스트 통과
## 관련 Issue
Closes #1234. 릴리스 관리
# Semantic Versioning 사용
MAJOR.MINOR.PATCH
# 예시:
v1.0.0 - 초기 릴리스
v1.1.0 - 새 기능 추가 (하위 호환)
v1.1.1 - 버그 수정
v2.0.0 - Breaking change
# 태그 생성
git tag -a v1.2.0 -m "Release version 1.2.0
Features:
- 사용자 인증 개선
- 결제 모듈 추가
Fixes:
- 로그인 에러 수정
- 성능 최적화"
git push origin v1.2.0문제 해결
Q1: Downstream 브랜치에서 버그 발견 시
# ❌ 잘못된 방법: downstream에서 직접 수정
git checkout staging
git checkout -b fix/bug
# 수정 후 staging에 병합
# ✅ 올바른 방법: main에서 수정 후 downstream
git checkout main
git checkout -b fix/bug
# 수정 및 테스트
# main에 먼저 병합
git checkout main
git merge fix/bug
# 순차적으로 downstream 병합
git checkout staging
git merge main
git checkout production
git merge stagingQ2: 환경 브랜치 간 충돌 발생 시
# staging에 병합 시 충돌 발생
git checkout staging
git merge main
# CONFLICT 발생
# 충돌 해결
git status # 충돌 파일 확인
# 파일 편집하여 충돌 해결
git add <resolved-files>
git commit -m "Merge main into staging - resolve conflicts"
git push origin stagingQ3: Hotfix 긴급 배포
# 1. main에서 hotfix 브랜치 생성
git checkout main
git checkout -b hotfix/critical-fix
# 2. 버그 수정 및 테스트
# ... 수정 작업
git add .
git commit -m "hotfix: 크리티컬 버그 수정"
# 3. main에 병합 (fast-track)
git checkout main
git merge hotfix/critical-fix
git push origin main
# 4. staging 생략하고 production으로 직접 병합 (긴급 시)
git checkout production
git merge main
git push origin production
# 5. 태그 생성
git tag -a v1.2.1 -m "Hotfix: 크리티컬 버그 수정"
git push origin v1.2.1
# 6. staging 동기화 (나중에)
git checkout staging
git merge main
git push origin staging더 알아보기
심화 학습
실습
관련 주제
- CI/CD: GitLab Flow와 함께 사용하는 자동화 파이프라인
- Feature Flags: 환경별 기능 배포를 더 세밀하게 제어
- Semantic Versioning: 체계적인 버전 관리 전략
- Trunk-based Development: 더 단순한 브랜치 전략
도구 및 리소스
- GitLab CI/CD: 통합 CI/CD 플랫폼
- Git Extensions: Git 워크플로우를 쉽게 만드는 도구
- GitKraken: 시각적 Git 클라이언트
- Conventional Commits: 커밋 메시지 표준화
요약
GitLab Flow는 단순성과 유연성의 균형을 제공하는 현대적인 Git 브랜치 전략입니다.
핵심 원칙:
- main 브랜치 중심 개발
- 환경별 브랜치로 배포 제어
- Upstream-first로 코드 무결성 보장
- Issue tracking과 긴밀한 통합
- CI/CD 파이프라인과 자연스러운 결합
적합한 경우:
- 다단계 배포 환경이 필요한 프로젝트
- CI/CD를 적극 활용하는 팀
- 코드 추적성과 안정성이 중요한 서비스
GitLab Flow를 통해 팀은 체계적이면서도 효율적인 개발 프로세스를 구축할 수 있습니다. 복잡한 Git Flow의 오버헤드 없이, GitHub Flow보다 더 나은 배포 제어를 제공합니다.
문서 버전: 1.0 최종 수정: 2025-12-22 작성자: Claude with technical-writing skill 라이선스: CC BY 4.0