Feature + flag

์ž์‹ ์˜ ์•ฑ, ์„œ๋น„์Šค, ๊ธฐ๋Šฅ์— ์–ด๋–ค ๊นƒ๋ฐœ๊ฐ’์ด ๊ฝ‚ํ˜€ ์žˆ๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ์ด๊ฒƒ์„ ํ†ตํ•ด ํ”„๋กœ๋•ํŠธ์˜ ๊ธฐ๋Šฅ์„ on/off ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋ฉฐ ์ด๋ฅผ ํ†ตํ•œ ์œ ์—ฐํ•œ ๋Œ€์‘์„ ๋ชฉ์ ์œผ๋กœ ๊ฐ€์ง„ ๊ฒƒ์ด๋‹ค.

์–ด๋–ค ๊ธฐ๋Šฅ์— ํ˜„์žฌ ๋ฌด์Šจ ๊นƒ๋ฐœ์ด ๊ผฝํ˜€ ์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•œ๊ฒƒ์œผ๋กœ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ on / off ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์œ ์—ฐํ•œ ๋Œ€์‘

  • MSA, ํด๋ผ์šฐ๋“œ ๋“ฑ์˜ ๋ฐœ์ „๊ณผ ๋งž๋ฌผ๋ ค ๊นƒ๋ฐœ์„ ๊ฝ‚์•„ ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์„ ๊ณ ๊ฐ๋“ค์—๊ฒŒ ์„œ๋น™ํ•  ์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•จ
  • ์ตœ๊ทผ ๋น ๋ฅธ ๊ฐœ๋ฐœ, ์•ˆ์ •๋œ Serving์„ ์œ„ํ•ด ๋ฐœ์ „

์ตœ๊ทผ์˜ ๋™ํ–ฅ(๋น ๋ฅธ ๊ฐœ๋ฐœ)์— ๋งž์ถฐ ์šฐ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์„œ๋น™ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ, feture์— flag๋ฅผ ๊ฝ‚์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

Featureflag์˜ ๋ชฉ์  ๋ฐ ํšจ์œจ์„ฑ

  • ๊ธฐ๋Šฅ -๊ณ ๊ฐ ๊ฐ„ ์œ ์—ฐํ•˜๊ณ  ๋น ๋ฅธ ๋Œ€์‘ : MSA ํŠน์ง•๊ณผ ๋งž๋ฌผ๋ ค, ํ”„๋กœ๋•ํŠธ์˜ ์œ ์—ฐ์„ฑ/ํšจ์œจ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ณ ๊ฐ์„ ์•Œ๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ
  • on/off๋ฅผ ํ†ตํ•ด ์•ฑ์˜ ๊ฐ€์น˜๋ฅผ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ

Featureflag์˜ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ : ๊ณ ๊ฐ A, B ๊ฐ„ ๊ธฐ๋Šฅ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋ฉด ๋ณต์žก๋„๋Š” N^2 ๋งŒํผ ์ฆ๊ฐ€
  • ๊ฐ ํ”„๋กœ๋•ํŠธ/์„œ๋น„์Šค ๊ฐ„ ๋…๋ฆฝ์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ : on/off๋กœ ์ธํ•ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋„๋ก
  • ์‚ฌ์šฉ ์šฉ์ด์„ฑ๊ณผ ๋‹จ์ˆœํ•œ UI ๋ฐ ๊ธฐ๋Šฅ์„ฑ (API/SDK) : Feature๋“ค์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ UI ํ˜น์€ ํˆด
  • ๋†’์€ ์žฅ์•  ๋‚ด๊ตฌ์„ฑ (Fault Tolerant) : ์žฅ์• ๊ฐ€ ๋‚˜์ง€ ์•Š๋„๋ก

FeatureFlag ๋ ˆํผ๋Ÿฐ์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค

OpenFeature

https://openfeature.dev/docs/reference/intro

์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋กœ OpenFeature๊ฐ€ ์กด์žฌํ•œ๋‹ค.

OpenFeature๋Š” FeatureFlag์˜ ํ‘œ์ค€ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ์˜คํ”ˆ์†Œ์Šค์ด๋‹ค. ์ฆ‰, FeatureFlagging์„ ์œ„ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ตฌ์„ฑ์š”์†Œ

  • Provider : OpenFeatureFlag์˜ ๊ตฌํ˜„์ฒด
  • Evaluation : client.get*** ์—์„œ์ฒ˜๋Ÿผ key๊ฐ’ ๊ฐ€์ ธ์™€ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ

