기능 플래그 지정은 백엔드 개발자가 빌드한 항목을 테스트하고 수정하는 방법에 대한 패러다임을 변경했습니다. 기능 플래그를 사용하면 한 번의 클릭으로 기능을 활성화 및 비활성화하거나 즉석에서 기능을 변경할 수 있습니다(재배포할 필요 없음).
이 튜토리얼에서는 전체 코드를 다시 배포할 필요 없이 UI에서 원할 때마다 기능/코드의 일부를 활성화 및 비활성화하는 데 기능 플래그가 어떻게 도움이 되는지 살펴보겠습니다.
더 깊이 이해하기 위해 처음부터 앱을 구축하고, 기능 플래그 지정 기능을 살펴보고, Flagsmith라는 도구를 사용하여 생성된 기능 플래그를 단일 대시보드에서 관리하겠습니다.
우리가 다룰 내용은 다음과 같습니다:
-
전제 조건
-
기능 플래그란 무엇입니까?
-
백엔드 개발을 위한 기능 플래그
-
오픈소스 도구를 사용하는 이유
-
코딩하자!
-
도구 초기화 중
-
API에 대한 엔드포인트 생성
-
기능 플래그를 추가하는 방법
-
기능 플래그 코드 논리 이해
-
Plasgsmith 대시보드에서 기능 플래그를 생성하는 방법
-
속도 제한 기능 플래그
-
베타 기능 플래그
-
액세스 키 받기
-
API 실행
-
rate_limit 플래그 업데이트
-
GitHub 앱과 기능 플래그를 통합하는 방법
-
Flagsmith GitHub 앱 테스트
-
-
결론
전제조건
-
Golang이 설치되어 있고 이에 대한 중간 수준의 이해가 있습니다.
-
실행 중인 Redis 인스턴스(원격 또는 로컬 인스턴스)
-
Flagsmith 계정(무료입니다. 이에 대해서는 기사 뒷부분에서 다루겠습니다.)
기능 플래그란 무엇인가요?
기능 플래그는 팀이 소스 코드를 수정하거나 재배포하지 않고도 기능을 켜거나 끌 수 있도록 하는 개발 기술입니다.
좀 더 간단하게 하려면 조건문(예:if-else 문)과 같은 기능을 하는 것으로 생각하면 됩니다. 즉, 항목이 참인지 거짓인지에 따라 실행될 코드 경로가 결정됩니다.
백엔드 개발을 위한 기능 플래그
프런트엔드와 웹사이트에서 사용되는 기능 플래그를 본 적이 있을 수도 있지만 그 외에도 훨씬 더 많은 기능이 있습니다. 서버 측에서 이를 사용하여 속도 제한 수정/설정, API 엔드포인트 기능 변경 또는 완전히 끄기와 같은 작업을 수행하여 API 기능을 수정할 수 있습니다. 백엔드 개발자로서 우리는 기능 플래그를 사용하여 테스트 수준을 높일 수 있습니다.
이를 시연하기 위해 데모 앱을 구축해 보겠습니다. 데모 앱은 기능(속도 제한)을 즉시 수정하는 것부터 베타 테스트 또는 초기 롤링 목적을 위해 API에 새 엔드포인트를 추가하는 것까지 기능 플래그 지정 기능을 보여주기 위해 선별되었습니다. 그 과정에서 우리는 완전한 오픈 소스 도구를 사용할 것입니다!
우리는 이 앱을 구축하기 위해 오픈 소스 도구(Golang, Redis 및 Flagsmith)를 사용할 것입니다. 오픈 소스는 더 많은 투명성과 신뢰를 제공하고 백엔드 개발자로 구성된 글로벌 커뮤니티와의 협력을 장려합니다.
오픈 소스 도구를 통합함으로써 우리는 구축하고 테스트할 때 완전한 가시성을 확보합니다. 예를 들어 기능 플래그를 GitHub와 통합하면 Flagsmith 기능 플래그를 GitHub Pull Request 또는 Issue와 연결하여 기능의 수명 주기를 추적할 수 있습니다. 이를 통해 각 수정 사항을 수동으로 추적할 필요 없이 기능 변경 사항을 지속적으로 업데이트할 수 있습니다. 다양한 환경에서 기능 상태를 쉽게 추적할 수 있습니다.
코딩하자!
이 튜토리얼에서는 기능 플래그 지정 메커니즘을 사용하여 테스트하기 전후에 앱 기능이 어떻게 변경되는지 확인할 수 있습니다. 우리가 사용할 도구와 프레임워크는 Golang, Docker, Redis, Flagsmith 및 GitHub입니다. 논의한 대로 모두 오픈 소스이며 무료로 계정을 만들어 테스트할 수 있습니다.
시작하려면 즐겨 사용하는 IDE를 열고 Golang 프로젝트를 초기화한 다음 main.go에 아래 코드를 복사하세요. 파일. 그런 다음 go mod tidy을 실행하세요. 필요한 모든 종속성을 설치합니다.
아래 코드 조각에서 무슨 일이 일어나고 있는지 살펴보겠습니다.
package main
import (
"context"
"errors"
"fmt"
"log"
"net/http"
"os"
"strconv"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis_rate/v10"
"github.com/joho/godotenv"
"github.com/redis/go-redis/v9"
)
var (
redisClient *redis.Client
limiter *redis_rate.Limiter
)
func initClients() {
redisClient = redis.NewClient(&redis.Options{
Addr: os.Getenv("REDIS_URL"),
})
limiter = redis_rate.NewLimiter(redisClient)
}
func main() {
err := godotenv.Load()
if err != nil {
log.Printf("Loading environment variable from the host system")
} else {
log.Printf("Loading environment from .env file")
}
initClients()
defer redisClient.Close()
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
err, remainingLimit := rateLimitCall(c.ClientIP())
if err != nil {
c.JSON(
http.StatusTooManyRequests,
gin.H{"error": "Rate Limit Hit"})
} else {
c.JSON(
http.StatusOK,
gin.H{"Your left over API request is": remainingLimit})
}
})
r.GET("/beta", func(c *gin.Context) {
c.JSON(
http.StatusOK,
gin.H{"message": "This is beta endpoint"})
})
r.Run(":" + os.Getenv("PORT"))
}
func rateLimitCall(ClientIP string) (error, int) {
ctx := context.Background()
rateLimitString := os.Getenv("RATE_LIMIT")
RATE_LIMIT, _ := strconv.Atoi(rateLimitString)
res, err := limiter.Allow(ctx, ClientIP, redis_rate.PerHour(RATE_LIMIT))
if err != nil {
panic(err)
}
if res.Remaining == 0 {
return errors.New("You have hit the Rate Limit for the API. Try again later"), 0
}
fmt.Println("remaining request for", ClientIP, "is", res.Remaining)
return nil, res.Remaining
}
도구 초기화
func initClients() {
redisClient = redis.NewClient(&redis.Options{
Addr: os.Getenv("REDIS_URL"),
})
limiter = redis_rate.NewLimiter(redisClient)
}
func main() {
err := godotenv.Load()
if err != nil {
log.Printf("Loading environment variable from the host system")
} else {
log.Printf("Loading environment from .env file")
}
initClients()
defer redisClient.Close()
r := gin.Default()
...
})
상단에는 Redis 및 Rate Limiter 클라이언트를 저장하여 재사용하고 한 번 초기화할 변수를 선언합니다. 그런 다음 initClients()에서 초기화합니다. .
main()에서 , 먼저 시스템이나 .env 파일에서 환경 변수를 로드합니다. 그런 다음 initClients()을 호출합니다. . 그러면 클라이언트가 생성되어 우리가 만든 변수에 저장됩니다.
다음으로 Gin을 만듭니다. 들어오는 모든 요청을 처리하는 라우터입니다. 이는 .env에 필요한 환경 변수입니다. 파일. 이 데모에서는 속도 제한 기능을 위해 모든 데이터를 저장하기 위해 실행되는 Redis 인스턴스가 필요합니다. Docker나 다른 원격 시스템을 사용할 수 있습니다. REDIS_URL를 업데이트하는 것만 기억하세요. 따라서. 저는 도커를 사용할 예정입니다.
또한 1마일 앞서서 기능 플래그에서 모든 환경 변수를 가져올 수도 있지만 여기서는 그렇게 하지 않습니다.
REDIS_URL=localhost:6379
PORT=8080
RATE_LIMIT=10
API용 엔드포인트 생성
r.GET("/ping", func(c *gin.Context) {
err, remainingLimit := rateLimitCall(c.ClientIP())
if err != nil {
c.JSON(
http.StatusTooManyRequests,
gin.H{"error": "Rate Limit Hit"})
} else {
c.JSON(
http.StatusOK,
gin.H{"Your left over API request is": remainingLimit})
}
})
r.GET("/beta", func(c *gin.Context) {
c.JSON(
http.StatusOK,
gin.H{"message": "This is beta endpoint"})
})
r.Run(":" + os.Getenv("PORT"))
그런 다음 두 개의 GET을 생성합니다. 엔드포인트, /ping 그리고 /beta . 누군가가 /ping을 칠 때마다 우리는 rateLimitCall()라고 부르는 엔드포인트를 사용합니다. 기능. IP 주소에서 들어오는 요청의 속도 제한을 확인하고 설정합니다. . 이 모든 것은 우리가 만든 Redis 인스턴스에 저장됩니다.
이제 사용자가 /ping과 상호작용했다면 처음으로 API 엔드포인트는 시간당 10으로 제한되는 항목을 생성합니다. . 제한 개수 10 RATE_LIMIT에서 옵니다 우리가 설정했고, 시간별 새로고침 형식은 redis_rate.PerHour(RATE_LIMIT)에서 옵니다. 기능입니다.
다음으로 사용자에게 남은 한도가 있는지 확인합니다. 그렇다면 남은 요청 수가 포함된 메시지를 보내드립니다. 그렇지 않고 제한 한도에 도달하면 이를 알리는 메시지가 반환됩니다.
/ping 외에 엔드포인트, 또 다른 엔드포인트 /beta가 있습니다 . 간단한 메시지를 반환하지만 나중에 기능 플래그를 사용하여 이 엔드포인트의 기능을 완전히 켜고 끌 수 있는 방법을 살펴보겠습니다.
기능 플래그 추가 방법
이제 앱에 기능 플래그 지정 기능을 추가할 차례입니다. 우리는 Flagsmith를 사용할 것입니다. Flagsmith는 웹, 모바일, 서버 측 애플리케이션 전반에 걸쳐 기능 플래그를 쉽게 생성하고 관리할 수 있는 오픈 소스 소프트웨어입니다.
Flagsmith를 사용하면 기능을 플래그로 래핑한 다음 다양한 환경, 사용자 또는 사용자 세그먼트에 대해 기능을 켜거나 끌 수 있습니다. 그런 다음 재배포할 필요 없이 Flagsmith 대시보드에서 모든 항목을 관리할 수 있습니다.
이제 아래 명령을 실행하여 Flagsmith 패키지를 설치해 보겠습니다.
go get github.com/Flagsmith/flagsmith-go-client/v3
그런 다음 별칭 flagsmith를 지정하여 패키지를 가져옵니다. . 다음은 기존 코드에 기능 플래그를 적용한 후 업데이트된 기능입니다.
여기서 변경된 사항을 이해해 봅시다(코드 조각 아래에서 설명하겠습니다):
package main
import (
"context"
"errors"
"fmt"
"log"
"net/http"
"os"
flagsmith "github.com/Flagsmith/flagsmith-go-client/v3"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis_rate/v10"
"github.com/joho/godotenv"
"github.com/redis/go-redis/v9"
)
var (
redisClient *redis.Client
limiter *redis_rate.Limiter
flagsmithClient *flagsmith.Client
)
func initClients() {
redisClient = redis.NewClient(&redis.Options{
Addr: os.Getenv("REDIS_URL"),
})
limiter = redis_rate.NewLimiter(redisClient)
flagsmithClient = flagsmith.NewClient(os.Getenv("FLAGSMITH_ENVIRONMENT_KEY"))
}
func main() {
err := godotenv.Load()
if err != nil {
log.Printf("Loading environment variable from the host system")
} else {
log.Printf("Loading environment from .env file")
}
initClients()
defer redisClient.Close()
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
err, remainingLimit := rateLimitCall(c.ClientIP())
if err != nil {
c.JSON(
http.StatusTooManyRequests,
gin.H{"error": "Rate Limit Hit"})
} else {
c.JSON(
http.StatusOK,
gin.H{"Your left over API request is": remainingLimit})
}
})
r.GET("/beta", func(c *gin.Context) {
flags := getFeatureFlags()
isEnabled, _ := flags.IsFeatureEnabled("beta")
if isEnabled {
c.JSON(
http.StatusOK,
gin.H{"message": "This is beta endpoint"})
} else {
c.String(http.StatusNotFound, "404 page not found")
}
})
r.Run(":" + os.Getenv("PORT"))
}
func rateLimitCall(ClientIP string) (error, int) {
ctx := context.Background()
flags := getFeatureFlags()
rateLimitInterface, _ := flags.GetFeatureValue("rate_limit")
RATE_LIMIT := int(rateLimitInterface.(float64))
fmt.Println("Current Rate Limit is", RATE_LIMIT)
res, err := limiter.Allow(ctx, ClientIP, redis_rate.PerHour(RATE_LIMIT))
if err != nil {
panic(err)
}
if res.Remaining == 0 {
return errors.New("You have hit the Rate Limit for the API. Try again later"), 0
}
fmt.Println("remaining request for", ClientIP, "is", res.Remaining)
return nil, res.Remaining
}
func getFeatureFlags() flagsmith.Flags {
ctx := context.Background()
flags, _ := flagsmithClient.GetEnvironmentFlags(ctx)
return flags
}
기능 플래그 코드 논리 이해
func getFeatureFlags() flagsmith.Flags {
ctx := context.Background()
flags, _ := flagsmithClient.GetEnvironmentFlags(ctx)
return flags
}
먼저 새로운 getFeatureFlags()로 바로 이동해 보겠습니다. 우리가 맨 아래에 만든 함수. 이 함수는 GetEnvironmentFlags()을 호출하여 Flagsmith 대시보드에서 생성한 모든 플래그를 반환합니다. flagsmithClient의 메소드 .
우리는 flagsmithClient을 시작했습니다. initClients() 내부 기능. Flagsmith 클라이언트에는 액세스 키(NewClient())가 필요합니다. 기능)을 Flagsmith 대시보드에서 얻을 수 있습니다. Redis 및 Limter 클라이언트에 대해 했던 것처럼 재사용성을 위해 클라이언트를 전역 변수에 저장합니다. 이후 단계에서 대시보드, 플래그 생성 및 키 검색을 이해하게 됩니다.
func rateLimitCall(ClientIP string) (error, int) {
ctx := context.Background()
flags := getFeatureFlags()
rateLimitInterface, _ := flags.GetFeatureValue("rate_limit")
RATE_LIMIT := int(rateLimitInterface.(float64))
fmt.Println("Current Rate Limit is", RATE_LIMIT)
res, err := limiter.Allow(ctx, ClientIP, redis_rate.PerHour(RATE_LIMIT))
if err != nil {
panic(err)
}
if res.Remaining == 0 {
return errors.New("You have hit the Rate Limit for the API. Try again later"), 0
}
fmt.Println("remaining request for", ClientIP, "is", res.Remaining)
return nil, res.Remaining
}
이제 rateLimitCall()로 옵니다 RATE_LIMIT을 얻는 대신 함수 환경에서 rate_limit에서 값을 얻습니다. 플래그(나중에 생성할 것임). 우리는 getFeatureFlags()에 전화합니다. 플래그 rate_limit를 가져옵니다. 모든 플래그에서 값을 가져옵니다.
이를 기능 플래그로 설정하면 대시보드에서 언제든지 제한을 동적으로 변경할 수 있습니다. 코드의 기능을 변경하거나 RATE_LIMIT을 변경하여 기존 방식으로 수행할 필요가 없습니다. 값을 저장하고 서버를 다시 실행하여 새로 업데이트된 값을 포착합니다.
r.GET("/beta", func(c *gin.Context) {
flags := getFeatureFlags()
isEnabled, _ := flags.IsFeatureEnabled("beta")
if isEnabled {
c.JSON(
http.StatusOK,
gin.H{"message": "This is beta endpoint"})
} else {
c.String(http.StatusNotFound, "404 page not found")
}
})
이제 /beta로 옵니다 베타 플래그의 활성화 또는 비활성화 여부에 따라 이 엔드포인트는 쿼리를 제공합니다. 그렇지 않으면 연결할 수 없는 끝점으로 작동하고 404 오류 메시지를 반환합니다.
이 예에서는 작동 방식을 보여주기 위해 기본 자리 표시자 메시지를 추가했지만 이는 테스트 및 초기 릴리스(베타)에서 새로운 가능성을 열어줍니다. API에 새 엔드포인트가 있는 경우 기능을 기능 플래그로 래핑하고 버튼을 한 번만 클릭하면 해당 기능을 사용하거나 사용할 수 없게 만들 수 있습니다. 또한 일정 예약 및 카나리아 릴리스와 같은 다양한 작업을 수행할 수 있습니다.
또한 우리의 .env 파일은 다음과 같습니다. RATE_LIMIT을 제거했습니다. FLAGSMITH_ENVIRONMENT_KEY를 추가했습니다. .
REDIS_URL=localhost:6379
PORT=8080
FLAGSMITH_ENVIRONMENT_KEY=ser.ZRd***********469
Flasgsmith 대시보드에서 기능 플래그를 생성하는 방법
Flagsmith 대시보드로 이동하여 위에서 사용한 플래그를 생성하고 액세스 키를 받으세요. Flagsmith 계정이 없다면 여기에서 무료로 가입할 수 있습니다.
가입하고 나면 조직과 프로젝트를 생성하라는 메시지가 표시됩니다. 프로젝트 분리는 여러 프로젝트의 로직을 분리하는 데 도움이 되므로 좋습니다. 완료되면 아래 스크린샷과 같은 대시보드가 표시됩니다.
통합부터 변경 사항을 비교하기 위한 플래그 예약에 이르기까지 다양한 기능이 있습니다. Go 외에도 Flagsmith는 다양한 SDK를 제공합니다. 언어 이름이 기록된 위치를 클릭하면 해당 언어에 대한 상용구 코드가 제공됩니다.

