--- 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 요약: (미작성)