Togglz로 Feature flag 쉽게 구현하기 (w. Spring)

🔥Log·2026년 9월 12일

스프링

목록 보기
26/26

1. Feature flag


우리는 개발하다보면, 매우 많은 조건문을 사용하게 된다.
어떤 값이 true이면 A를 실행하고 false이면 B를 실행한다와 같은 로직이 매우 많을 것이다.

또, 새로운 API나 기능을 개발했을 때에도 경우에 따라서 그 기능을 켜고 끌 수 있는 값을 DB와 같은 곳에서 관리하며 켜고 끄기도 한다.

이렇게 어떤 기능을 켜고 끌 수 있도록 하는 것을 Feature flag라고 하는데, 오늘은 Togglz라는 라이브러리를 통해서 아주 손쉽게 Feature flag를 뚝딱 세팅해보도록 하겠다.


2. build.gradle


💡 사용하는 기술

  • Java 25
  • Spring boot 4.1.0
	dependencies {
		implementation 'org.togglz:togglz-spring-boot-autoconfigure:4.6.4'
		implementation 'org.togglz:togglz-spring-web:4.6.4'
		implementation 'org.togglz:togglz-console:4.6.4'
	}

Spring 웹서버를 만든다는 가정하에 위와 같이 3개의 Togglz 라이브러리들을 정의해주면 된다.

  • togglz-spring-boot-autoconfigure: Togglz Spring boot 스타터 라이브러리
  • togglz-spring-web: Togglz를 웹 요청 처리 흐름에 통합
  • togglz-console: 플래그를 런타임에서 조작할 수 있는 어드민 UI를 제공

3. 기본 사용 방법


0) 저장소 결정

Togglz는 별도의 설정을 하지 않으면 In-memory 저장소를 사용하고, RDB, Redis, S3 등등 다양한 저장소와의 연동을 제공한다.
그 중에서 오늘은 JDBC 저장소를 사용하는 방법을 선택해보도록 하겠다.

1) Enum 정의

import org.togglz.core.Feature;
import org.togglz.core.annotation.Label;

public enum FeatureFlag implements Feature {

	@Label("샘플 플래그")
	SAMPLE

}

2) Togglz config

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.togglz.core.repository.StateRepository;
import org.togglz.core.repository.jdbc.JDBCStateRepository;
import org.togglz.core.user.NoOpUserProvider;
import org.togglz.core.user.UserProvider;

@Configuration
public class TogglzConfig {

	@Bean
	StateRepository stateRepository(DataSource dataSource) {
		return new JDBCStateRepository(dataSource);
	}

	@Bean
	UserProvider userProvider() {
		return new NoOpUserProvider();
	}

}

위와 같이 JDBC 저장소를 선택하였다.
그리고, Togglz의 보안 관련 라이브러리를 함께 설치하면 Togglz 콘솔의 접근 보안을 강화할 수 있는데, 이번에는 모두 접근 가능하도록 UserProvider를 정의하도록 하겠다.
물론 실무에서는 보안 처리는 반드시 해줘야할 것이다.

JDBCStateRepository를 사용하면, Togglz에서 사용하는 테이블은 자동으로 생성해준다.

3) application.yaml

togglz:
  feature-enums: {각자의 패키지 경로}.FeatureFlag
  cache:
    enabled: true
    time-to-live: 30
    time-unit: seconds
  console:
    enabled: true
    path: /togglz-console
    secured: false
    use-management-port: false

최소한의 구성으로 위와 같이 설정값을 정의하였다.

4) 테스트용 코드 작성

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.tags.Tag;
import lakeg.lakegapi.application.shared.FeatureFlag;

@RestController
@RequestMapping("/")
@Tag(name = "Home")
public class HomeApi {

    @GetMapping("/togglz/sample")
    public String sample() {
        return FeatureFlag.SAMPLE.isActive() ? "Hello world" : "Good bye world";
    }

}

위와 같이 간단한 API를 하나 만들어보았다.
FeatureFlag의 값은 실제로는 DB에 저장되어 있지만, 코드 상으로는 DB 값을 조회하는 부분은 보이지 않고, 그냥 어떤 정적 변수를 사용하는 것과 같은 경험을 가질 수 있다. 👍


4. 테스트


1) 테이블 생성 확인

create table TOGGLZ
(
    FEATURE_NAME    varchar(100)  not null primary key,
    FEATURE_ENABLED int           null,
    STRATEGY_ID     varchar(200)  null,
    STRATEGY_PARAMS varchar(2000) null
);

서버를 실행해보면, 위와 같은 스키마를 갖고 있는 TOGGLZ 테이블이 생성되어 있는 것을 확인할 수 있다.

2) Admin console 접속

이전에 설정한대로 /togglz-console로 접속하면 위와 같이 Feature flag를 껐다 켤 수 있는 간단한 기능이 뚝-딱하고 만들어진다. 👹

3) 토글링 사용해보기

'샘플 플래그'를 켜고 꺼보면서 그에 따라서 API의 응답이 변화하는 것을 확인할 수 있다. 👍


☕️ 마무리


오늘은 Spring boot에서 Togglz를 사용하여 손쉽게 Feature flag 기능을 구현하는 방법을 알아보았다.
물론, 매우 복잡한 정책이 수반되어야하는 Feature flag 기능은 Togglz로 부족할 수도 있겠지만, 웬만한 Feature flag 요구 사항은 Togglz로 커버할 수 있지 않을까 싶다. ㅎㅎ

0개의 댓글