속도 제한 기능 플래그
이제 속도 제한에 대한 첫 번째 기능 플래그를 만들어 보겠습니다. 기능 만들기를 클릭하세요. 오른쪽 상단에 있는 버튼을 클릭하세요. 사이드바 창이 열립니다. 이름을 설정한 다음 생성하는 동안 플래그가 올바른 방식으로 켜지도록 하려면 기본적으로 활성화됨을 선택하면 됩니다.
값 섹션에서는 플래그 값을 설정해야 합니다. Txt, JSON, XML 등과 같은 형식을 사용할 수 있습니다. 기능 값은 20, 30 등과 같은 간단한 텍스트이므로 Txt(기본값)를 선택하고 임의 제한을 설정합니다. 20으로 설정하겠습니다. .
태그와 설명을 제공할 수도 있습니다. 태그는 기능 플래그를 필터링할 때 도움이 될 수 있습니다. 예를 들어 backend 태그를 만들 수 있습니다. 백엔드와 관련된 모든 기능 플래그를 필터링합니다. 설명은 이 특정 미래 플래그가 활성화되었을 때 수행되는 작업에 대한 간결한 설명입니다(향후 이해에 도움이 될 것입니다).
아래 스크린샷은 세부 사항을 입력한 후의 모습을 보여줍니다. 그런 다음 기능 만들기를 클릭하세요. 버튼을 눌러 플래그를 생성하세요.

