지금까지 기능 플래그를 부분적으로 구축된 기능을 숨기는 데 사용하는 것으로 설명했습니다. 일종의 기능 플래그를 릴리스 토글이라고 부릅니다 . Hodgson은 또한 A/B 테스트를 위한 실험 토글 , 운영 직원에게 제어 기능을 제공하는 작업 토글 , 다양한 사용자 하위 집합에 대한 기능 액세스를 제어하는 권한 토글을 식별합니다.
다음과 같은 테스트도 없는 레거시 코드가 있다고 가정해봅시다.
publicclassFeature {
privatefinal ExternalService externalService;
publicvoidfeature(DomainObject domainObject, int delta) {
domainObject.addValue(delta);
domainObject.addValue(delta);
domainObject.addValue(delta);
domainObject.addValue(delta);
externalService.doSomthing(); // Unit 테스트 불가능
}
}
이러한 레거시 코드를 변경하고 테스트 하는 것은 까다로운 일입니다.
테스트를 만들기 어렵고, 테스트를 작성하더라도 운영 중에 어떤 사이드 이팩트가 있을지에 대해서 확신하지 못합니다.
이럴때 Feature Flag를 쓰면 안심하고 배포할 수 있습니다
그리고 상황에 따라서 테스트를 추가할 수 있게끔 만들어 볼 수 있겠습니다.
publicclassFeature {
privatefinal ExternalService externalService;
publicvoidfeature(DomainObject domainObject, int delta) {
if (domainObject.isFeatureFlagActive()) {
// 새로운 로직
domainObject.newOperation(delta);
} else {
// 기존 로직
domainObject.addValue(delta);
domainObject.addValue(delta);
domainObject.addValue(delta);
domainObject.addValue(delta);
}
externalService.doSomthing();
}
}
classTestClass {
@Test//유닛테스트로 새로운 로직만 검증publicvoidtestFeature() {
// GivenfinalDomainObjectdomainObject=newDomainObject();
finalintdelta=1;
// When
domainObject.newOperation(delta);
// Thenfinalint expected;
assertThat(domainObject.getDelta()).isEqualTo(expected);
}
}
Feature Flag를 database에서 조회하고, 해당 flag가 활성화 되어 있다면 새로운 기능을 반영한다.
만약 문제가 생기면 database에서 직접 update 해서 런타임에 기능을 비활성화 한다.