11번가 Core플랫폼개발팀이 전사 공통 라이브러리를 Production 에 안전하게 내보내기 위해 Feature Flag 를 도입한 사례다. REST 호출을 gRPC 로 바꾸는 라이브러리를 배포하되 실제 전환은 런타임에 외부에서 켜고 끄도록 만들었다. 표준 인터페이스로 OpenFeature 를, 평가 엔진으로 flagd 를 쓴다.
핵심 포인트- 문제는 검증 환경에서 통과한 gRPC 전환 라이브러리가 대규모 트래픽에서도 문제없다는 확신이 없었고, 롤백 재배포에도 적지 않은 시간이 걸린다는 것이었다.
- Feature Flag 는 특정 기능을 동적으로 켜고 끄는 조건부 코드 실행 메커니즘이다. 제어할 때마다 코드를 고쳐 배포할 필요가 없다는 점이 핵심이다.
- Flag 상태를 애플리케이션 외부에서 불러오지 않으면 의미가 없다. Spring Profile 로 기능을 전환하면 매번 재배포가 필요해 Feature Flag 의 장점을 잃는다.
- OpenFeature 는 2022년 6월 CNCF Sandbox 로 지정된 벤더 중립 표준으로, .NET, Go, Java, Node.js, PHP 등의 SDK 와 써드파티 Provider 연결을 제공한다.
- flagd 는 OpenFeature 호환 백엔드로, Flag Configuration 을 계속 Watch 해 변경을 즉시 반영한다. 파일이나 Kubernetes Custom Resource, HTTP·gRPC 엔드포인트를 소스로 삼을 수 있다.
상세 정리- Feature Flag 의 용도는 다섯 가지로 정리된다. 긴급 장애 시 기능 즉시 비활성화, 시스템 이전 시 트래픽 제어, 여러 버전 실험, 사용자별 개인화, 일부 그룹부터 노출하는 점진적 릴리즈다.
- 용어는 Feature Toggle, Feature Bits, Feature Flippers 로도 혼용된다.
- 구현은 Flag 상태를 판단하는 부분과 그 상태로 분기하는 조건문으로 나뉜다. 런타임 제어가 되려면 호출될 때마다 Configuration 에서 상태를 가져와야 한다.
- 11번가는 IDC 와 AWS EKS 를 함께 쓰는 하이브리드 인프라라, 배포 위치와 무관하게 같은 엔진을 보도록 EKS 클러스터에 flagd 이미지를 Pod 로 띄우고 모든 요청을 Ingress 로 처리했다.
- OpenFeature 는 Operator 로 구성한 Helm Chart 도 제공한다. 특정 어노테이션이 붙은 Pod 에 flagd 를 사이드카로 주입해 Pod 별로 분리된 엔진을 둘 수 있다.
- Flag 정의는 JSON 이나 YAML 로 쓰고 항목이 셋이다. state 는 사용 여부이며 비활성이면 Flag 가 없는 것과 같아 평가 시 예외가 난다.
- variants 는 Flag 가 가질 수 있는 모든 값을 사람이 이해할 식별자에 매핑한 구조체이고, 모든 value 는 같은 타입이어야 한다. 실제 제어는 defaultVariant 를 바꾸는 식으로 한다.
- targeting 은 조건문 기반 사전 정의 규칙으로, 평가 API 호출 시 함께 넘기는 Evaluation Context 를 활용한다. 사용자 이메일이나 host 같은 값으로 대상을 좁힐 수 있다.
- Targeting Rules 로는 요청 단위 가중치를 줘 Canary 도 적용할 수 있다. 예컨대 특정 정보가 넘어오는 요청을 50, 20, 30 비율로 나눠 각기 다른 variant 를 주는 식이다.
- 평가 값 타입은 Boolean, String, Integer, Double, Object 다섯이고, 값만 받는 단순 평가와 Flag Key, 값, 반환 이유, 에러 코드까지 담은 상세 평가를 고를 수 있다.
- Hook 은 before, after, error, finally 네 단계 라이프사이클마다 실행할 로직을 붙이는 장치다. finally 는 언어에 따라 예약어라 다른 이름을 쓰기도 한다.
- Spring Boot 적용은 OpenFeature SDK 와 flagd Provider 를 의존성에 넣고 평가용 Client 를 Bean 으로 등록하는 순서다.
- 주의할 점으로 flagd Provider 는 별도 설정이 없으면 localhost:8013 으로 gRPC 요청을 보내며, 현재 애플리케이션과 flagd 사이는 gRPC 통신으로만 평가가 가능하다.
- 결과적으로 배포 시점에는 defaultVariant 를 off 로 둬 HTTP 호출을 유지하다가, Flag 를 gRPC 로 전환하는 순간 엔진의 Sync 이벤트로 즉시 gRPC 호출로 바뀐다.
- OpenFeature 와 flagd 는 초기 프로젝트라 기능 변화가 계속되고 있으므로 상세 사항은 저장소를 확인하라고 덧붙인다.
왜 읽나큰 전환을 Production 에 올리며 롤백 시간이 부담스러운 팀에게, 벤더 종속 없이 Feature Flag 를 구축하는 표준 스택과 실제 배포 구성을 보여주는 사례.