베타 기능 플래그
이제 두 번째 beta를 만들어 보겠습니다. 기능 플래그. 첫 번째 프로세스와 동일한 프로세스이지만 이 프로세스에서는 플래그 값을 설정할 필요가 없으며 해당 열을 비워 둘 필요가 없습니다. 두 플래그를 모두 생성하면 대시보드는 다음과 같습니다. 플래그 이름, 값, 현재 상태(보기) 등을 표시합니다.

액세스 키 받기
액세스 키를 얻으려면 SDK 키를 클릭하세요. 사이드바에서 서버 측 환경 키 만들기를 클릭하세요. 키를 생성하는 버튼입니다. 우리 앱은 서버사이드이므로 그 앱만 사용하는 것이 좋습니다. 그런 다음 해당 키를 복사하여 .env에 있는 값에 붙여넣습니다. FLAGSMITH_ENVIRONMENT_KEY의 경우 키.

API 실행
이제 모든 것이 설정되었으므로 IDE로 돌아가서 go run main.go을 실행하여 서버를 실행해 보겠습니다. 터미널에서 명령을 실행합니다. 터미널에서 이 메시지를 볼 수 있습니다. 오류가 발생하는 경우 패키지가 올바르게 설치되었는지, 변수가 올바르게 설정되었는지, 앱이 Redis 인스턴스에 액세스하는지 확인하세요.

