TL;DR

  • 기능 플래그를 별도 서비스 없이 PostgreSQL 키-값 테이블 하나로 관리해 배포와 프로덕션 기능 제공을 분리하는 방식임.
  • Meta 앱 심사를 위한 화면 녹화부터 자체 비즈니스에서의 시험, AI 모델 변경, 위험한 변경의 긴급 차단까지 플래그를 활용함.
  • 플래그는 비즈니스 또는 채널별 재정의값, 전역값, 코드 기본값 순으로 확인하며 기본값은 대부분 꺼짐임.
  • 비즈니스별 재정의값 조회에 실패하면 전역값으로 대체하지 않고 기능을 끄며, 재정의값으로 롤아웃에서 제외된 비즈니스가 뜻하지 않게 포함되는 상황을 막음.
  • 플래그 값은 켜기·끄기 외에도 0~1 사이 비율이나 열거형 값으로 설정할 수 있어 배포와 실제 고객 대상 변경을 분리하고 PR을 더 빠르고 작게 병합할 수 있음.

기능 플래그를 쓰게 된 계기

  • 4월에 Meta 앱 심사용 화면 영상을 녹화해야 했지만, 시연하려던 기능에 필요한 권한을 아직 받지 못해 모든 사용자에게 기능을 켤 수 없었음.
  • 기능 대부분이 실제 웹훅(webhook)에 의존해 로컬에서 녹화하는 방법도 현실적이지 않았음.
  • 이에 프로덕션에서는 기능을 끄고, 녹화 대상인 한 비즈니스에서만 켜는 기능 플래그를 처음 추가함.
  • 이후 고객에게 영향을 주지 않으면서 빠르게 시도하고 싶은 작업에 플래그를 사용함.

기능 플래그 활용 사례

  • 아직 권한이 없는 Meta 기능의 심사 영상을 녹화함.
  • 다른 고객에게 공개하기 전에 자체 비즈니스에서 기능을 시험함. Message24의 소셜 미디어를 Message24에서 운영하므로 새 기능의 첫 고객이 되는 경우가 많으며, 이를 통해 사용자 경험(UX)을 다듬는 데 도움을 얻음.
  • 실제 고객에게 영향을 주지 않고 다른 인공지능(AI) 모델을 시험함.
  • 문제가 생겼을 때 재배포 없이 전환할 수 있는 스위치를 두고 위험한 변경을 배포함.
  • 기능이 사용되는 모든 위치, 즉 애플리케이션 프로그래밍 인터페이스(API), 백그라운드 작업, AI 에이전트, 앱에서 플래그를 확인함.

PostgreSQL 테이블과 플래그 확인 순서

  • 별도의 플래그 서비스 없이 PostgreSQL 키-값 테이블의 행으로 플래그를 관리함.
  • 테이블은 플래그 키를 기본 키로 두고, 값과 설명, 마지막 수정 시각을 저장함. 키는 automations 또는 automations:<business id> 같은 형태이며, 값은 on, off, 0.1, 모델 이름 등이 될 수 있음.
  • 기능 활성화 여부를 가장 구체적인 설정부터 확인함.
  • 해당 비즈니스 또는 채널의 재정의값
  • 전역값
  • 코드에 지정된 기본값. 거의 항상 꺼짐임.
  • 재정의값은 반대 방향의 설정도 가능함. 한 비즈니스만 제외하고 모두 켜거나, 한 비즈니스만 켜고 나머지는 모두 끌 수 있음.
  • 재정의값 조회에 실패하면 기능을 끔. 전역값으로 대체하지 않으며, 데이터베이스 장애 때문에 롤아웃에서 제외된 비즈니스가 기능 대상에 포함되는 상황을 방지함.

플래그 값과 운영 효과

  • 대부분의 기능에는 켜기·끄기 값을 사용함.
  • AI 응답의 10%를 평가 대상으로 추출하는 등의 작업에는 0과 1 사이의 비율을 사용함.
  • 고객에게 영향을 주지 않고 모델을 바꿔 시험할 때는 열거형 값을 사용함.
  • 기능 플래그를 통해 물리적인 배포와 프로덕션에 변경 사항을 제공하는 일을 분리함.
  • 이 방식은 PR을 더 빠르게 병합하고 변경 단위를 더 작게 만드는 데도 도움이 됨.