이 글은 Unleash 공식 문서
What is a feature flag를 읽고,
내용을 정리하고 개인적인 이해를 바탕으로 재구성한 글입니다.

- 세로축: TTL (존속 기간)
- 가로축: 변경 빈도(ON/OFF, 비율 변경, 타겟 변경 등)
Release flag(릴리즈 플래그)
새롭거나 아직 완성되지 않은 기능의 배포를 관리하기 위한 플래그입니다.
- 코드 자체는 이미 main 브랜치에서 합쳐졌지만 사용자에게는 아직 안 보이게 제어하여 배포와 공개를 분리
- 언제 사용: 신구 기능 개발, 대규모 리팩토링, 실패 리스크가 있는 기능, 점진적 공개가 필요한 경우
- 특징: 수명은 짧아야 함. 기능이 안정되면 플래그 제거 및 코드 단순화. 오래 남아있으면 기술 부채가 됨
예시
if (isEnabled("release-new-checkout")) {
useNewCheckout();
} else {
useLegacyCheckout();
}
- 개발 완료
- 내부 QA → 10% 사용자 → 100%
- 안정화 후 플래그 삭제
Experiment flag (실험/ A/B 테스트)
서로 다른 사용자 경험을 비교하여 어떤 것이 더 좋은지 실험하기 위한 플래그입니다.
- 사용자를 여러 그룹으로 나눠 행동 데이터 기반 의사결정
- 언제 사용: UI/UX 변경 결정 및 사용성 개선
- 특징: 실험 기간만 존재. 데이터 충분히 수집되면 종료. 오래 끌면 데이터가 오염될 수 있음.
예시
- 메인페이지 CTA(Call To Action) 버튼
const variant = getVariant("experiment-main-cta");
return variant === "B" ? <NewCTA /> : <OldCTA />;
- 2주 실험을 통해 전환율 비교하여 플래그 제거
Kill switches (킬 스위치)
심각한 장애나 보안 이슈 발생 시 기능을 즉시 차단하기 위한 스위치입니다.
- 성능 장애, 외부 API 장애, 보안 취약점 발견, 빠른 대응이 최우선인 경우
- 언제 사용: 외부 연동(API, 결제, 메시지), 고위험 기능, 장애 시 전체 서비스 보호가 필요한 경우
- 특징: 장기 또는 영구적으로 항상 존재해야 함. 주기적으로 잘 꺼지는지 테스트 필요
예시
if (!isEnabled("kill-external-payment")) {
throw new ServiceUnavailableException();
}
- PG사 장애 발생 시 운영자가 즉시 OFF하여 주문 흐름 보호
Operation flag (운영 플래그)
사용자에게 보이지 않는 기술적 변경을 안전하게 전환하기 위한 플래그입니다.
- 라이브러리 교체, 알고리즘 변경, 내부 로직 개선 등 기술 구현을 바꿀 때
- 언제 사용: 라이브러리 업그레이드, 캐시 전략 변경, 알고리즘 개선, 성능 최적화 실험
- 특징: 짧게 사용하여 검증이 끝나면 제거하기
예시
if (isEnabled("ops-new-search-engine")) {
return newSearch();
}
return legacySearch();
Permission flag(권한 플래그)
사용자 역할이나 권한에 따라 기능 접근을 제어하는 플래그입니다.
- 내부 직원, 베타 사용자, 유료 고객 등 기능을 사용하는 그룹을 나눌 때
- 언제 사용: 베타 기능, 엔터프라이즈 전용 기능, 단계적 권한 확장
- 특징: 수명은 영구적일 수도 임시적일 수도 있음
예시
if (!isEnabled("permission-premium-dashboard", context)) {
throw new ForbiddenException();
}
정리
| 타입 | 목적 | 수명 | 대표 예 |
|---|
| Release | 안전한 배포 | 짧음 | 신규 기능 |
| Experiment | A/B 테스트 | 중간 | UX 실험 |
| Kill switch | 장애 대응 | 김/영구 | 외부 API 차단 |
| Operational | 기술 전환 | 짧음 | 라이브러리 교체 |
| Permission | 접근 제어 | 다양 | 베타/유료 기능 |