이제 localhost:8080/ping을 방문하면 , {"Your left over API request is":19} 메시지를 받게 됩니다. . 한도는 20개였고, 지금 요청을 한 개 했고, 나머지는 19개입니다.

rate_limit 업데이트 중 플래그
rate_limit을 업데이트해 보겠습니다. 플래그 값을 10으로 설정하고 무슨 일이 일어나는지 확인하세요. 그렇게 하려면 다시 Flagsmith 대시보드를 방문하여 깃발 이름을 클릭하세요. 사이드 메뉴 표시줄이 열립니다. 값을 10으로 업데이트하고 기능 값 업데이트를 클릭합니다. 버튼을 누르세요.
업데이트를 예약할 수도 있습니다. 예를 들어, 특정 기간에 트래픽 급증이 예상되고 사용자당 한도를 줄여 서버 부하를 줄일 때 유용할 수 있습니다.

이제 localhost:8080/ping을 방문하면 , {"Your left over API request is":8} 메시지를 받게 됩니다. – 총 한도는 10개이고 이미 두 번 요청했기 때문입니다.

이제 /beta을 테스트해 보겠습니다. 끝점. localhost:8080/beta를 방문하면 {"message":"This is beta endpoint"} 메시지가 표시됩니다. .

이제 Flagsmith 대시보드로 돌아가 스위치를 전환하여 이 플래그를 비활성화합니다. 이제 URL을 방문하십시오. 이 엔드포인트는 존재한 적이 없다는 404 메시지를 받게 됩니다.

