Files
llm-wiki/raw/company-tech-blogs/adapter-togglz-ff4j-feature-toggle-library.md

118 lines
9.6 KiB
Markdown

---
title: Togglz · FF4J — Java feature toggle library 비교 (adapter on/off 대안)
source_type: company-tech-blog
url: https://www.togglz.org/
archive_url:
related_branches: [feature-integration-adapter-templates, feature-env-driven-runtime-configuration]
related_projects: [ca-skeleton-operational-contract]
tags: [ca-tmpl, adapter, feature-toggle, togglz, ff4j, alternative]
status: raw
confidence: medium
created: 2026-05-22
last_reviewed: 2026-05-27
---
# Togglz · FF4J — Java feature toggle 라이브러리
> Layer: `raw/company-tech-blogs/` — OSS feature toggle 라이브러리 자체 소개 페이지 (Togglz `togglz.org`, FF4J `ff4j.github.io`) verbatim.
> ca-tmpl `feature-integration-adapter-templates` branch 의 **대안 5** (runtime-time feature toggle library) 비교 근거.
> 검증된 요약은 `/ingest` 후 `wiki/concepts/`에 별도 작성.
## Parent / 활용 branch (필수)
| Branch | 이 자료가 정당화하는 결정 |
|---|---|
| [[raw/branch-notes/feature-integration-adapter-templates]] | adapter on/off 의 startup-time toggle 채택 시, runtime-time feature toggle 라이브러리 (Togglz/FF4J) 와의 시맨틱 차이 명시 — adapter 자체 on/off ≠ adapter 내부 분기 |
| [[raw/branch-notes/feature-env-driven-runtime-configuration]] | env-driven runtime configuration (startup env flag) 가 default 인 이유: 외부 상태 저장 (DB/Redis/JCache) 의존 회피 |
| [[raw/project-notes/ca-skeleton-operational-contract]] | Group I — Integration adapter templates 대안 비교 매트릭스 |
## 컨텍스트 / 왜 저장했는지
ca-tmpl `feature-integration-adapter-templates` branch의 **대안 5**. branch는 `@ConditionalOnProperty` 기반 startup-time toggle을 채택했음. Togglz / FF4J는 **runtime-time toggle** 라이브러리 → adapter 자체의 on/off가 아니라 adapter 호출 시점에 동적 분기가 필요할 때의 대안. 두 영역의 경계를 명확히 보존.
## 출처 / Source
- 원본 URL (Togglz): https://www.togglz.org/
- 원본 URL (FF4J): https://ff4j.github.io/
- 아카이브 URL: (미수집)
- 저자 / 조직: Togglz (Christian Kaltepoth, Apache 2.0 OSS) / FF4J (Cedrick Lunven 외, Apache 2.0 OSS)
- 발행일: rolling (라이브러리 공식 페이지)
- 마지막 확인일: 2026-05-27
- 신뢰도 주의: OSS 라이브러리 자체 소개 페이지로 자기 제품 마케팅 포함. 공식 best practice 로 인용 금지.
## 핵심 인용 / Key quotes (verbatim)
(Togglz `togglz.org` 메인 페이지)
> [§Togglz intro] "Togglz is an implementation of the Feature Toggles pattern for Java."
> [§Togglz intro] "Feature Toggles are a very common agile development practices in the context of continuous deployment and delivery."
> [§Togglz intro] "This allows you to enable or disable these features at application runtime, even for individual users."
(FF4J `ff4j.github.io` 메인 페이지)
> [§FF4J tagline] "Feature Flags for Java made Easy"
> [§FF4J runtime] "Enable. and disable features at runtime - no deployments. In your code implement multiple paths protected by dynamic predicates"
> [§FF4J strategies] "Implement custom predicates _(Strategy Pattern)_ to evaluate if a feature is enabled."
> [§FF4J strategies] "Some are provided out of the box: _White/Black lists_ ,_Time based_, _Expression based_."
> [§FF4J spring-boot] "Import ff4j-spring-boot-starter dependency in your microservices to get the web console and rest api working immediately."
## Claims Extracted / 추출된 주장
| Claim ID | Claim (이 자료가 직접 말하는 것) | Evidence quote | Strength | Applies to | Does not prove |
|---|---|---|---|---|---|
| TOGGLZ-FF4J-C1 | Togglz 는 Java 용 Feature Toggles 패턴 구현체 | [§Togglz intro] "Togglz is an implementation of the Feature Toggles pattern for Java." | `company-case-study` | Java 애플리케이션의 feature toggle 도입 시 후보 라이브러리 | feature toggle 패턴 자체의 정의가 Togglz 만의 것이라는 뜻은 아님 (Fowler 의 일반 패턴) |
| TOGGLZ-FF4J-C2 | Togglz 는 application runtime 에서 feature 활성/비활성, 개별 user 단위 활성도 지원 | [§Togglz intro] "This allows you to enable or disable these features at application runtime, even for individual users." | `company-case-study` | runtime 동적 toggle 이 필요한 시나리오 | 개별 user 매칭 메커니즘 (username/role/percentage) 의 정확한 구현은 본 인용에 없음 — 별도 docs 확인 필요 |
| TOGGLZ-FF4J-C3 | FF4J 는 deployment 없이 runtime 에서 feature 활성/비활성 가능, dynamic predicate 로 다중 경로 보호 | [§FF4J runtime] "Enable. and disable features at runtime - no deployments. In your code implement multiple paths protected by dynamic predicates" | `company-case-study` | FF4J 도입 시 코드 안에 분기 경로 작성 | "no deployments" 가 모든 backend store 구성에서 보장된다는 뜻은 아님 — feature store 변경 자체는 별도 |
| TOGGLZ-FF4J-C4 | FF4J 는 Strategy Pattern 기반 custom predicate 를 지원하며 기본 제공 strategy 는 White/Black list, Time based, Expression based | [§FF4J strategies] "Implement custom predicates _(Strategy Pattern)_ to evaluate if a feature is enabled." + "Some are provided out of the box: _White/Black lists_ ,_Time based_, _Expression based_." | `company-case-study` | FF4J activation strategy 선택 시 | 위 3개 외 strategy (예: percentage rollout, geographic) 가 기본 제공되는지는 인용 범위 밖 |
| TOGGLZ-FF4J-C5 | FF4J 는 Spring Boot starter (`ff4j-spring-boot-starter`) 를 제공하며 import 시 web console + REST API 가 즉시 동작 | [§FF4J spring-boot] "Import ff4j-spring-boot-starter dependency in your microservices to get the web console and rest api working immediately." | `company-case-study` | Spring Boot 마이크로서비스에 FF4J 통합 시 | console/REST API 의 인증·인가 default 정책은 본 인용에 없음 — 운영 환경 노출 전 별도 확인 필요 |
| TOGGLZ-FF4J-C6 | (부재) Togglz 의 Spring Boot starter / activation strategy 상세는 메인 페이지 인용 범위 내에 명시 없음 | (부재 자체가 claim) | `needs-confirmation` | Togglz Spring Boot starter / activation strategy 정확한 동작 | Togglz 가 Spring Boot 를 지원 안 한다는 뜻 아님 — nav 메뉴에 "Spring Boot Starter" 링크는 존재하나 본 페이지 본문 인용 불가 |
## Usage Boundaries / 적용 경계
- **이 자료가 직접 증명하는 것**:
- `TOGGLZ-FF4J-C1` ~ `C5`: Togglz/FF4J 의 자체 마케팅 문구 — Java runtime toggle, dynamic predicate, Spring Boot starter 존재
- **이 자료가 증명하지 않는 것**:
- `TOGGLZ-FF4J-C6`: Togglz 의 activation strategy 상세 / Spring Boot starter 동작
- Togglz/FF4J 의 실제 production 운영 사례 (사용자 자체 마케팅이라 self-attestation)
- Togglz/FF4J 가 LaunchDarkly / Unleash 보다 우수하다는 비교 결론
- ca-tmpl 의 `@ConditionalOnProperty` 가 Togglz/FF4J 보다 적합하다는 일반적 결론 (시맨틱 차이의 사례에만 한정)
- **내 프로젝트에 적용하려면 추가 확인이 필요한 것**:
- ca-tmpl 의 `env-keys.yaml` registry + `owner_branch` governance 를 Togglz/FF4J 의 enum/annotation 정의 모델과 어떻게 연결할지
- Togglz/FF4J 의 외부 feature store (DB/Redis/JCache) 가 ca-tmpl 의 "disabled adapter = bean 미등록" 원칙과 양립 가능한지
## 메모 / Notes (내 프로젝트 해석)
> 검증되지 않은 내 추론은 여기에 두지 말 것 — wiki source-summary 단계에서.
- 적용 시나리오: 같은 adapter는 항상 enabled이지만 그 안의 특정 동작 경로만 user / role / percentage 기반으로 분기해야 할 때.
- 장점:
- Spring Boot Starter 제공 (`togglz-spring-boot-starter`, `ff4j-spring-boot-starter`).
- runtime UI / REST console → product team이 backend 배포 없이 toggle 조작.
- activation strategy (Username, GradualActivation, ScheduleActivation, Custom predicate).
- role-based access (FF4J).
- 단점 / ca-tmpl 적용 시 한계:
- **adapter 자체 on/off에는 over-engineering**: branch는 disabled adapter가 ApplicationContext에 bean으로조차 등록되지 않는 것을 요구. Togglz/FF4J는 bean은 있고 호출 시 분기. 시맨틱이 다름.
- **외부 상태 저장 의존**: feature state를 DB / Redis / JCache에 저장 → adapter 비활성 시 의존성 늘어남 (모순).
- **registry governance 부재**: branch는 `env-keys.yaml` registry + `owner_branch` 강제. Togglz/FF4J는 toggle 정의가 enum/annotation + console에 분산. governance 레이어를 별도로 만들어야 함.
- LaunchDarkly/Unleash와 같은 "deploy ≠ release" 문제 영역. **adapter 통합 자체보다는 product feature flag 영역**.
- ca-tmpl 결정과의 매핑:
- branch Layer 1-2-3: adapter 자체의 on/off (startup-time decision). Togglz/FF4J의 영역 아님.
- 만약 adapter는 항상 on이고 그 안의 분기만 runtime toggle해야 한다면, Togglz/FF4J 또는 LaunchDarkly/Unleash가 후보. 단 ca-tmpl baseline에 포함시키지 않는 게 branch 결정과 정합 (registry/owner governance가 없으면 forbidden).
- 채택 시점 후보: 50+ active toggle, 또는 product team이 console UI로 직접 toggle을 운영해야 할 때. infra adapter on/off에는 부적합.
## Related / 관련
- 같은 주제 다른 raw: (미수집 — LaunchDarkly / Unleash 비교 자료 후보)
- 인용하는 branch:
- [[raw/branch-notes/feature-integration-adapter-templates]]
- [[raw/branch-notes/feature-env-driven-runtime-configuration]]
- 인용하는 project:
- [[raw/project-notes/ca-skeleton-operational-contract]] (Group I)
- 인용한 wiki 요약: (미작성)