Remote Configuration ๊ณผ์˜ ์ฐจ์ด

๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์–ด๋˜ ์ˆ˜๋‹จ์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ™œ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ Remote Configuration์€ ์•ฑ/์„œ๋น„์Šค์˜ ์‹คํ–‰, ๋ฐฐํฌ, ๋นŒ๋“œ ์‹œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” Config๋ฅผ ์ค‘์•™ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ชฉ์ ์„ฑ์ด ๊ฐ•ํ•˜๋‹ค.

์ฆ‰, ์„ค์ • ๊ฐ’ ์„ ์›๊ฒฉ์—์„œ ์ค‘์•™ ์ €์ž์˜คํ•˜ ์‹œ์ผœ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์›ํ™”์‹œํ‚จ๋‹ค.

๊ฒฐ๊ตญ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • ๋†’์€ ๋Œ€์šฉ๋Ÿ‰ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ x
  • ๋ณด์•ˆ, ์ธ์ฆ/์ธ๊ฐ€์— ๋Œ€ํ•œ ์˜์—ญ์˜ ๊ณ ๋ฏผ์ด ๋” ํ•„์š”

FeatureFlag ์‚ฌ์šฉ ๊ฒฐ์ •ํ•˜๊ธฐ

์™œ ํ•„์š”ํ•œ๊ฐ€?

  • ๊ณ ๊ฐ์ด ์ถฉ๋ถ„ํ•œ๊ฐ€
  • ์„œ๋น„์Šค์˜ ๊ณ ๊ฐํŠธ๋ž˜ํ”ฝ์ด ์ถฉ๋ถ„ํ•œ๊ฐ€
  • B2C ์„œ๋น„์Šค๋กœ์„œ ๊ณ ๊ฐ์„ ์•Œ์•ผํ•  ๊ฐ€์น˜๊ฐ€ ์ถฉ๋ถ„ํ•œ๊ฐ€
  • ๋น ๋ฅธ ์†๋„๋กœ ๊ฐœ๋ฐœํ•˜๊ณ , ์ž์ฃผ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ๋ฐฐํฌํ•˜๊ณ  ์žˆ๋Š”๊ฐ€
  • ์žฅ์•  ์‹œ, Riskyํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋Š”๊ฐ€

์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€?

์„œ๋น„์Šค์™€ ๊ณ ๊ฐ ๊ฐ„ ๊ธฐ๋Šฅ์„ ์„œ๋น™ํ•˜๊ธฐ ์œ„ํ•œ Buffer ์ƒ์„ฑ

๊ธฐ๋Šฅ์˜ ์„œ๋น™์„ ํ•œ ๋‹จ๊ณ„ ์ค‘๊ฐ„์—์„œ ๋ฐ›์•„์ฃผ๋„๋ก ํ•˜์—ฌ ๋ชจ๋“  ์ƒํ™ฉ์— ์œ ์—ฐํ•œ ๋Œ€์ฒ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฅผ ํ†ตํ•ด ํฐ ๊ฐ€์น˜ ์ฐฝ์ถœ ๊ฐ€๋Šฅ

FeatureFlag ์‹ค์Šต ์š”๊ตฌ์‚ฌํ•ญํ•ญ

Featureflag Service: ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ๊ฒƒ์ด๋ฉฐ ์™ธ๋ถ€์ ์œผ๋กœ Flagd SDK๋ฅผ ์‚ฌ์šฉํ•ด ์™ธ๋ถ€ ์—”์ง„ ์‚ฌ์šฉ Flagd : ์™ธ๋ถ€์— ์กด์žฌํ•˜๋ฉด SDK๋ฅผ ํ†ตํ•ด RPC ๋ฐฉ์‹์„ ํ†ตํ•œ ํ˜ธ์ถœ

์ด๋ ‡๊ฒŒ ํ˜ธ์ถœ๋œ Flagd๋Š” Origin Flagd์—์„œ๋Š” ์–ด๋–ค Feature์— ๋Œ€ํ•œ Flag (Key-value)์— ๋Œ€ํ•œ ์›๋ณธ ์†Œ์Šค ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ  ๋‹ค์‹œ ์ด ์†Œ์Šค๋“ค์ด ๋‹จ์ˆœํ•œ ํŒŒ์ผ์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์™ธ๋ถ€์˜ Endpoint๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

Cache : SDK๋กœ ๋ฐ›์€ Key์— ๋Œ€ํ•œ Value๋ฅผ ์ €์žฅ