이제 기능을 설정하고 기능 플래그 지정 기능을 시연했으므로 Flasgsmith GitHub 앱을 통합하는 방법을 살펴보겠습니다.
GitHub 앱과 기능 플래그를 통합하는 방법
먼저 앱을 GitHub에 푸시했는지 확인하세요. 그런 다음 GitHub Marketplace의 저장소에 GitHub Flasgsmith 앱을 설치하세요.
GitHub와 Falagsmith를 통합하면 GitHub 문제 및 끌어오기 요청의 댓글로 기능 플래그/기능에 대한 업데이트를 볼 수 있습니다. 이를 통해 문제 생성부터 PR 병합 및 변경 사항 배포에 이르기까지 기능을 쉽게 추적할 수 있습니다.

그런 다음 앱을 설치하려는 조직과 리포지토리를 선택합니다. 모든 저장소에 설치하거나 특정 저장소를 선택할 수 있습니다.
설치하면 통합을 구성하고 완료하기 위해 Flagmsith 대시보드로 자동 리디렉션됩니다. 대부분의 데이터는 미리 채워져 있으므로 프로젝트를 선택하여 추가한 다음 구성을 저장하기만 하면 됩니다.

구성 버튼 저장을 누르면 , 이전에 작업했던 기본 Flagsmith 대시보드로 다시 리디렉션됩니다.
이제 기존 플래그 중 하나를 GitHub 이슈/풀 요청(테스트를 위해 더미 PR/이슈 발생)과 연결하거나 테스트할 새 플래그를 생성할 수 있습니다. beta에 대해 이미 생성한 베타 플래그를 계속 진행하겠습니다. 끝점.
플래그를 기존 이슈 또는 끌어오기 요청과 연결하려면 플래그 이름을 클릭하면 오른쪽에 사이드 메뉴가 나타납니다. 그런 다음 '링크' 탭을 선택하세요. 그런 다음 Pull Request 옵션을 선택하고 연결하려는 Pull Request를 선택하세요. 이 플래그에 연결된 모든 문제와 끌어오기 요청은 아래에서 볼 수 있습니다:

