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

9.6 KiB

title, source_type, url, archive_url, related_branches, related_projects, tags, status, confidence, created, last_reviewed
title source_type url archive_url related_branches related_projects tags status confidence created last_reviewed
Togglz · FF4J — Java feature toggle library 비교 (adapter on/off 대안) company-tech-blog https://www.togglz.org/
feature-integration-adapter-templates
feature-env-driven-runtime-configuration
ca-skeleton-operational-contract
ca-tmpl
adapter
feature-toggle
togglz
ff4j
alternative
raw medium 2026-05-22 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) 비교 근거. 검증된 요약은 /ingestwiki/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에는 부적합.