플래그가 성공적으로 연결되었는지 확인하려면 이름 아래에 있는 화살표 아이콘이 있는 하이퍼링크를 클릭하세요. 열 제목. GitHub의 특정 Issue/Pull Request로 이동합니다. 아래에는 Flagsmith GitHub 앱에 환경, 활성화된 값 등 모든 세부정보가 포함된 주석이 달린 것을 확인할 수 있습니다.

Flagsmith GitHub 앱 테스트
그런 다음 플래그를 켜거나 끄거나 값을 변경하는 등 플래그 설정을 변경하면 봇이 업데이트된 모든 세부정보를 댓글로 달게 됩니다.
플래그를 꺼서 테스트해 보겠습니다. 대시보드에서 플래시를 끄자마자 봇은 이제 플래그가 비활성화되었다고 설명해야 합니다.

그게 다야. 이것이 바로 Flagsmith를 GitHub와 통합하는 방법입니다.
결론
요약하자면, 이제 백엔드 개발자로서 기능 플래그를 활용하여 앱의 기능을 즉시 변경할 수 있는 방법을 알게 되었습니다.
다음 단계로 나아가기 위해 우리는 데모 앱을 Flagsmith GitHub 앱과 통합하여 수동으로 업데이트할 필요 없이 끌어오기 요청/문제에 대한 기능 플래그 상태 변경 사항을 계속해서 업데이트할 수 있었습니다.
여기에서 Flagsmith 저장소를 확인하고 각 프로젝트에 별표를 표시하여 지지를 표시하는 것을 잊지 마세요. 또한 놀라운 커뮤니티에 가입하여 기술 지원을 받을 수도 있습니다.
여기 소셜 미디어에서 저 Pradumna Saraf와 소통하실 수 있습니다.
무료로 코딩을 배우세요. freeCodeCamp의 오픈 소스 커리큘럼은 40,000명 이상의 사람들이 개발자로 취업하는 데 도움을 주었습니다. 시작하세요